Search code examples
linuxlinux-kernelmknod

How can I create a device node from the init_module code of a Linux kernel module?


I am writing a module for the Linux kernel, and I want to create some device nodes in the init() function:

int init_module(void)
{
    Major = register_chrdev(0, DEVICE_NAME, &fops);

    // Now I want to create device nodes
    // with the returned major number
}

I also want the kernel to assign a minor number for my first node, and then I will assign the other nodes' minor numbers by myself.

How can I do this in the code? I don’t want to create devices from the shell using mknod().


Solution

  • To have more control over the device numbers and the device creation, you could do the following steps (instead of register_chrdev()):

    1. Call alloc_chrdev_region() to get a major number and a range of minor numbers to work with.
    2. Create a device class for your devices with class_create().
    3. For each device, call cdev_init() and cdev_add() to add the character device to the system.
    4. For each device, call device_create(). As a result, among other things, Udev will create device nodes for your devices. There isn’t any need for mknod() or the like. device_create() also allows you to control the names of the devices.

    There are probably many examples of this on the Internet, and one of them is here.