Linux Device Drivers-4 : The V.F.S Connection
To make use of a character device driver , the associated character device file (usually located under /dev) is to be used .Using the following command gives you the list of all character device files in /dev
ls -l /dev | grep “^c”
For any user-level application to access the underlying hardware , it should make use of the device driver corresponding to the device . But communication with the device driver can only be made by performing file operations on the device file corresponding to the device (usually located under /dev).
Therefore for any user-level application to get services out of a hardware , it should perform file operations on the corresponding device files .
The character device driver and the its corresponding device file are connected togetby V.F.S(Virtual File system) . The functions implemented inside the driver will perform her the low-level file access into the underlying hardware .
From Linux kernel 2.6 onwards there can exist multiple drivers under same MAJOR.NO
The connection of the device file with the driver is done by means of its <MAJOR.NO,MINOR.NO> pair .This connection is established by using the following to API’s in the driver .These calls registers a <MAJOR,MINOR> pair for the driver. Later any device file created by assigning the same major , minor number will be linked to the corresponding driver .
int register_chrdev_region(dev_t first,unsigned int no_of_minors,char *name);
This call associates the driver with the <Major,MINOR> pair stored in the variable first.The variable no_of_minors specifies the no.of.minor numbers to be registered .
Sometimes the Major number requested may be already allocated and may not be free.So its better to dynamically allocate the MAJOR number and let kernel search a free MAJOR number and assign the same .The following function is used to achieve the purpose .
int alloc_chrdev_region(dev_t *first,unsigned int first_minor,unsigned int no_of_minors,char *name);
When any file operations are performed on a device file , it is passed onto the driver my V.F.S .
To achieve this purpose the corresponding functions to be invoked by the driver(functions written inside the driver code) when different file operations* performed on the device file have to be registered with the V.F.S.
This registration is first done by initializing the structure file_operations and then handing the structure
to V.F.S by using the function cdev_add which is declared under <linux/cdev.h>