Linux创建字符设备 自动生成设备节点

1. 创建字符设备 生成设备节点 2. busybox 
  Linux System Utilities --->   [*] mdev 
  [*] Support /etc/mdev.conf 
  [*] Support command execution at device addition/removal 3. kernel 
  File systems ---> 
  Pseudo filesystems ---> 
  [*] sysfs file system support 
  [*] Virtual memory file system support (former shm fs)   [*] Tmpfs POSIX Access Control Lists 4. rootfs 
  vi ./etc/init.d/rcS 
  mount -t tmpfs mdev /dev   mkdir /dev/pts 
  mount -t devpts devpts /dev/pts   mount -t sysfs sysfs /sys   mount -a 
  echo /sbin/mdev > /proc/sys/kernel/hotplug   mdev -s 

  
----------------------------------------------------------------------- 
设备节点是由谁负责创建呢?我自个写着玩的时候一直都是自个用mknod来手动创建设备文件的。实际中设备文件应由谁创建呢?由驱动程序吗?还是系统自带的一些服务(udev等)会在设备接入时来动态的创建设备文件节点啊?如果是那个的话,一个不识别的设备它们(udev等)又怎么知道要如何创建节点呢?比如说U盘系统怎么会知道是创建成sda,sdb等。   
设备节点是由你写的驱动程序里面实现的。 
struct class *myclass = class_create(THIS_MODULE, “char_dev”); 
class_device_create(myclass, NULL, MKDEV(major_num, 0), NULL, “char_dev”); 这二个函数就是创建一个设备,和他的节点号。  
在你加入设备时udev就会判断,然后建立节点。  
至于你说的不识别的设备,你得加载驱动啊,加载驱动的时候里面只要有上述的二个函数,通过 UDEV就会创建了。 
 两种方法建立设备节点,一种是自己手动用mknod,另一种是存在udev,它会自动创建相应的设备节点。  
另外,楼主你写的驱动首先是要进行注册的,要创建一个class和device,class在/dev目录下,device在sysfs目录下,这样,你加载模块是就会根据已创建的device去找sysfs目录下的class。 



--------------------------------------------------------------------------------------------- 
使用linux-2.6.30.4。 
文件的管理使用的是 sysfs.(由udev制作的文件系统)   
涉及两个函数: 

virtual_disk_class = class_create(THIS_MODULE, "VirtualDisk"); 

device_create( virtual_disk_class, NULL, devno, 0, "VirtualDisk");   

使用需添加头文件 #include <linux/device.h>   
说明: 
当使用利用udev制作的文件系统时,Linux内核为我们提供了一组函数,可以用来在模块加载的时候自动在/dev目录下创建相应设备节点,并在卸载模块时删除该节点。 
内核中定义了struct class结构体,一个struct class结构体类型变量对应一个类(有待商榷),内核同时提供了class_create(„)函数,可以用它来创建一个类,这个类存放于sysfs下面,一旦创建好了这个类,再调用 device_create(„)函数来在/dev目录下创建相应的设备节点。这样,加载模块的时候,用户空间中的udev会自动响应 device_create(„)函数,去/sysfs下寻找对应的类从而创建设备节点。   
在linux-2.6.30.4,struct class定义在头文件include/linux/device.h中, struct class { 
    const char        *name;     struct module        *owner;  
    struct class_attribute        *class_attrs;     struct device_attribute        *dev_attrs;     struct kobject            *dev_kobj;  
    int (*dev_uevent)(struct device *dev, struct kobj_uevent_env *env);  
    void (*class_release)(struct class *class);     void (*dev_release)(struct device *dev);  
    int (*suspend)(struct device *dev, pm_message_t state);     int (*resume)(struct device *dev);  
    struct dev_pm_ops *pm;     struct class_private *p; };   
class_create(„)头文件include/linux/device.h中, #define class_create(owner, name)        / ({                        / 
    static struct lock_class_key __key;    /     __class_create(owner, name, &__key);    / }) 
__class_create在/drivers/base/class.c中实现: 
struct class *__class_create(struct module *owner, const char *name,                  struct lock_class_key *key)   
device_create(„)函数在/drivers/base/core.c中实现: 
struct device *device_create(struct class *class, struct device *parent,                  dev_t devt, void *drvdata, const char *fmt, ...)  * device_create - creates a device and registers it with sysfs 
 * @class: pointer to the struct class that this device should be registered to  * @parent: pointer to the parent struct device of this new device, if any  * @devt: the dev_t for the char device to be added 
 * @drvdata: the data to be added to the device for callbacks  * @fmt: string for the device's name   
使用示例: 

virtual_disk_class = class_create(THIS_MODULE, "VirtualDisk"); 

device_create( virtual_disk_class, NULL, devno, 0, "VirtualDisk");

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值