![当您为内核模块定义读取函数时,调用该函数时,该函数的参数来自哪里?](https://linux22.com/image/199455/%E5%BD%93%E6%82%A8%E4%B8%BA%E5%86%85%E6%A0%B8%E6%A8%A1%E5%9D%97%E5%AE%9A%E4%B9%89%E8%AF%BB%E5%8F%96%E5%87%BD%E6%95%B0%E6%97%B6%EF%BC%8C%E8%B0%83%E7%94%A8%E8%AF%A5%E5%87%BD%E6%95%B0%E6%97%B6%EF%BC%8C%E8%AF%A5%E5%87%BD%E6%95%B0%E7%9A%84%E5%8F%82%E6%95%B0%E6%9D%A5%E8%87%AA%E5%93%AA%E9%87%8C%EF%BC%9F.png)
假设我有一个名为“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
。