devfs(设备文件系统)是由Linux2.4内核引入的,它的出现主要使得设备驱动程序能够自主管理自己的设备文件。具体来说,devfs具有如下优点:
可以通过程序在设备初始化时在/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 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);
在最新的Linux 2.6的内核中, devfs已经被抛弃,udev取代了它。udev取代devfs的几点原因如下:
使用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);
mdev是busybox自带的一个简化版的udev,适合于嵌入式的应用埸合。其具有使用简单的特点。它的作用,就是在系统启动和热插拔或动态加载驱动程序时,自动产生驱动程序所需的节点文件。在以busybox为基础构建嵌入式linux的根文件系统时,使用它是最优的选择。