linux驱动(三)——自动添加和删除驱动设备文件

---恢复内容开始---html

1:咱们以前的设备文件都是使用mknod命令来手动添加的,下面咱们要解决一下设备文件的自动添加问题:linux

设备文件的自动添加须要udev,busybox中的mdev是简化版的udev;网络

https://yq.aliyun.com/articles/10546ui

http://blog.chinaunix.net/uid-29401328-id-5019678.html.net

http://blog.csdn.net/michaelcao1980/article/details/39314615unix

http://blog.csdn.net/ce123_zhouwei/article/details/6690539htm

http://7071976.blog.51cto.com/7061976/1385965blog

http://www.cnblogs.com/hnrainll/archive/2011/06/10/2077435.html开发

http://blog.csdn.net/skyflying2012/article/details/8295547编译

什么是mdev:

mdev是busybox自带的一个简化版的udev。
    做用是在系统启动和热插拔 或动态加载驱动程序时,自动产生驱动程序所需的节点文件,在文件系统中的/dev目录下的设备节点都是由mdev建立的
    mdev扫描/sys/class和/sys/block中全部的类设备目录,若是在目录中含有名为"dev"的文件,且文件中包含的是设备号,则mdev就利用这些信息为这个设备在/dev下建立设备节点

 动态更新不只是更新/dev目录,还支持热插拔,即支持接入卸下设备时执行某些动做,insmod自动建立/dev/***(class_create,class_device_create要自动建立设备必须依赖udev或mdev

mdov是根文件系统中的一个文件,属于应用层,这个程序在咱们rcS文件中执行的设置mdev -S,让它在系统启动时建立全部的设备节点。

好比:咱们看一下开发板中:

/sys/class/i2c-dev目录下:

在看一下/dev/目录下的文件:

咱们挂在根文件系统后执行rcS文件,开启了mdev,执行mdev -S命令,这个命令就会查找sys/class文件,根据下面的dev文件的主次设备号,来创建驱动设备文件,即在/dev/下创建i2c-0 i2c-1 i2c-2,这就是mdev的做用;

执行mdev -s命令时,mdev扫描/sys/block(块设备保存在/sys/block目录下,内核2.6.25版本之后,块设备也保存在/sys /class/block目录下。mdev扫描/sys/block是为了实现向后兼容)和/sys/class两个目录下的dev属性文件,从该dev 属性文件中获取到设备编号(dev属性文件以"major:minor\n"形式保存设备编号),并以包含该dev属性文件的目录名称做为设备名 device_name(即包含dev属性文件的目录称为device_name,而/sys/class和device_name之间的那部分目录称为 subsystem。也就是每一个dev属性文件所在的路径均可表示为/sys/class/subsystem/device_name/dev),在 /dev目录下建立相应的设备文件。例如,cat /sys/class/tty/tty0/dev会获得4:0,subsystem为tty,device_name为tty0。

2:mdev的启动方法:

用法:  

1. 执行mdev前要挂载 /sys如下是代码片断:    mount -t tmpfs mdev /dev   mount -t sysfs sysfs /sys 

2.命令内核在增删设备时执行/sbin/mdev,使设备节点会被建立和删除如下是代码片断:echo /sbin/mdev > /proc/sys/kernel/hotplug  

3.设置mdev,让它在系统启动时建立全部的设备节点如下是代码片断:mdev -s

这些命令都是在rcS文件中设置好的,开机挂在根文件系统之后,执行linuxrc之后会自动执行rcS文件;

 

mdev工做实际是经过uevent文件来实现的。

uevent 是“user event”的简称,是一种内核向用户空间发送信息的方式。Linux 内核的热拔插机制(hotplug)就是经过uevent 实现的。

当在总线中注册和删除一个设备或一个设备驱动程序时,会调用kobject_uevent()产生uevent。kobject_uevent()的代码在lib/kobject_uevent.c 中,

1.查找kobject 所属的kset,并得到kset 的uevent_ops若是kobj->uevent_suppress 为1,表示当前kobject 禁止产生uevent,返回0

2. 调用kset->uevent_ops->filter(),若是返回0,表示kset 禁止产生uevent,返回0

3.若是内核支持网络功能,使用netlink Socket 向用户空间广播uevent

4.若是uevent_helper 有效,则调用它。

 

udev 和mdev 是两个使用uevent 机制处理热插拔问题的用户空间程序,二者的实现机理不一样。udev 是基于netlink 机制的,它在系统启动时运行了一个deamon 程序udevd,经过监听内核发送的uevent 来执行相应的热拔插动做,包括建立/删除设备节点,加载/卸载驱动模块等等。mdev 是基于uevent_helper 机制的,它在系统启动时修改了内核中的uevnet_helper 变量(经过写/proc/sys/kernel/hotplug),值为“/sbin/mdev”。这样内核产生uevent 时会调用uevent_helper 所指的用户级程序,也就是mdev,来执行相应的热拔插动做。udev 使用的netlink 机制在有大量uevent 的场合效率高,适合用在PC 机上;而mdev 使用的uevent_helper 机制实现简单,适合用在嵌入式系统中。另外要说明的一点是,uevent_helper 的初始值在内核编译时时可配置的,默认值为/sbin/hotplug。若是想修改它的值,写/proc/sys/kernel/hotplug 文件就能够了,例如:

echo “/sbin/mdev” > /proc/sys/kernel/hotplug

 

-------------------------------------------------------------------------------------、

 未完待续继续补充关于mdev、udev、uevent的内容

 

 

 

 

 

 

 

 

 

 

 

 

 

 

---恢复内容结束---

相关文章
相关标签/搜索