Linux内核热插拔与mdev机制解析

需积分: 0 11 下载量 167 浏览量 更新于2024-09-08 收藏 4KB TXT 举报
"本文主要探讨Linux系统中的热插拔机制以及mdev的工作原理,涉及到内核与用户空间的通信、设备管理和驱动注册等关键概念。" 在Linux操作系统中,热插拔(Hot Plug)是指在系统运行时添加或移除硬件设备的能力,这允许用户在不重启计算机的情况下扩展或更换设备。为了实现这一功能,Linux内核提供了一套复杂的框架,其中包括mdev(Managed Device)机制。mdev是一种轻量级的设备模型,用于处理热插拔事件,它简化了用户空间对新插入设备的通知和管理。 在Linux内核启动过程中,一系列初始化函数被调用,包括`start_kernel()`、`rest_init()`、`kernel_init()`、`do_basic_setup()`、`driver_init()`以及`classes_init()`。其中,`classes_init()`负责初始化设备类,创建 `/sys/class` 目录,这个目录下的各个子目录代表了不同的设备类别,如网络设备、声卡等。`driver_init()`则用于注册设备驱动,使得内核能够识别和管理硬件设备。 当设备状态发生变化时,内核会通过uevent(User-space Event)机制通知用户空间。uevent是内核与用户空间进行异步通信的一种方式,它通过netlink套接字发送消息。具体流程如下: 1. 设备状态改变触发kset(设备集合)的`uevent_ops->filter`函数检查,判断是否需要发送uevent事件。 2. 如果需要,uevent会填充环境变量,并调用`kobject_uevent_env()`发送uevent事件。 3. 通常,uevent事件会通过`/proc/sys/kernel/hotplug`配置的路径(默认是`/sbin/mdev`)或者udevd服务进行处理。在x86系统中,如果没有配置mdev,udevd服务会监听并处理这些事件。 4. 设备的添加或删除操作(如`device_add()`、`device_del()`)会触发`kobject_uevent()`,分别发送KOBJ_ADD和KOBJ_REMOVE事件,通知用户空间设备的增减情况。 mdev服务会在收到KOBJ_ADD事件时创建相应的设备节点,并在KOBJ_REMOVE事件时删除对应的设备节点,实现了设备的动态管理。如果`/proc/sys/kernel/hotplug`路径配置了/sbin/mdev,那么系统将使用mdev来处理uevent,否则可能需要手动启动udevd服务来处理设备事件。 总结来说,Linux热插拔机制结合mdev服务,提供了高效、灵活的设备管理能力,确保了系统在硬件变化时的稳定性。理解这个机制对于Linux系统的维护和设备驱动开发至关重要,因为它允许开发者和用户在不停机的情况下对系统进行扩展和维护。
2009-12-24 上传
将可移动设备连入系统时,系统的后台中会依次发生如下事件: l 内核检测到新硬件插入,然后分别通知hotplug和udev。前者用来装入相应的内核模块(如usb-storage),而后者用来在/dev中创建相应的设备节点(如/dev/sda1)。 l udev创建了相应的设备节点之后,会将这一消息通知hal的守护程序(hald)。当然udev还得保证新创建的设备节点可以被普通用户访问。 l hotplug装入了相应的内核模块之后,会把这一消息通知给hald。 l hald在受到hotplug和udev发出的消息之后,认为新硬件已经正式被系统认可了。此时它会通过一系列精心编写的规则文件(就是传说中的xxx-policy.fdi),把发现新硬件的消息通过dbus发送出去,同时还会调用update-fstab或fstab-sync来更新/etc/fstab,为相应的设备节点创建适合的挂载点。 l 卷管理器会监听dbus中发现新硬件的消息。根据所插入的硬件(区分U盘和数码相机等)不同,卷管理器会先将相应的设备节点挂载到hald创建的挂载点上,然后再打开不同的应用程序。 当然,如果是在CDROM中插入光盘,过程可能比较简单。因为CDROM本身就是一个固定的硬件,无需hotplug和udev的协助: l hald会自己监视CDROM,并且将光盘托架开合的消息通过dbus发出去。 l 卷管理器负责检查CDROM中的盘片内容,进行挂载,并调用合适的应用程序。 要注意,hald的工作是从上游得到硬件就绪的消息,然后将这个消息转发到dbus中。尽管它会调用程序来更新fstab,但实际上它自己并不执行挂载的工作。