我正在编写一个需要打开和读取文件的 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/