Linux热插拔及mdev机制
来源:互联网 发布:oracle表索引优化 编辑:程序博客网 时间:2024/05/02 04:26
1、创建设备类,是为了让mdev知道根据这些信息来创建设备节点,根据/sys来创建,所以从devfs开始,根文件系统就引入了一个/sys目录,/sys/dev下面都是内核加载的驱动的主从设备号
2、class的初始化过程(在/sys/下创建class目录):
start_kernel() -> rest_init() -> kernel_init() ->do_basic_setup() -> driver_init() -> classes_init()
3、所谓的uevent机制,就是由内核来启动一个用户进程 11.1、得到kset->uevent_ops,通过filter判断kset中的内核对象状态改变是否需要通知到用户层,返回0就不通知 11.2、如果内核对象状态变化需要通知用户层,分配环境变量空间env,并设置环境变量 11.3、内核来启动一个用户空间的程序,一般默认为这个属性文件(/proc/sys/kernel/hotplug)指定的进程,如:/sbin/mdev fd =open("/dev/console",O_RDWR); fd =open("/dev/console",O_RDWR);
4、uevent通知机制:kobject_uevent() -> kobject_uevent_env()
5、在x86系统下,用户空间一般会有udevd这个守护进程一直监听kobject_uevent通过netlink广播的uevent数据包,来获取内核的各种变化,可通过命令查看:ps-aux |grep udevd
6、调用通知用户过程:
设备端:device_add() -> kobject_uevent(&dev->kobj,KOBJ_ADD);
驱动端:driver_register() -> bus_add_driver() ->kobject_uevent(&priv->kobj, KOBJ_ADD);
设备端卸载:
device_del() -> bus_remove_device() -> bus_put() ->kset_put() -> kobject_put() -> ->kobject_release() -> kobject_cleanup() ->kobject_uevent(kobj, KOBJ_REMOVE);
device_del() -> put_device() -> kobject_put()......
驱动端卸载:
driver_unregister() -> bus_remove_driver() ->kobject_put() ......
driver_unregister() -> bus_remove_driver() -> bus_put()-> kset_put() -> kobject_put() ......
7、当内核对象kset改变时,内核会采用内核对象通知机制(kobject_uevent),通知用户层,那么用户程序必须指定一个进程给/proc/sys/kernel/hotplug,比如/sbin/mdev
8、咱们也可以替换/sbin/mdev来观察现象,但被替换的应用程序由于没有任何描述符可用,所以需要自己打开标准输入输出,如:
替换方法:echo /mnt/t > /proc/sys/kernel/hotplug
9、可以通过热插拔usb设备来观察现象,也可以通过自己写一个驱动程序,在驱动中调用kobject_uevent()向用户发送消息,但自己来实现向用户空间发送改变的状态,通过属性文件操作实现,那么佣有属性文件的kobject必须要隶属于一个kset,即要有subsystem。
应用程序测试代码(参考busybox中的mdev完成),如下:
#include //FILE
#include // O_RDWR
#include // getenv()
// debug:
// echo /mnt/t >/proc/sys/kernel/hotplug
#include
#include
// debug:
//
// hotplug operation
int
{
}
10、udev和mdev都有着相似的功能,即完成设备文件的动态创建,但实现机制略有不同,有时候也说成mdev是udev的嵌入式简化版
11、两者使是用uevent 机制处理热插拔问题的用户空间程序,uevent 是“userevent”的简称,是一种内核向用户空间发送信息的方式
12、udev 是基于netlink 机制的,它在系统启动时运行了一个daemon(守护进程)程序udevd,通过监听内核发送的uevent 来执行相应的热拔插动作
13、mdev 是基于uevent_helper 机制的,它在系统启动时修改了内核中的uevnet_helper变量(通过写/proc/sys/kernel/hotplug),这样内核产生uevent 时会调用uevent_helper所指的用户级程序,也就是mdev,来执行相应的热拔插动作,uevent_helper 的初始值在内核编译时可配置:
14、udev 使用的netlink 机制在有大量uevent 的场合效率高,适合用在PC 机上;而mdev使用的uevent_helper 机制实现简单,适合用在嵌入式系统中
0 0
- Linux热插拔及mdev机制
- Linux热插拔及mdev机制
- linux中的热插拔和mdev机制
- linux中的热插拔和mdev机制
- linux中的热插拔和mdev机制
- linux中的热插拔和mdev机制
- linux中的热插拔和mdev机制
- linux中的热插拔和mdev机制
- linux中的热插拔和mdev机制
- linux中的热插拔和mdev机制
- linux中的热插拔和mdev机制
- linux中的mdev机制
- 嵌入式linux的mdev机制
- 嵌入式linux的mdev机制
- 嵌入式linux的mdev机制
- Linux热插拔hotplug 与mdev 和udev机制
- 嵌入式linux之mdev机制分析
- Linux设备管理文件系统,mdev,热插拔
- 设计模式(9.1)--迭代器与组合模式
- ARM 虚拟化扩展技术简介
- mybatis实战教程(mybatis in action),mybatis入门到精通
- 美国一女子被绑架十年后获救
- mysql导入数据时提示 USING BTREE 错误解决办法
- Linux热插拔及mdev机制
- MAC环境下配置GCC编译环境
- 转载: C\C++代码优化的27个建议
- Dictionary Learning Tools for Matlab.
- 搭建strom开发环境
- 程序工作--关注产品性能而不仅是功能
- android APP 程序员可操作的初始化顺序
- MySQL索引背后的数据结构及算法原理
- Given two binary trees, write a function to check if they are equal or not.