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制作的文件系统)
涉及两个函数:
说明:
当使用利用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
使用示例:
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");