在linux内核中的/dev/card0这种节点,是在哪个内核函数里创建的?
在Linux内核中,设备节点(如 /dev/card0
)的创建通常涉及到设备驱动程序和设备文件系统(devfs)或udev守护进程。具体来说,设备节点的创建过程可以分为以下几个步骤:
设备驱动注册:设备驱动程序会向内核注册一个字符设备��块设备。这个过程通常通过调用 register_chrdev
或 register_blkdev
函数来完成。
设备类和设备的创建:在现代Linux内核中,设备驱动程序通常会使用 class_create
和 device_create
函数来创建设备类和设备实例。这些函数会在 /sys/class
和 /sys/devices
中创建相应的sysfs条目。
udev守护进程:udev是一个用户空间的设备管理守护进程,它会监视sysfs中的设备事件,并根据规则在 /dev
目录中创建相应的设备节点。
具体到 /dev/card0
这样的设备节点,假设它是由某个特定的设备驱动程序创建的,以下是一个简化的示例流程:
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/device.h>
#include <linux/cdev.h>
#define DEVICE_NAME "card0"
#define CLASS_NAME "card"
static int majorNumber;
static struct class* cardClass = NULL;
static struct device* cardDevice = NULL;
static int __init card_init(void) {
// Register a character device
majorNumber = register_chrdev(0, DEVICE_NAME, &fops);
if (majorNumber < 0) {
printk(KERN_ALERT "Failed to register a major number\n");
return majorNumber;
}
// Register the device class
cardClass = class_create(THIS_MODULE, CLASS_NAME);
if (IS_ERR(cardClass)) {
unregister_chrdev(majorNumber, DEVICE_NAME);
printk(KERN_ALERT "Failed to register device class\n");
return PTR_ERR(cardClass);
}
// Register the device driver
cardDevice = device_create(cardClass, NULL, MKDEV(majorNumber, 0), NULL, DEVICE_NAME);
if (IS_ERR(cardDevice)) {
class_destroy(cardClass);
unregister_chrdev(majorNumber, DEVICE_NAME);
printk(KERN_ALERT "Failed to create the device\n");
return PTR_ERR(cardDevice);
}
printk(KERN_INFO "Card device class created correctly\n");
return 0;
}
static void __exit card_exit(void) {
device_destroy(cardClass, MKDEV(majorNumber, 0));
class_unregister(cardClass);
class_destroy(cardClass);
unregister_chrdev(majorNumber, DEVICE_NAME);
printk(KERN_INFO "Card device class removed\n");
}
module_init(card_init);
module_exit(card_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Author");
MODULE_DESCRIPTION("A simple Linux char driver for card0");
MODULE_VERSION("0.1");
/sys/class/card
和 /sys/devices
中创建相应的sysfs条目。/dev
目录中创建相应的设备节点 /dev/card0
。通过这些步骤,设备节点 /dev/card0
就被创建并可以