第二章:Udev硬件设备管理机制
2.00 本章内容简介:
·理解Linux中的Udev是如何管理硬件设备;
·学习如何为自定义设备名编写udev规则;
2.01 Udev的功能:
在Linux系统中,内核的主要功能可以分为5大部分:文件系统、内存调度、进程调度、协议管理、硬件管理。其中的硬件管理就是由Udev提供的。
系统中的/dev目录是一个包含了大量设备条目的目录,通过Udev来对设备进行管理,给设备提供对应的名称空间,为设备命名,应用程序可以查询设备是否存在以及设备的名称等。它同时也是用来接替devfs及hotplug的功能,这意味着它要在添加/删除硬件时处理/dev目录以及所有用户空间的行为。Udev遵从LSB(Linux Standard Based)的标准,但也支持用户自定义的规则。很重要的一点,Udev是一个极其小而精的程序,所以嵌入式设备上常常使用它。
2.02 HAL硬件抽象层:
HAL(Hardware Abstraction Layer)硬件抽象层是一个为设备服务的程序,应用程序需要了解任何硬件设备信息或底层架构,只需要跟HAL索取相应的设备信息即可,简单点说,硬件抽象层就是介于硬件层和应用层之间一个起着桥梁作用的逻辑层服务。
HAL为每一个物理上接入到计算机的设备加入到一个实时数据库中,为每个设备对象提供了一个API去使用D-bus(system message bus)系统总线,应用程序可以使用API在设备上进行发现、监控、调用等操作。系统中会有一个hald的服务,他便是HAL的服务,但内核发现新设备时,hald将通告应用程序进行识别。可以使用hal-device-manager来查看存储在HAL中的设备信息,在view菜单下,选择Device Properties可以查看该设备的详细信息。
HAL管理的设备信息是以文件的形式存在,其配置文件存放在/usr/share/hal/fdi/下,用户管理配置文件存放在/etc/hal/fdi/下,且数据文件都是以.fdi为后缀的。在设备信息文件里面有3个部分:Information、Policy、Preprobe。分别包含了设备信息、策略和设备配置信息。
可以通过查看/usr/share/doc/hal-version/spec文档来了解HAL更多的信息。
2.03 插入设备发生的事件:
1.当一个设备插入到计算机,系统内核检测到插入的设备,并将设备的信息写入到/sys中。Sysfs是一个内核级别的保持追踪所有设备的设备虚拟文件系统,在系统中挂载为/sys。
2.通过netlink socket(一个在内核和用户空间之间传送信息的方便的无连接的Socket),系统内核通知udev该事件。
3.此时,udev将读取在/etc/udev/rule.d/中的一系列udev规则文件,在通知HAL之前,为设备创建设备文件或运行一段程序。在90-hal.rules规则中的RUN+="socket:/org/freedesktop/hal/udev_event"即是执行socket通知HAL该设备事件。Udev的事件可以使用udevmonitor --eny来进行监控。
4.当HAL接到该设备事件的通知,HAL便开始通过多个渠道获取设备相关信息,如内核、配置文件、硬件信息数据库等。
5.hald服务之后再D-BUS上广播该设备事件,让用户空间的程序接收调用。
以上便是设备插入到系统中,整个系统的硬件管理机制的工作流程,熟悉了硬件管理规则,有利于以后在项目中解决各类奇怪的突发问题,也有利于以后的学习。
2.04 Udev机制:
当一个设备从系统中添加/删除时,系统内核会发送一个信息到udevd且会将信息展示在/sys中。Udev之后会在/sys中查询设备信息,根据udev的相关定义规则来决定创建设备节点或创建symlink链接。
Sysfs是udev用来在系统中查询所有设备相关属性的,如location、name、serial number、major/minor number、vendor/product IDs等等。
通过udev规则可以对各类设备进行自定义的设置,可以自定义设备名,可以为某设备创建symlink,可以为某设备设置某属性等等。可以使用udevmonitor工具来进行监控udev的事件,--env参数可以显示详细信息。
2.05 配置udev:
所有的udev配置文件存放在/etc/udev目录下,配置文件是由一行行的配置信息组成的,#号表示注销该行配置。
/etc/udev/udev.conf是udev的全局配置文件,其中有几个重要参数项,udev_root表示创建的设备文件存放在哪里,默认是/dev;udev_rules表示udev规则存放在哪里,默认是/etc/udev/rules.d/;udev_log设置udev的日志级别,默认级别是err,在运行udev进行debug时,可以使用命令临时改变日志级别“udevcontrol log_priority=debug”,日志级别分为err,info,debug三类。
2.06 Udev规则: