文章目录
第2章 Linux内核设备管理方式
2.1 devfs设备文件系统
2.2 sysfs文件系统
sysfs虚拟文件系统将系统中的设备组织成层次结构,可解决智能电源管理和设备分类的需求。它向用户模式程序提供详细的内核数据结构信息,提供接口给用户空间对驱动和设备进行配置,实现与用户空间的通信,用户甚至可以通过echo、cat 等命令来直接操作设备的属性文件。
sysfs挂载于/sys目录下。sys目录情况如下所示:
sys目录下的文件反映了整个系统的情况。真正的设备信息放在devices下,classes和bus下的设备对应的是devices目录下设备文件的符号链接。
2.3 udev设备文件系统
用户空间的udev利用sysfs提供的信息实现所有devfs(运行在内核空间)的功能,udev能够根据系统中设备的状况动态更新设备文件,不看创建,删除设备文件等等。udev结合sysfs才能实现设备的热插拔功能。
udev中,namedev为设备命名子系统,为发现的设备提供默认命名规则,libsysfs是访问sysfs文件系统并从中获取设备信息的标准接口,udev是两者的桥梁,利用获取的信息完成设备节点文件的动态创建和删除。
2.4 主要数据结构
2.4.1 kobject
kobject主要包括对象引用计数、维护对象链表、对象上锁和在用户空间的表示4种功能。在用户空间的表示,主要是通过sysfs实现,每个在内核注册的kobject对象对应于sysfs文件系统中的一个目录,这些功能主要通过它对应结构体所包含的对象来完成。
kobject定义于文件linux/kobject.h中,结构体定义如下:
主要函数有:
2.4.2 ktype
kobj_type是指具有相同操作的kobject集合,它负责管理这一类kobject在sysfs下的操作。主要是实现show和store。此结构体定义在include/linux/kobject.h
定义如下:
2.4.3 kset
kset是kobject的集合。kset中的kobject可以拥有相同的ktype,也可以各自属于自己的ktype。kset最重要的是建立上层和下层的关联性。
kset数据结构
主要函数:
2.4.4 三者关系
2.5 热插拔设备管理机制
2.5.1 热插拔事件流程
2.5.2 涉及的模块
热插拔事件中主要涉及3个模块hotplug .netlink及udev。
netlink是Linux特有的socket。系统常使用netlink进行内核与用户之间的进行双向数据传输,用户态使用标准的socket API,内核态需使用专门的内核API。netlink是一种异步通信机制,消息保存在socket缓存队列中,netlink的内核部分可以使用模块实现。