首页 > 系统相关 >从Linux内核设计者的角度看 - 设备驱动的架构设计

从Linux内核设计者的角度看 - 设备驱动的架构设计

时间:2024-06-17 17:23:18浏览次数:30  
标签:架构设计 led struct int 总线 dev 内核 Linux device

Linux中的设备驱动概念中的设备和驱动指的是啥?

  直接说设备驱动其实是比较抽象的,举个例子就特别明了了,比如我们要控制1个led的亮灭,那么led就是设备,控制led运行的软件就是该设备的驱动。也就是说,这里的设备就是现实中的一个电子设备,设备驱动就是控制这个电子设备运行的软件程序。

在现实生活中,有成千上万种电子设备,Linux要做到所有设备的兼容运行,就需要一套行之有效的设备驱动架构,那么,Linux是如何做的呢?

Linux的设备驱动架构叫做 总线-设备-驱动模型。无论什么电子设备,都需要通过某种总线让cpu访问才能进行控制,总线的类型是有限的,因此,Linux设计了一套以总线为核心的设备驱动架构。

Linux首先将总线进行了抽象 -- struct bus_type ,这样就可以用它来设计各种各样的总线了,最常见的就是i2c和spi总线了,这俩都是外设总线,其实还有一个特殊的总线叫做平台总线(platform bus),对应的设备叫平台设备,还是以之前的led为例,要想操作led,实质上需要操作的是led连在芯片上的gpio口,而gpio是由芯片里面的gpio控制器所控制的,也就是说,led的控制需要2个驱动,1个是gpio控制器的驱动,1个是led的驱动,led和gpio控制器通过gpio连接,gpio就可以看作是一种总线;那gpio控制器是如何控制的,。

struct bus_type {
	const char		*name;
	const char		*dev_name;
	struct device		*dev_root;
	const struct attribute_group **bus_groups;
	const struct attribute_group **dev_groups;
	const struct attribute_group **drv_groups;

	int (*match)(struct device *dev, struct device_driver *drv);
	int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
	int (*probe)(struct device *dev);
	void (*sync_state)(struct device *dev);
	void (*remove)(struct device *dev);
	void (*shutdown)(struct device *dev);

	int (*online)(struct device *dev);
	int (*offline)(struct device *dev);

	int (*suspend)(struct device *dev, pm_message_t state);
	int (*resume)(struct device *dev);

	int (*num_vf)(struct device *dev);

	int (*dma_configure)(struct device *dev);

	const struct dev_pm_ops *pm;

	const struct iommu_ops *iommu_ops;

	struct subsys_private *p;
	struct lock_class_key lock_key;

	bool need_parent_lock;

};

 

标签:架构设计,led,struct,int,总线,dev,内核,Linux,device
From: https://www.cnblogs.com/riveruns/p/18252821

相关文章

  • Linux 提权-Capabilities
    本文通过Google翻译Capabilities–LinuxPrivilegeEscalation-Juggernaut-Sec这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充。导航0前言1什么是Capabilities?2枚举Capabilities2.1枚举Capabilities-手动方法2.1.......
  • Linux上java-jar Spingboot项目
    百度的,后面再补一个Linux文档操作手册,是不是很大胆?准备工作1、首先得有两个软件Xftp(用来上传文件到)和XShell(连接服务器执行命令)2、Linux上有JDK(怎么安装可以转到Linux安装JDK流程)3、项目的JAR包项目jar包导jar<build><plugins><plugin><groupId......
  • 小白Linux提权
     1.脏牛提权原因:内存子系统处理写入复制时,发生内存条件竞争,任务执行顺序异常,可导致应用崩溃,进一步执行其他代码。get_user_page内核函数在处理Copy-on-Write(以下使用COW表示)的过程中,可能产出竞态条件造成COW过程被破坏,导致出现写数据到进程地址空间内只读内存区域的机会......
  • 【linux】使用 `du` 命令查看各个目录的大小,并按大小排序
    使用du命令查看各个目录的大小,并按大小排序,可以按照以下步骤操作:1.打开终端按Command+Space调出Spotlight搜索,然后输入Terminal并打开它。2.使用du命令查看目录大小使用以下命令查看当前目录下一级子目录的大小,并以人类可读的形式显示(即使用-h选项):du-......
  • 步进电机Linux驱动
    本文将介绍步进电机Linux驱动程序,分为以三部分:步进电机介绍,硬件原理图以及程序编写1步进电机介绍步进电机是一种将电脉冲信号转变为角位移或者线位移的开环控制元件,在非超载的状态下,电机的转速、停止位置只取决于脉冲信号的频率和脉冲数,不受负载变化的影响,并且只有周期性误差而......
  • arm linux 启动
    bootloader是系统启动或复位以后执行的第一段代码,它主要用来初始化处理器及外设,然后调用Linux内核//Bootloader在运行过程中虽然具有初始化系统和执行用户输入的命令等作用,但它最根本的功能就是为了启动Linux内核Linux内核在完成系统的初始化之后根据启动参数中指定的roo......
  • linux或者CentOS环境下安装.NET Core环境
    一、下载注册Microsoft密钥:在安装之前,需要:1、注册Microsoft密钥2、注册产品资料库3、安装所需的依赖项打开终端并输入命令:sudorpm-Uvhhttps://packages.microsoft.com/config/centos/8/packages-microsoft-prod.rpm安装效果如下图所示:安装期间会提示用户验证,输......
  • 9、ansible-Ad-Hoc-点对点模式--m shell-shell模块(执行的就是linux命令)
    作用:可以执行任何有效的shell命令,包括管道、重定向和其他shell特性。该模块将在远程主机上启动一个shell,然后在该shell中执行命令。执行结果可以作为任务的输出返回,也可以将其保存到文件或变量中供后续任务使用。请注意,与其他模块相比,shell模块的执行效率较低,因为它需要在......
  • 在Linux中,什么是运维?什么是游戏运维?
    在Linux中,运维和游戏运维是两种不同的运维角色,但它们都涉及到对系统、网络和应用程序的管理、维护和优化。以下是对它们的详细解释:一、运维运维(OperationandMaintenance),通常指互联网运维,是技术部门中的一个重要组成部分,与研发、测试、系统管理共同构成互联网产品技术支撑的四......
  • Linux-grep
    Linux-grepgrep功能:擅长过滤2.2参数:-n ------显示行号-v ------取反,排除 -i ------不区分大小写-w ------根据单词进行过滤(两边有空格特殊符号)grep==egrep或grep-E;是否支持扩展正则| -----或者-o -----显示执行过程,显示出grep匹配的内容 -E -----可以使用扩展正......