发布网友 发布时间:2024-10-05 15:16
共1个回答
热心网友 时间:2024-10-05 15:20
当新设备连接至系统时,kernel会检测并触发hotplug事件,寻找/proc/sys/kernel/hotplug来识别管理设备连接的用户空间程序。udev作为这个事件处理器的初始化脚本注册。当设备连接事件发生,kernel会通知udev检查新设备的/sys信息,从而在/dev中创建相应的设备节点。
然而,udev在设备节点创建方面遇到了类似“先有鸡还是先有蛋”的问题。传统的Linux发行版通常通过/etc/modules.conf.access来关联设备节点和kernel模块,但这不适用于udev,因为模块未加载时设备节点不存在。为解决这个问题,模块脚本被添加到lfs-bootscripts包中,与/etc/sysconfig/modules配合,通过在module文件中列出模块名,确保模块在系统启动时被加载,从而让udev能够处理设备并创建节点。
对于可热插拔设备,例如USB MP3播放器,当设备插入时,kernel会识别并引发hotplug事件。如果驱动已加载,udev会根据/sys中的sysfs数据创建设备节点。如果驱动以模块形式存在但未加载,设备仅会触发kernel总线驱动的hotplug事件,但无法被驱动,导致设备无法使用。在这种大规模模块驱动的系统中,hotplug包的价值就显得尤为重要,它会响应kernel总线驱动的事件,自动加载并创建设备节点。
在自动创建设备节点时,可能会遇到一些问题。例如,某些kernel驱动可能没有将数据暴露到sysfs,这时需要使用/etc/sysconfig/creatfiles手动创建节点。查阅kernel文档或驱动文档,找到正确的major/minor设备号。另外,一些模块可能需要其他模块作为依赖,如ALSA的oss兼容模块,可以通过在/etc/modprobe.conf中使用"install"行来设置模块加载顺序,如install snd-pcm;modprobe -i snd-pcm;modprobe snd-pcm-oss;true。
udev 是Linux kernel 2.6系列的设备管理器。它主要的功能是管理/dev目录底下的设备节点。它同时也是用来接替devfs及hotplug的功能,这意味着它要在添加/删除硬件时处理/dev目录以及所有用户空间的行为,包括加载firmware时。udev的最新版本依赖于升级后的Linux kernel 2.6.13的uevent接口的最新版本。使用新版本udev的系统不能在2.6.13以下版本启动,除非使用noudev参数来禁用udev并使用传统的/dev来进行设备读取。