Linux热插拔及mdev机制

简介: Linux热插拔及mdev机制

理解如下:

1、创建设备类,是为了让mdev知道根据这些信息来创建设备节点,根据/sys来创建,所以从devfs开始,根文件系统就引入了一个/sys目录,/sys/dev下面都是内核加载的驱动的主从设备号

2、class的初始化过程(在/sys/下创建class目录):

start_kernel() -> 
rest_init() -> 
kernel_init() -> 
do_basic_setup() -> 
driver_init() -> 
classes_init()

_
Linux热插拔及mdev机制
3、所谓的uevent机制,就是由内核来启动一个用户进程

4、uevent通知机制:kobject_uevent() -> kobject_uevent_env()

4.1、得到kset->uevent_ops,通过filter判断kset中的内核对象状态改变是否需要通知到用户层,返回0就不通知

4.2、如果内核对象状态变化需要通知用户层,分配环境变量空间env,并设置环境变量

4.3、内核来启动一个用户空间的程序,一般默认为这个属性文件(/proc/sys/kernel/hotplug)指定的进程,如:/sbin/mdev

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来观察现象,但被替换的应用程序由于没有任何描述符可用,所以需要自己打开标准输入输出,如:

 fd = open("/dev/console",O_RDWR);
 fd = open("/dev/console",O_RDWR);

替换方法: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
// hotplug operation
int main(int argc, char *argv[])
{
int i;
int fd;
char *env[6];
char *pname[] = {"ACTION","DEVNAME","DEVPATH","SUBSYSTEM","FIRMWARE","SEQNUM"};
fd = open("/dev/console",O_RDWR);
fd = open("/dev/console",O_RDWR);
printf("n");
for(i=0;i<argc;i++)
printf("argv[%d] = %sn",i,argv[i]);
printf("n");

env[0] = getenv("ACTION");
env[1] = getenv("DEVNAME");
env[2] = getenv("DEVPATH");
env[3] = getenv("SUBSYSTEM");
env[4] = getenv("FIRMWARE");
env[5] = getenv("SEQNUM");
for(i=0;i<6;i++)
if(env[i] != NULL)
printf("%s = %sn",pname[i],env[i]);

close(0);
close(1);
return 0;
}
10、udev和mdev都有着相似的功能,即完成设备文件的动态创建,但实现机制略有不同,有时候也说成mdev是udev的嵌入式简化版

11、两者使是用uevent 机制处理热插拔问题的用户空间程序,uevent 是“user event”的简称,是一种内核向用户空间发送信息的方式

12、udev 是基于netlink 机制的,它在系统启动时运行了一个daemon (守护进程)程序udevd,通过监听内核发送的uevent 来执行相应的热拔插动作

13、mdev 是基于uevent_helper 机制的,它在系统启动时修改了内核中的uevnet_helper 变量(通过写/proc/sys/kernel/hotplug),这样内核产生uevent 时会调用uevent_helper 所指的用户级程序,也就是mdev,来执行相应的热拔插动作,uevent_helper 的初始值在内核编译时可配置:

 -> Device Drivers 
 -> Generic Driver Options
 (/proc/sys/kernel/hotplug) path to uevent helper 

14、udev 使用的netlink 机制在有大量uevent 的场合效率高,适合用在PC 机上;而mdev 使用的uevent_helper 机制实现简单,适合用在嵌入式系统中

相关文章
|
23天前
|
缓存 Linux 开发者
Linux内核中的并发控制机制
本文深入探讨了Linux操作系统中用于管理多线程和进程的并发控制的关键技术,包括原子操作、锁机制、自旋锁、互斥量以及信号量。通过详细分析这些技术的原理和应用,旨在为读者提供一个关于如何有效利用Linux内核提供的并发控制工具以优化系统性能和稳定性的综合视角。
|
7天前
|
监控 算法 Linux
Linux内核锁机制深度剖析与实践优化####
本文作为一篇技术性文章,深入探讨了Linux操作系统内核中锁机制的工作原理、类型及其在并发控制中的应用,旨在为开发者提供关于如何有效利用这些工具来提升系统性能和稳定性的见解。不同于常规摘要的概述性质,本文将直接通过具体案例分析,展示在不同场景下选择合适的锁策略对于解决竞争条件、死锁问题的重要性,以及如何根据实际需求调整锁的粒度以达到最佳效果,为读者呈现一份实用性强的实践指南。 ####
|
11天前
|
消息中间件 安全 Linux
深入探索Linux操作系统的内核机制
本文旨在为读者提供一个关于Linux操作系统内核机制的全面解析。通过探讨Linux内核的设计哲学、核心组件、以及其如何高效地管理硬件资源和系统操作,本文揭示了Linux之所以成为众多开发者和组织首选操作系统的原因。不同于常规摘要,此处我们不涉及具体代码或技术细节,而是从宏观的角度审视Linux内核的架构和功能,为对Linux感兴趣的读者提供一个高层次的理解框架。
|
18天前
|
算法 Linux 开发者
Linux内核中的锁机制:保障并发控制的艺术####
本文深入探讨了Linux操作系统内核中实现的多种锁机制,包括自旋锁、互斥锁、读写锁等,旨在揭示这些同步原语如何高效地解决资源竞争问题,保证系统的稳定性和性能。通过分析不同锁机制的工作原理及应用场景,本文为开发者提供了在高并发环境下进行有效并发控制的实用指南。 ####
|
26天前
|
缓存 Linux 开发者
Linux内核中的并发控制机制:深入理解与应用####
【10月更文挑战第21天】 本文旨在为读者提供一个全面的指南,探讨Linux操作系统中用于实现多线程和进程间同步的关键技术——并发控制机制。通过剖析互斥锁、自旋锁、读写锁等核心概念及其在实际场景中的应用,本文将帮助开发者更好地理解和运用这些工具来构建高效且稳定的应用程序。 ####
39 5
|
29天前
|
Linux 数据库
Linux内核中的锁机制:保障并发操作的数据一致性####
【10月更文挑战第29天】 在多线程编程中,确保数据一致性和防止竞争条件是至关重要的。本文将深入探讨Linux操作系统中实现的几种关键锁机制,包括自旋锁、互斥锁和读写锁等。通过分析这些锁的设计原理和使用场景,帮助读者理解如何在实际应用中选择合适的锁机制以优化系统性能和稳定性。 ####
50 6
|
1月前
|
消息中间件 存储 Linux
|
19天前
|
安全 Linux 数据安全/隐私保护
深入探索Linux操作系统的多用户管理机制
【10月更文挑战第21天】 本文将详细解析Linux操作系统中的多用户管理机制,包括用户账户的创建与管理、权限控制以及用户组的概念和应用。通过具体实例和命令操作,帮助读者理解并掌握Linux在多用户环境下如何实现有效的资源分配和安全管理。
|
7月前
|
存储 Linux C语言
Linux:冯·诺依曼结构 & OS管理机制
Linux:冯·诺依曼结构 & OS管理机制
175 0
|
4月前
|
存储 缓存 编译器
Linux源码阅读笔记06-RCU机制和内存优化屏障
Linux源码阅读笔记06-RCU机制和内存优化屏障