Search code examples
clinuxmodulechardriver

Character Device Driver Read/Write in Linux


I've written a character device driver that, I believe, should work.

I want to test the read/write functions. On another stack overflow question, apparently this can be done by writing to the device file in /dev and echoing the output.

I don't understand how this works:

When I load up my device driver by allocating a major number and calling mknod to create the file, is the file "open"? If it isn't open, then reading/writing shouldn't work like that from the command line, or so I thought?

What state is the device driver in when it has been initialized in /proc/devices and a file created in /dev?

Does this initialization need to happen before attempting to open the device file in a c program?

These answer are extremely difficult to find online, and many resources are outdated. Thanks


Solution

  • One good resource is Linux device driver. A shorter and simpler explanation can be found here.

    When you create a file driver, you will implement some functions among file operations (fops):

    • open
    • close
    • read
    • write
    • seek
    • ...

    Not all function have to be implemented. If write is not implemented for instance, your device won't support writting.

    When I load up my device driver by allocating a major number and calling mknod to create the file, is the file "open"?

    When the /dev file is created, your module is only inited. A function like init_module is called

    When the file is removed, your module is deinited. A function like module_cleanup is called.

    What state is the device driver in when it has been initialized in /proc/devices and a file created in /dev?

    In that case, the module is inited, the file are not open.

    If it isn't open, then reading/writing shouldn't work like that from the command line, or so I thought?

    When you read a file from command line, the file is open, read then closed, as a user, you don't have to care to open/close file explicitly.

    Things are different if you are a C programmer, in that case, you explicitly have to open, read, close the files.

    You can check that adding traces in your kernel code (using printk to print some info to kernel console, reading it with dmesg) or using strace that will trace the system calls.

    Does this initialization need to happen before attempting to open the device file in a c program?

    Let's resume:

    • The first function called will be module_init before it's called, the file doesnot exist in /dev
    • The last function called will be module_cleanup after it's called, the file doesnot exist in /dev
    • between init and cleanup, you can call the different open, close, read and write function. Generally read/write are called between open and close.