gpt4 book ai didi

c - 从 Linux 内核模块的用户空间打开文件

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:21:36 24 4
gpt4 key购买 nike

我一直在学习从 http://www.howtoforge.com/reading-files-from-the-linux-kernel-space-module-driver-fedora-14 的 Linux 内核模块打开用户空间文件的教程。

代码如下:

#include <linux/module.h>  // Needed by all modules
#include <linux/kernel.h> // Needed for KERN_INFO
#include <linux/fs.h> // Needed by filp
#include <asm/uaccess.h> // Needed by segment descriptors

int init_module(void)
{
// Create variables
struct file *f;
char buf[128];
mm_segment_t fs;
int i;
// Init the buffer with 0
for(i=0;i<128;i++)
buf[i] = 0;
// To see in /var/log/messages that the module is operating
printk(KERN_INFO "My module is loaded\n");
// I am using Fedora and for the test I have chosen following file
// Obviously it is much smaller than the 128 bytes, but hell with it =)
f = filp_open("/etc/fedora-release", O_RDONLY, 0);
if(f == NULL)
printk(KERN_ALERT "filp_open error!!.\n");
else{
// Get current segment descriptor
fs = get_fs();
// Set segment descriptor associated to kernel space
set_fs(get_ds());
// Read the file
f->f_op->read(f, buf, 128, &f->f_pos);
// Restore segment descriptor
set_fs(fs);
// See what we read from file
printk(KERN_INFO "buf:%s\n",buf);
}
filp_close(f,NULL);
return 0;
}

void cleanup_module(void)
{
printk(KERN_INFO "My module is unloaded\n");
}

代码是从上面的链接复制粘贴的。在我的机器上,运行带有 3.11.10-200 内核的 Fedora 19,filp_open 似乎没有运行,为 buf 变量提供空值。

有什么问题吗?我仍在学习 Linux 内核模块开发的窍门。

最佳答案

您应该做的第一件事是检查是否从 filp_open 返回任何错误(事实上,对于现代内核而言,检查 NULL 可能是一个彻头彻尾的错误) .正确的顺序应该是:

f = filp_open("/etc/fedora-release", O_RDONLY, 0);
if (IS_ERR(f)) {
// inspect the value of PTR_ERR(f), get the necessary clues
// negative values represent various errors
// as defined in asm-generic/errno-base.h
}

只有这样您才能继续诊断读数。

关于c - 从 Linux 内核模块的用户空间打开文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20753307/

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