udev与devfs文件系统
2014-05-12 00:00
183 查看
devfs(设备文件系统)是由Linux2.4内核引入的,它的出现主要使得设备驱动程序能够自主管理自己的设备文件。具体来说,devfs具有如下优点:
可以通过程序在设备初始化时在/dev目录下创建设备文件,卸载设备时将它删除。
设备驱动程序可以指定设备名、所有者和权限位,用户空间程序仍可以修改所有者和权限位。
不再需要为设备驱动程序分配主设备号以及处理次设备号,在程序中可以直接给register_chrdev()传递0主设备号以动态获得可用的主设备号,并在devfs_register()中指定次设备号。
创建设备目录、设备文件以及删除函数如下:
使用devfs的例子如下:
在最新的Linux 2.6的内核中, devfs已经被抛弃,udev取代了它。udev取代devfs的几点原因如下:
l devfs所做的工作被确信可以在用户态来完成
l 一些bug相当长的时间内未被修复
l devfs的维护者和作者停止了对代码的维护工作。
udev完全在用户态工作,利用设备加入或移除内核所发送的热插拔事件来工
作。在热插拔时,设备的详细信息会由内核输入到位于/sys的sysfs文件系统。udev的设备名策略、权限控制和事件处理都是在用户态下完成的,它利用sysfs中的信息来进行创建设备文件节点工作。
由于udev根据系统中硬件设备的状态动态更新设备文件、进行设备文件的
创建和删除等,因此,在使用udev后,在/dev目录下就只包含系统中真正存在的设备了。
devfs与udev的另一个显著区别在于:采用devfs,当一个并不存在的/dev
节点被打开的时候,devfs能自动加载对应的驱动,而udev则不能。这是因为udev的设计者认为Linux应该在设备被发现的时候加载驱动模块,而不是当它被访问的时候。udev的设计者认为devfs所提供的打开/dev节点时自动加载驱动的功能对于一个配置正确的计算机是多余的。系统中所有的设备都应该产生热插拔事件并加载恰当的驱动,而udev能注意到这点并且为它创建对应的设备节点。
使用udev的例子如下:
mdev是busybox自带的一个简化版的udev,适合于嵌入式的应用埸合。其具有使用简单的特点。它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需的节点文件。在以busybox为基础构建嵌入式linux的根文件系统时,使用它是最优的选择。
注:
class_create : 创建class
class_destroy : 销毁class
class_device_create : 创建device
class_device_destroy : 销毁device
这些API是2.6.13开始有的,在2.6.13之前,应当使用
class_simple_create
class_simple_destroy
class_simple_device_add
class_simple_device_remove
kernel 2.6.26 has deprecated class_device_create and class_device_destroy, 直接使用device_create 和 device_destroy。
可以通过程序在设备初始化时在/dev目录下创建设备文件,卸载设备时将它删除。
设备驱动程序可以指定设备名、所有者和权限位,用户空间程序仍可以修改所有者和权限位。
不再需要为设备驱动程序分配主设备号以及处理次设备号,在程序中可以直接给register_chrdev()传递0主设备号以动态获得可用的主设备号,并在devfs_register()中指定次设备号。
创建设备目录、设备文件以及删除函数如下:
devfs_handle_t devfs_mk_dir(devfs_handle_t dir, const char *name, void *info); devfs_handle_t devfs_register(devfs_handle_t dir, const char *name, unsigned int flags, unsigned int major, unsigned int minor, umode_t mode, void *ops, void *info); void devfs_unregister(devfs_handle_t de);
使用devfs的例子如下:
static devfs_handle_t devfs_handle; static int __init xxx_init(void) { int ret; int I; /*在内核中注册设备*/ ret = register_chrdev(XXX_major, DEVICE_NAME, &xxx_fops); if( ret < 0) { printk(DEVICE_NAME “ can’t register major number\n”); return ret; } /*创建设备文件*/ devfs_handle = devfs_register(NULL, DEVICE_NAME, DEVFS_FL_DEFAULT, xxx_MAJOR, 0, S_IFCHR | S_IRUSR | S_IWUSR, &xxx_fops, NULL); … printk(DEVICE_NAME “ initialized\n”); return 0; } static void __exit xxx_exit(void) { devfs_unregister(devfs_handle);/*撤消设备文件*/ unregister_chrdev(XXX_MAJOR, DEVICE_NAME);/*注销设备*/ } module_init(xxx_init); module_exit(xxx_exit); |
l devfs所做的工作被确信可以在用户态来完成
l 一些bug相当长的时间内未被修复
l devfs的维护者和作者停止了对代码的维护工作。
udev完全在用户态工作,利用设备加入或移除内核所发送的热插拔事件来工
作。在热插拔时,设备的详细信息会由内核输入到位于/sys的sysfs文件系统。udev的设备名策略、权限控制和事件处理都是在用户态下完成的,它利用sysfs中的信息来进行创建设备文件节点工作。
由于udev根据系统中硬件设备的状态动态更新设备文件、进行设备文件的
创建和删除等,因此,在使用udev后,在/dev目录下就只包含系统中真正存在的设备了。
devfs与udev的另一个显著区别在于:采用devfs,当一个并不存在的/dev
节点被打开的时候,devfs能自动加载对应的驱动,而udev则不能。这是因为udev的设计者认为Linux应该在设备被发现的时候加载驱动模块,而不是当它被访问的时候。udev的设计者认为devfs所提供的打开/dev节点时自动加载驱动的功能对于一个配置正确的计算机是多余的。系统中所有的设备都应该产生热插拔事件并加载恰当的驱动,而udev能注意到这点并且为它创建对应的设备节点。
使用udev的例子如下:
#include <linux/device.h> … static struct class * xxx_class; static int __init xxx_init(void) { int ret; int i; /*在内核中注册设备*/ ret = register_chrdev(XXX_major, DEVICE_NAME, &xxx_fops); if( ret < 0) { printk(DEVICE_NAME “ can’t register major number\n”); return ret; } //注册一个类,使mdev可以在"/dev/"目录下面建立设备节点 xxx_class = class_create(THIS_MODULE, DEVICE_NAME); if(IS_ERR(led_class)) { printk("Err: failed in EmbedSky-leds class. \n"); return -1; } //创建一个设备节点,节点名为DEVICE_NAME class_device_create(xxx_class, NULL, MKDEV(xxx_major, 0), NULL, DEVICE_NAME); … printk(DEVICE_NAME “ initialized\n”); return 0; } static void __exit xxx_exit(void) { unregister_chrdev(XXX_MAJOR, DEVICE_NAME);/*注销设备*/ class_device_destroy(xxx_class, MKDEV(xx_major, 0));//删掉设备点 class_destroy(xxx_class); //注销类 } module_init(xxx_init); module_exit(xxx_exit); |
注:
class_create : 创建class
class_destroy : 销毁class
class_device_create : 创建device
class_device_destroy : 销毁device
这些API是2.6.13开始有的,在2.6.13之前,应当使用
class_simple_create
class_simple_destroy
class_simple_device_add
class_simple_device_remove
kernel 2.6.26 has deprecated class_device_create and class_device_destroy, 直接使用device_create 和 device_destroy。
相关文章推荐
- devfs、sysfs、udev文件系统
- udev设备文件系统与devfs设备文件系统对比
- devfs, sysfs, udev文件系统区别
- 根文件系统中mdev/udev/devfs的区别
- 操作系统_再识(linux设备管理文件系统-devfs与udev)
- linux驱动学习--第十天:第五章 Linux 文件系统与设备文件系统(四) 之 设备文件系统 devfs 和 udev
- udev 文件系统制作
- udev 自动挂载U盘文件系统指定目录
- udev设备文件系统
- 设备文件系统(DevFS)
- udev 文件系统制作
- Linux内核源代码情景分析-设备文件系统devfs
- 集群cluster篇-----3.存储技术与应用 、 iSCSI技术应用 、 udev配置 、 NFS网络文件系统 、 Multipath多路径
- Linux设备节点文件的创建—从mknod到devfs再到udev
- 设备文件系统剖析与使用 udev mdev devfs
- udev文件系统的使用和基本工作原理分析
- 基于sysvinit,udev的根文件系统构建
- udev文件系统的使用和基本工作原理分析
- 第二章 驱动开发_devfs设备文件系统详解
- udev文件系统的使用和基本工作原理分析