I'm learning about the registration of a kernel module using
register_chrdev_region(dev_t from, unsigned count, const char * name);
.I notice that with or without this function, my kernel module worked as expected. The code I used for testing:
first = MKDEV(MAJOR_NUM, MINOR_NUM);
register_chrdev_region(first, count, DEVICE_NAME);//<---with and without
mycdev=cdev_alloc();
mycdev->ops= &fops;
mycdev->owner = THIS_MODULE;
if (cdev_add(mycdev,first, count) == 0)
{printk(KERN_ALERT "driver loaded\n");}
I commented out the line
register_chrdev_region(first, count, DEVICE_NAME);
, and theprintk
message still appeared. I tried to communicate with the driver with or without this from user space, and both are successful.So my question is, is this function
register_chrdev_region()
only used to make my driver a good kernel citizen, just like telling the others that "I'm using up the major number, please don't use"?I tried to have a look in the kernel source
char_dev.c
to understand the function, but I find it too difficult to understand, anyone that's familiar with this?Answers:-
That will work because it's not actually necessary to allocate your device numbers up front. In fact, it's considered preferable by many kernel developers to use the dynamic (on-the-fly, as-needed) allocation function
alloc_chrdev_region
.Whether you do it statically up front or dynamically as needed, it is something you should do to avoid conflict with other device drivers which may have played by the rules and been allocated the numbers you're trying to use. Even if your driver works perfectly well without it, that won't necessarily be true on every machine or at any time in the future.
The rules are there for a reason and, especially with low-level stuff, you are well advised to follow them.
See here for more details on the set-up process.
0 comments:
Post a Comment