《Linux驱动:设备节点文件的创建过程》

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

一、前言

之前学习字符设备驱动开发时,提到调用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
在这里插入图片描述

3.1 mde

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程界的小学生、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值