char设备在cdev_add()成功注册到117上的major后出现在哪里?

我写了基本的字符驱动程序。

使用cdev_alloc,cdev_init,cdev_add完成了使用内核注册char设备。 less校= 117,轻微= 1。

cdev_add函数重试成功。 我正在试图检查是否创build的字符设备。 我没有find任何设备下的主要没有117 / dev /或/ dev / char。

register_chrdev不会被用在最新的内核里,我们给NAME。 但是cdev_add只使用主数字来执行内核的char设备注册。

我对最新的内核行为感到困惑。

我是否需要使用register_chrdev和cdev_add? 或者我需要使用mknod commad来在/ dev /中显示设备?

谢谢。

Solutions Collecting From Web of "char设备在cdev_add()成功注册到117上的major后出现在哪里?"

cdev是内核的char设备表示,并将cdev与一组file_operations相关联。 这些file_operations在设备节点上执行,通常位于/ dev下,或者取决于您创建设备节点的位置。

cdev_init()用于将cdev与一组file_operations相关联。 最后在设备上调用cdev_add()使其生存,以便用户可以访问它们。

现在,虽然这样做,但这并不意味着设备节点是为您创建的

这是通过使用mknod实用程序或使用device_create()函数手动完成的。 设备节点通常与一个类相关联。 因此,我们需要先创建一个类(使用class_create()),然后使用该类创建设备节点。

这是一个如何获取设备节点的例子。

 struct class *my_class; struct cdev my_cdev[N_MINORS]; dev_t dev_num; static int __init my_init(void) { int i; dev_t curr_dev; /* Request the kernel for N_MINOR devices */ alloc_chrdev_region(&dev_num, 0, N_MINORS, "my_driver"); /* Create a class : appears at /sys/class */ my_class = class_create(THIS_MODULE, "my_driver_class"); /* Initialize and create each of the device(cdev) */ for (i = 0; i < N_MINORS; i++) { /* Associate the cdev with a set of file_operations */ cdev_init(&my_cdev[i], &fops); /* Build up the current device number. To be used further */ curr_dev = MKDEV(MAJOR(dev_num), MINOR(dev_num) + i); /* Create a device node for this device. Look, the class is * being used here. The same class is associated with N_MINOR * devices. Once the function returns, device nodes will be * created as /dev/my_dev0, /dev/my_dev1,... You can also view * the devices under /sys/class/my_driver_class. */ device_create(my_class, NULL, curr_dev, NULL, "my_dev%d", i); /* Now make the device live for the users to access */ cdev_add(&my_cdev[i], curr_dev, 1); } return 0; } 

register_chrdev是不会在最新的内核中使用,我们给NAME?

register_chrdev()是在内核2.4中使用的较早的方式,但在内核2.6中被替换为register_chrdev_region()和alloc_chardev_region()。

  1. register_chrdev_region()如果你事先知道你想要的设备号码。
  2. alloc_chrdev_region()用于动态分配一个设备号,由内核完成。