文章摘要:
本文主要描述了自动创建Linux设备文件的几种常用方法。


方法一:class(推荐)

#include <linux/device.h>
struct class *myclass;
dev_t devno; 

创建设备文件(模块加载时):

// 创建自定义类:字符串为类名称
myclass = class_create(THIS_MODULE,"myclass"); 
// 创建设备:字符串为设备名称
device_create(myclass,NULL,devno,"mydevice");   

移除自动创建的设备文件(模块移除时):

// 移除设备
device_destroy(myclass, devno); 
// 移除类
class_destroy(myclass);          

当驱动模块被加载时,udev(mdev)就会自动在/dev目录下创建"mydevice"设备文件

注意事项:
1.本方法适用于内核版本为2.6以上的系统,需要udev(mdev)支持;

2.device_create函数在更新的版本中修改了参数列表(可变参数),这样会造成新旧版版本的驱动程序不通通过编译,需注意;(2.6.18之后的版本,已为变参,具体哪个版本开始的,已不再考证);

3.可以单独注册一个自定义的类并导出,在驱动程序中直接导入类就行了,无需再创建及删除类;

4.目前来说,此种方法比较主流,推荐使用。


方法二:混杂设备
将设备声明为混杂设备即可,此种方法比较简单,适用于简单的驱动程序;
但此种方法最多只支持255个混杂设备(也差不多够用了);

声明一个混杂设备:

static struct miscdevice sync_miscdev = {   
    .minor = MISC_DYNAMIC_MINOR,
    .name ="sync_dev",     //设备文件名称
    .fops = &sync_fops,    //文件操作
};

注册设备至内核:

misc_register(&sync_miscdev);

注销设备:

misc_deregister(&sync_miscdev);

早期方法:脚本
采用脚本读取/proc/devices来获取设备号,并创建设备文件;

#!/bin/sh
module="scull"
device="scull"
mode="664"
/sbin/insmod ./$module.ko $* || exit 1
# remove stale nodes
rm -f /dev/${device}[0-3]
major=$(awk "\\$2==\"$module\" {print \\$1}" /proc/devices)
mknod /dev/${device}0 c $major 0
mknod /dev/${device}1 c $major 1
mknod /dev/${device}2 c $major 2
mknod /dev/${device}3 c $major 3
group="staff"
grep -q '^staff:' /etc/group || group="wheel"
chgrp $group /dev/${device}[0-3]
chmod $mode /dev/${device}[0-3]

注意事项:
《Linux设备驱动程序》中有详细说明;脚本法适用于所有系统,一般只在早期采用,2.6之后均转向class实现;