什么是udev?
在Linux系统中,/dev目录是用来存放设备文件的,每个文件指向一个系统设备文件,用户的程序可以通过使用这些文件来对真实硬件进行设备操作,但是在2.4内核时代,/dev下保存了所有kernel可以支持的硬件设备的设备文件,总计有近一万多个,而这些设备的大多数都是没有链接的设备,这样就极大的浪费了系统资源,而且/dev目录也显得十分混乱,而udev就是解决这些问题的,udev可以对/dev目录进行管理,动态的建立和删除设备文件,当设备链接系统时,udev自动建立相应的设备文件,而在断开时,会自动删除相应的设备文件,这样能够使/dev目录更加简洁,而且udev还可以运行用户编写命名规则,为不同设备编写文件名,这样可以更加方便的对设备进行管理
mdev和udev的区别
mdev是busybox自带的一个简化版的udev,常用于一些嵌入式的操作系统中
udev是自动创建设备结点的机制,创建设备结点的逻辑在用户空间
udev的工作原理
在系统内核中有设备进行添加或者删除设备时,系统内核在检测到之后会生成一个hotplug event,并查找hotplug中的设备程序,若udev已经启动,内核会通知udev进程进行查询设备结点的相关信息并创建结点
udev的相关api及其用途
引用库:#include<linux/device.h>
1.向上提交目录信息
struct class * class_create(struct module *owner,const char *name );
功能:申请一个设备类并初始化,向上提交目录信息
参数:
owner:指向当前内核模块自身的一个模块指针,填写THIS_MODULE
name:向上提交的目录名
返回值:成功返回申请的struct class对象空间首地址,失败返回错误码指针
2.销毁目录
void class_destroy(struct class *cls)
功能:销毁目录信息
参数:cls:指向class对象的指针
返回值:无
3.向上提交节点信息
struct device *device_create(struct class *class, struct device *parent,
dev_t devt, void *drvdata, const char *fmt, ...)
功能:创建一个设备对象,向上提交设备节点信息
参数:
cls:向上提交目录时的到的类对象指针
parent:当前申请的对象前一个节点的地址,不知道就填 NULL
devt:设备号 主设备号<<20|次设备号
/*
MKDEV(主设备号,次设备号):根据主设备号和次设备号得到设备号
MAJOR(dev):根据设备号获取主设备号
MINOR(dev):根据设备号获取次设备号
*/
dridata:申请的device对象的私有数据,填写NULL
fmt:向上提交的设备节点名
...:不定长参数
返回值:成功返回申请到的device对象首地址,失败返回错误码指针,指向4K预留空间
4.销毁设备节点信息
void device_destroy(struct class *class, dev_t devt)
功能:销毁设备节点信息
参数:
class:向上提交目录时得到的类对象指针
devt:向上提交设备节点信息时提交的设备号
返回值:无