假设我有一个名为“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
函数就会被调用,但是函数的参数从哪里来呢?
答案1
参数来自导致读取的系统调用:
- 一个程序调用
read
,向其传递文件描述符、指向缓冲区的指针和计数; - 系统调用是处理者
ksys_read
,它确定了struct file
对应的文件描述符,以及文件中的当前位置,之前呼叫vfs_read
; vfs_read
调用相关struct file_operations
的read
函数。
有一条类似的路径从pread
,它还提供了要读取的文件位置;这是处理者ksys_pread64
。