您的位置:首页 > 运维架构 > Linux

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

2014-07-30 12:12 393 查看
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");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: