udev

 

一)udev

1)udev与硬件平台无关,属于用户空间的进程,它脱离驱动层的关联,而建立在操作系统之上,只要修改配置文件使之生效,无需重启操作系统.
2)udev需要内核sysfs和tmpfs的支持
3)udev已经取代devfs和hotplus,udev通过netlink直接监听这些事件.
注:
这里的hotplus主要负责在线和脱机情况下为硬件定位和安装驱动程序模块.
在早期的发行中常使用一个外部二进制文件/sbin/hotplug来将设备状态的改变通知Udev.

 

二)sysfs

1)sysfs是一个建立在内存基础上的文件系统.它建立在内核对象kobjects的基础上,而kobjects是内核2.6新添加的功能.
2)sysfs是包含一系列不同层次的小文件,每一个小文件包含的信息极少.


三)设备节点插入移出的工作流程:

1)当设备插入或移出系统的时候,kernel会向udev守护进程发送事件中的参数和sysfs中的信息.
2)udev守护进程加载适当的驱动程序,并创建/dev/目录下的结点.
3)udev通过根据/etc/udev/rules.d下的规则,把事件发送给HAL.
注:HAL位于操作系统和驱动程序之上,是一个运行于用户空间的服务程序.
4)HAL创建关于这个设备的XML描述.
5)通过Dbus通知相应的应用程序.比如:Natuilus.
注:Dbus类似于系统总线,主要用于进程间通信.


四)创建自定义的udev规则


1)测试nvram,这个nvram模块在rules.d中有定义,nvram被划分为其它杂项

加载nvram模块
modprobe nvram

查看/dev/nvram设备节点
ls -l /dev/nvram
crw-rw---- 1 root root 10, 144 2010-01-31 04:56 /dev/nvram

卸载nvram模块
rmmod nvram

查看/dev/nvram设备节点
ls -l /dev/nvram
ls: cannot access /dev/nvram: No such file or directory

 

2)新增加一个自定义的规则,规则文件名格式:
数字-自定义模块名.rules
注:
数字代表优先级,数字越小,优先级就越高.优先级高的规则先执行,忽略同名的其它名字,但不忽略链接.


cat << EOF > /etc/udev/rules.d/25-cmos.rules
> KERNEL=="nvram", MODE="0660", NAME="cmos"
> EOF

加载nvram模块
modprobe nvram

查看/dev/cmos设备节点
ls -l /dev/cmos
crw-rw---- 1 root root 10, 144 2010-01-31 05:13 /dev/cmos

注:
KERNEL域会让udev端口监听程序去匹配内核模式名nvram.
MODE域代表产生设备节点的权限.
NAME域代表产生设备节点的名字.


五)udev的测试与工具

1)udev守护进程的测试

卸掉nvram模块
rmmod nvram

停掉udev监听程序
/etc/init.d/udev stop

modprobe nvram

ls -l /dev/cmos
ls: cannot access /dev/cmos: No such file or directory

启动udev监听程序
/etc/init.d/udev start

ls -l /dev/cmos
crw-rw---- 1 root root 10, 144 2010-01-31 05:34 /dev/cmos

查看udev打开的socket端口
netstat -anp|grep udev
unix  2      [ ]         DGRAM                    14276    4384/udevd          @/org/kernel/udev/udevd

 

 

 

man udevadm


2)查询udev

查询所有的设备节点和显示udev信息
udevadm info --export-db


查看名为cmos的udev信息.
udevinfo --query=all --name=cmos
P: /devices/virtual/misc/nvram
N: cmos


3)监听udev

终端1)
udevadm monitor


终端2)
rmmod nvram
modprobe nvram


终端1)
UEVENT[1264934453.475726] remove   /devices/virtual/misc/nvram (misc)
UEVENT[1264934453.476732] remove   /module/nvram (module)
UEVENT[1264934461.563268] add      /module/nvram (module)
UEVENT[1264934461.563418] add      /devices/virtual/misc/nvram (misc)


终端2)
ls /sys/devices/virtual/misc/nvram/
dev        power/     subsystem/ uevent

cat /sys/devices/virtual/misc/nvram/dev
10:144

cat /sys/module/nvram/sections/.bss
0xe0a83ca0

 

4)调试udev


先停掉udev服务
/etc/init.d/udev stop

终端1)
打开udevd监听
udevd --debug

终端2)
卸载nvram
rmmod nvram

终端1)
[4488] msg_queue_insert: seq 2364 queued, 'remove' 'misc'
[4488] udev_event_run: seq 2364 forked, pid [4492], 'remove' 'misc', 0 seconds old
[4488] msg_queue_insert: seq 2365 queued, 'remove' 'module'
[4488] udev_event_run: seq 2365 forked, pid [4493], 'remove' 'module', 0 seconds old
[4492] udev_db_get_device: found a symlink as db file
[4492] name_index: removing index: '/dev/.udev/names/cmos/\x2fdevices\x2fvirtual\x2fmisc\x2fnvram'
[4492] match_rule: '/lib/udev/devices/cmos' does not exist
[4492] udev_node_remove: removing device node '/dev/cmos'
[4492] pass_env_to_socket: passed -1 bytes to socket '@/org/kernel/udev/monitor',
[4492] udev_event_run: seq 2364 finished with 0
[4488] udev_done: seq 2364, pid [4492] exit with 0, 0 seconds old
[4493] pass_env_to_socket: passed -1 bytes to socket '@/org/kernel/udev/monitor',
[4493] udev_event_run: seq 2365 finished with 0
[4488] udev_done: seq 2365, pid [4493] exit with 0, 0 seconds old

终端2)
加载nvram
modprobe nvram

终端1)
[4494] msg_queue_insert: seq 2366 queued, 'add' 'module'
[4494] udev_event_run: seq 2366 forked, pid [4497], 'add' 'module', 0 seconds old
[4494] msg_queue_insert: seq 2367 queued, 'add' 'misc'
[4494] udev_event_run: seq 2367 forked, pid [4498], 'add' 'misc', 0 seconds old
[4497] pass_env_to_socket: passed -1 bytes to socket '@/org/kernel/udev/monitor',
[4497] udev_event_run: seq 2366 finished with 0
[4494] udev_done: seq 2366, pid [4497] exit with 0, 0 seconds old
[4498] udev_rules_get_name: rule applied, 'nvram' becomes 'cmos'
[4498] udev_db_get_device: no db file to read /dev/.udev/db/\x2fdevices\x2fvirtual\x2fmisc\x2fnvram: No such file or directory
[4498] udev_node_add: creating device node '/dev/cmos', major=10, minor=144, mode=0660, uid=0, gid=0
[4498] udev_node_mknod: mknod(/dev/cmos, 020660, (10,144))
[4498] udev_node_mknod: chmod(/dev/cmos, 020660)
[4498] udev_node_mknod: chown(/dev/cmos, 0, 0)
[4498] name_index: creating index: '/dev/.udev/names/cmos/\x2fdevices\x2fvirtual\x2fmisc\x2fnvram'
[4498] pass_env_to_socket: passed -1 bytes to socket '@/org/kernel/udev/monitor',
[4498] udev_event_run: seq 2367 finished with 0
[4494] udev_done: seq 2367, pid [4498] exit with 0, 0 seconds old

posted @ 2012-11-02 13:01  interrupt  阅读(471)  评论(0)    收藏  举报