字符设备驱动自动生成设备节点文件

mdev的介绍及使用方法

mdev是busybox中一个udev管理程序的精简版,它也可以实现设备节点的自动创建和设备的自动挂载,只是在实现的过程中有点差异。在发生热拔插的时候,mdev被hotplug直接调用,这时mdev通过环境变量中的ACTION和DEVPATH来确定此次热拔插事件的动作及影响了/sys中的哪个目录。接着会看这个目录中是否有“dev”属性的文件,利用这些信息为这个设备在/dev目录下创建设备节点文件。

1、mdev的基本介绍及使用方法

mdev有两个主要的应用:初始化对象和动态更新。

两个应用都要内核sysfs的支持,并且必须将sysfs加载到/sys。为了实现动态更新,还必须在内核配置是增加热拔插的支持(hotplugging)。

系统初始化脚本中使用mdev的过程:

###  /etc/init.d/rcS配置文件

#保证/dev目录是tmpfs类型的文件
mount -t tmpfs mdev /dev
#如果文件系统在Flash外运行
mkdir /dev/pts
mount -t devpts devpts /dev/pts

# -t 表示指定文件类型(-t sysfs 表示指定文件类型为sysfs)、第二个sysfs表示源挂载目录(即要在挂载目录生成的目录)、/sys表示目的目录(即源目录要挂载的位置)
#格式:mount [-参数] [设备名称] [挂载点]
mount -t sysfs sysfs /sys

#把/bin/mdev的内容全部重定位到/proc/sys/kernel/hotplug,当调用hotplug程序时,就是调用mdev,实现
#动态更新。
echo /bin/mdev > /proc/sys/kernel/hotplug

#调用mdev创建所有的设备节点
mdev -s

小插曲:“echo >”和“echo >>”的区别

echo  A > B输出重定向把A中的内容全部重定向到B中
echo  A >> B 输出追加重定向把A中的内容内容全部重定位追加到B后面

内核提供了class_create()函数,可以用它来创建一个类,这个类存放在/sysfs下。创建好这个类,在调用device_create()函数来在/dev目录下创建对应的设备节点。这样,加载模块的时候,用户空间的mdev会自动响应devcie_create()函数,在sysfs下寻找对应的类,从而创建设备节点。

相关数据结构、函数介绍:

struct class结构体定义:

struct class { 
const char *name;
struct module *owner; 
struct class_attribute *class_attrs; 
struct device_attribute *dev_attrs;
struct bin_attribute *dev_bin_attrs; 
struct kobject *dev_kobj;
int (*dev_uevent)(struct device *dev, struct kobj_uevent_env *env);
char *(*devnode)(struct device *dev, mode_t *mode);
void (*class_release)(struct class *class);
(*dev_release)(struct device *dev);
int (*suspend)(struct device *dev, pm_message_t state);
int (*resume)(struct device *dev);
const struct kobj_ns_type_operations *ns_type;
const void *(*namespace)(struct device *dev);
const struct dev_pm_ops *pm; 
struct subsys_private *p; 
};

创建一个class结构体的函数:

 struct class *class_create(struct module *owner, const char *name);

创建一个设备文件,效果是在/dev目录下创建设备文件:

#devt为设备号、fmt为文件名指针
struct device *device_create(struct class *class, struct device *parent,
                        dev_t devt, const char *fmt, ...);

销毁一个类:

void class_destroy(struct class *cls);

删除一个设备:

void device_destroy(struct class *cls,dev_t devt);

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值