gpt4 book ai didi

file - 无法从 Linux 内核版本 4.2.3 上的内核模块打开/读取文本文件

转载 作者:行者123 更新时间:2023-12-01 06:30:49 34 4
gpt4 key购买 nike

我已经编写了一个内核模块,我正在内核 4.2.3 上加载它。我试图在我的 init_module 中读取一个简单的文本文件,它基本上通过读取文本文件的内容来加载一些配置数据。同样的代码适用于以前版本的内核,但不适用于 4.2.3 以下是我的代码片段供引用:

struct file* pFile = NULL;
pFile = filp_open(fileName, mode, 0);
if(pFile != NULL){
if(IS_ERR(pFile))
{
printk("<1>error %p for %s**\n", pFile, fileName);
pFile = NULL;
}
else if(pFile->f_op->read == NULL || pFile->f_op->write == NULL)
{
filp_close(pFile, 0);
pFile = NULL;
}

在我的例子中,我将 pFile->f_op->read 函数指针作为 NULL。此代码适用于我能够打开和阅读的非文本文件,例如 /proc/kallsyms。请提供一些关于这是 4.2.3 内核特定问题的指示,我如何在我的内核模块代码中解决这个问题?任何指示都会非常有帮助。

最佳答案

.read 并不是唯一可以实现从文件读取的接口(interface)。文件也可以为此使用 .read_iter

要读取文件,不要直接调用->read,而是使用

ssize_t vfs_read(struct file *file, char __user *buf, size_t count, loff_t *pos)

它考虑了每一种可能性。

类似的,写一个文件

ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_t *pos)

应该使用。

更新:自 Linux 内核 4.14 起,在内核空间函数 kernel_readkernel_write 中读取/写入文件应该改用。参见 that my answer了解更多信息。


从文件读取到内核缓冲区(Linux 内核 4.14 之前)

因为 vfs_read 期望缓冲区指向用户空间内存(__user 类型属性表示),传递内核缓冲区将不起作用:它可能会导致编译器警告 vfs_read 的第二个参数的预期类型和实际类型之间存在不一致,更重要的是,vfs_read 将拒绝(通过返回 -EFAULT)指示的缓冲区不是用户空间。但是可以通过更改用户空间内存段来克服这种行为:

/*
* Assume that `kernel_buf` points to kernel's memory and has type char*.
*/
char __user *user_buf = (__force char __user *)kernel_buf; // Make compiler happy.
mm_segment_t oldfs = get_fs(); // Store current use-space memory segment.
set_fs(KERNEL_DS); // Set user-space memory segment equal to kernel's one.

vfs_read(file, user_buf, count, pos);

set_fs(oldfs); // Restore user-space memory segment after reading.

关于file - 无法从 Linux 内核版本 4.2.3 上的内核模块打开/读取文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33183923/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com