假设我有一个名为“hello”的内核模块。
例如:
static struct file_operations hello_fops = {
.open = hello_open,
.read = hello_read,
.release = hello_release,
};
static ssize_t hello_read(struct file *f, char *buf, size_t len, loff_t *offset){
// some code here
}
当你从/dev/hello
字符设备文件中读取时,hello_read
函数会被调用,但是函数的参数是从哪里来的呢?
参数来自导致读取的系统调用:
read
,将文件描述符、指向缓冲区的指针和计数传递给它;ksys_read
调用之前确定struct file
对应的文件描述符,以及文件中的当前位置;vfs_read
vfs_read
调用相关struct file_operations
的'read
函数。有一个类似的路径从 开始
pread
,它还提供了要读取的文件位置;它由ksys_pread64
.