文章目录
一、前言
之前学习字符设备驱动开发时,提到调用class_device_create函数会为设备创建一个设备节点文件(/dev/xxx)。那么这个创建的过程是怎样的呢?在这里便来简单分析一下。涉及的知识点主要有uevent机制、Sysfs文件系统、mdev程序的调用和实现(创建设备节点文件)。
二、uevent机制
Uevent是Kobject的一部分,用于在Kobject状态发生改变时,例如增加、移除等,通知用户空间程序。用户空间程序收到这样的事件后,会做相应的处理。
该机制通常是用来支持热拔插设备的,例如U盘插入后,USB相关的驱动软件会动态创建用于表示该U盘的device结构(相应的也包括其中的kobject),并告知用户空间程序,为该U盘动态的创建/dev/目录下的设备节点,更进一步,可以通知其它的应用程序,将该U盘设备mount到系统中,从而动态的支持该设备。
2.1 Sysfs文件系统
简单的说,sysfs是一个基于内存的文件系统,它的作用是将内核信息以文件的方式提供给用户程序使用。
sysfs可以看成与proc,devfs和devpty同类别的文件系统,该文件系统是虚拟的文件系统,可以更方便对系统设备进行管理。它可以产生一个包含所有系统硬件层次视图,与提供进程和状态信息的proc文件系统十分类似。
sysfs把连接在系统上的设备和总线组织成为一个分级的文件,它们可以由用户空间存取,向用户空间导出内核的数据结构以及它们的属性。sysfs的一个目的就是展示设备驱动模型中各组件的层次关系,其顶级目录包括block,bus,drivers,class,power和firmware等.
sysfs提供一种机制,使得可以显式的描述内核对象、对象属性及对象间关系。sysfs有两组接口,一组针对内核,用于将设备映射到文件系统中,另一组针对用户程序,用于读取或操作这些设备。表2描述了内核中的sysfs要素及其在用户空间的表现:
| sysfs在内核中的组成要素 | 在用户空间的显示 |
|---|---|
| 内核对象(kobject) | 目录 |
| 对象属性(attribute) | 文件 |
| 对象关系(relationship) | 链接(Symbolic Link) |
sysfs引用于
作者:JalynFong
链接:https://www.jianshu.com/p/98606bee1dad
2.2 Kobject的事件类型
enum kobject_action {
KOBJ_ADD = (__force kobject_action_t) 0x01, // Kobject(或上层数据结构)的添加事件
KOBJ_REMOVE = (__force kobject_action_t) 0x02, // Kobject(或上层数据结构)的移除事件
KOBJ_CHANGE = (__force kobject_action_t) 0x03, // Kobject(或上层数据结构)的状态或者内容发生改变事件
KOBJ_OFFLINE = (__force kobject_action_t) 0x04, // Kobject(或上层数据结构)的上线(使能)事件
KOBJ_ONLINE = (__force kobject_action_t) 0x05, // Kobject(或上层数据结构)的下线(失能)事件
KOBJ_MOVE = (__force kobject_action_t) 0x06, // Kobject(或上层数据结构)更改名称或者更改Parent(意味着在sysfs中更改了目录结构)
};
// CHANGE,如果设备驱动需要上报的事件不再上面事件的范围内,或者是自定义的事件,可以使用该event,并携带相应的参数。
三、mdev应用程序
用于创建设备节点文件的用户空间程序,由内核空间通过Uevent机制根据kobject的状态通知用户空间执行。mdev是linux系统中udev的简化版本,一般用于嵌入式系统中,而udev一般用在PC上的linux中,相对mdev来说要复杂些。本质上来说mdev和udev都是一个应用程序,它们具有配置文件,根据uevent机制调用传递的参数和配置文件内容执行相应的功能。对于mdev可以使用busybox中自带的,udev可以下载源码去编译移植。
mdev 是基于uevent_helper机制的,在系统启动时修改内核中的uevnet_helper变量(通过写/proc/sys/kernel/hotplug),写入值为“/sbin/mdev”。这样内核产生uevent 时会调用uevent_helper 所指的用户空间程序,也就是mdev,来执行相应的热拔插动作(add\remove)。
uevent_helper 的初始值在内核编译时可配置的,默认值为/sbin/hotplug。如果想修改它的值,写/proc/sys/kernel/hotplug 文件就可以了,例如:
echo “/sbin/mdev” > /proc/sys/kernel/hotplug

Linux设备节点创建:uevent、Sysfs与mdev详解

本文详细介绍了Linux设备驱动中设备节点的创建过程,重点讲解了uevent机制、Sysfs文件系统以及mdev应用程序。uevent用于通知用户空间设备状态变化,Sysfs提供内核对象到文件系统的映射。mdev作为用户空间程序,响应uevent事件创建或删除设备节点。通过分析实例,展示了设备驱动如何利用这些机制动态创建设备节点,并通过mdev配置文件执行相关操作。

最低0.47元/天 解锁文章
1651

被折叠的 条评论
为什么被折叠?



