linux设备驱动开发之udev用户空间设备管理

什么是udev?

这章我们来讨论一下udev这个玩意。它是什么呢?我们可以看下它的使用文档:

NAME
		// udev-动态设备的管理功能
       udev - Dynamic device management

DESCRIPTION
		// 下面是对它的描述:udev就是一个系统软件,用户态的。这个软件的功能是
		// 捕捉设备事件、管理设备模式权限、还可以在/dev文件夹下创建增加的系统链接,
		// 或者重命名网络接口
       udev supplies the system software with device events, manages permissions of device nodes and may create additional symlinks in the /dev directory, or renames network interfaces.
       // 那么上面那个创建的系统链接有啥意义吗?我们接着看下面的翻译:内核通常情况下
       // 会按照检测硬件插拔的规则来发出不可预知的设备名字。然后呢udev这个程序的功能
       // 就是创建这些检测到设备的系统链接,这个系统链接可以提供设备的属性或设备当前
       // 的配置等。 
       The kernel usually just assigns unpredictable device names based on the order of discovery. Meaningful symlinks or network device names provide a
way to reliably identify devices based on their properties or current configuration.
		// 这个udev是个后台程序,只要某个设备从系统中增加或删除或改变自身状态,那么
		// udev可以直接地从这个系统内核中接收这个因这个设备而发出的uevent事件。
       The udev daemon, systemd-udevd.service(8), receives device uevents directly from the kernel whenever a device is added or removed from the system, or it changes its state. 
		// 当udev程序接收到一个设备事件时,它就开始依靠不同设备拥有不同属性这个规则
		// 进行屁匹配设定项。配置设定项干什么呢?就是提供存储在udev数据库中增加
		// 的设备信息或者创建有意义的系统链接名称。
	   When udev receives a device event, it matches its configured set of rules against various device attributes to identify the device. Rules that match may provide additional device information to be stored in the udev database or to be used to create meaningful symlink names.
		// 有关udev软件获取的设备信息都被存储在udev数据库中,然后发送给可能的捐献者
       All device information udev processes is stored in the udev database and sent out to possible event subscribers.
		// 访问的所有存储数据以及实践资源都是被这个库“libudev”提供的。
       Access to all stored data and the event sources is provided by the library libudev.

到这里我们可以看出ude是一个用户程序,用来管理设备的。而且可以捕捉内核中设备的热插拔事件,并通过netlink套接字传出来。如果是冷插拔的设备,Linux内核提供了sysfs下面一个uevent节点,可以往该节点写一个“add”,导致内核重新发送netlink,之后udev就可以收到冷插拔的netlink消息了。

sysfs文件系统

该文件系统是一个虚拟文件系统,它可以产生一个包括所有硬件的层级视图。这个就是该文件系统的意义所在。具体来说,sysfs文件系统把连接在系统上的设备和总线组织成为一个分级的文件,它们可以由用户空间存取,向用户空间导出内核数据结构以及它们的属性。sysfs的一个目的就是展示设备驱动模型中各组件的层次关系,其顶级目录包括block、bus、dev、devices、class、fs、kernel、power和firmware等。
block目录包含所有的块设备;devices目录包含系统所有的设备,并根据设备挂接的总线类型组织成层次结构;bus目录包含系统中所有的总线类型;class目录包含系统中的设备类型(如网卡设备、声卡设备、输入设备等)。

linux设备模型

在sysfs文件系统中,在/sys/bus的pci等子目录下,又会再分出drivers和devices目录,而devices目录中的文件是对/sys/devices目录中文件的符号链接。同样地,/sys/class目录下也包含许多对/sys/devices下文件的链接。下面是linux设备模型示意图:
在这里插入图片描述
在Linux内核中,分别使用bus_type、device_driver和device来描述总线、驱动和设备,这3个结构体定义于include/linux/device.h头文件中。
device_driver和device分别表示驱动和设备,而这两者都必须依附于一种总线,因此都包含structbus_type指针。在Linux内核中,设备和驱动是分开注册的,注册1个设备的时候,并不需要驱动已经存在,而1个驱动被注册的时候,也不需要对应的设备已经被注册。设备和驱动各自涌向内核,而每个设备和驱动涌入内核的时候,都会去寻找自己的另一半,而正是bus_type的match()成员函数将两者捆绑在一起。简单地说,设备和驱动就是红尘中漂浮的男女,而bus_type的match()则是牵引红线的月老,它可以识别什么设备与什么驱动是可配对的。一旦配对成功,xxx_driver的probe()就被执行(xxx是总线名,如platform、pci、i2c、spi、usb等)。
总线、设备和驱动中的各个attribute则直接落实为sysfs中的1个文件,attribute会伴随着show()和store()这两个函数,分别用于读写该attribute对应的sysfs文件。事实上,sysfs中的目录来源于bus_type、device_driver、device,而目录中的文件则来源于attribute。

udev的组成

udev在用户空间中执行,动态建立/删除设备文件。
udev的工作过程如下:
1)当内核检测到系统中出现了新设备后,内核会通过netlink套接字发送uevent。
2)udev获取内核发送的信息,进行规则的匹配。匹配的事物包括SUBSYSTEM、ACTION、atttribute、内核提供的名称(通过KERNEL=)以及其他的环境变量。
假设在Linux系统上插入一个Kingston的U盘,我们可以通过udev的工具

udevadm monitor --kernel --property --udev 

捕获到的uevent包含的信息。

查看ttyS0的属性

udevadm info -a -p /sys/devices/platform/serial8250/tty/ttyS0

Linux 2.6以后的内核通过一系列数据结构定义了设备模型,设备模型与sysfs文件系统中的目录和文件存在一种对应关系。设备和驱动分离,并通过总线进行匹配。
udev可以利用内核通过netlink发出的uevent信息动态创建设备文件节点。

总结

这章大部分是摘抄宋宝华老师的,具体是因为,老师讲得好,而我有没有更好的个人理解,所以先记录下来。以后再完善。可以从udev程序的实现入手。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值