file-io - Linux 内核模块中的文件 I/O

标签 file-io linux-kernel kernel-module

我正在编写一个需要打开和读取文件的 Linux 内核模块。实现这一目标的最佳方法是什么?

最佳答案

所有内核开发人员都说来自内核空间的文件 I/O 很糟糕(特别是如果您通过它们的路径引用这些文件),但主流内核在您加载固件时会这样做。如果您只需要从文件中读取,请使用

kernel_read_file_from_path(const char *path, void **buf, loff_t *size, loff_t max_size, enum kernel_read_file_id id)

固件加载程序代码使用的函数,在 include/linux/fs.h 中声明.此函数在出错时返回负值。

我不太确定id 的意义。最后的变量,如果你看一下它并没有真正使用过的代码,所以只需输入类似 READING_FIRMWARE 的内容那里(没有引号)。
buf不是以 null 结尾的,而是在 size 中引用它的大小.如果您需要它以 null 结尾,请创建一个字符串 size + 1字节长并将其复制或重写 kernel_read_file()函数(由 kernel_read_file_from_path() 使用,在 fs/exec.c 中定义)并将 i_size 加一分配内存的地方。 (如果你想这样做,你可以在你的模块中用不同的函数名重新定义kernel_read_file()函数以避免修改整个内核。)

如果你需要写入文件,有一个 kernel_write()函数(类似于 kernel_read() ,由 kernel_read_file() 使用,因此也由 kernel_read_file_from_path() 使用),但没有 kernel_write_file()kernel_write_file_from_path()功能。您可以查看 fs/exec.c 中的代码Linux 内核源代码树中的文件,其中 kernel_read_file()kernel_read_file_from_path()被定义为写你自己的kernel_write_file()kernel_write_file_from_path()您可以包含在模块中的功能。

和往常一样,您可以使用此函数通过强制转换将文件的内容存储在 char 指针而不是 void 指针中。

关于file-io - Linux 内核模块中的文件 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/275386/

相关文章:

node.js - 使用 Node.js 复制和转换文件

c - 如果从文件输入中获取,为什么不\n 生成一个新行字符?

c - 读取系统调用表函数地址时内核模块崩溃

c++ - 访问文件中的单个字符效率低下? (C++)

java - 数组为空。未从 while 循环获取信息

c - 每次连接 USB 设备时,我都需要执行用户空间应用程序

linux-kernel - in_irq() 可靠吗?

linux - Linux ISR 入口点在哪里

c - 在skb中打印transport_header中的值

linux-kernel - 前缀 printk/pr_* 调用