Implementing file operations
After introducing file operations in the previous section, it is time to implement those to enhance the driver capabilities and expose the device's methods to user space (by means of system calls, of course). Each of these methods has its particularities, which we will highlight in this section.
Exchanging data between the kernel space and user space
As we have seen while introducing the file operation table, the read
and write
methods are used to exchange data with the underlying device. Both being system calls means that data will originate from or be in destination to user space. While looking at the read
and write
method prototypes, the first point that catches our attention is the use of __user
. This is a cookie used by Sparse (a semantic checker used by the kernel to find possible coding faults) to let the developer know they are about to use an untrusted pointer (or a pointer that may be invalid in the current virtual address mapping)...