gpt4 book ai didi

c - 在 Linux 内核模块中读/写文件

转载 作者:太空狗 更新时间:2023-10-29 16:15:21 24 4
gpt4 key购买 nike

我知道所有关于为什么不应该从内核读取/写入文件,而是如何使用 /procnetlink 来执行此操作的讨论。无论如何我都想读/写。我也读过 Driving Me Nuts - Things You Never Should Do in the Kernel .

但是,问题在于 2.6.30 没有导出 sys_read()。相反,它包含在 SYSCALL_DEFINE3 中。因此,如果我在我的模块中使用它,我会收到以下警告:

WARNING: "sys_read" [xxx.ko] undefined!
WARNING: "sys_open" [xxx.ko] undefined!

显然 insmod 无法加载模块,因为链接没有正确发生。

问题:

  • 如何在 2.6.22 之后的内核中读取/写入(其中 sys_read()/sys_open() 未导出)?
  • 一般来说,如何在内核中使用包含在宏 SYSCALL_DEFINEn() 中的系统调用?

最佳答案

您应该知道,您应该尽可能避免从 Linux 内核中进行文件 I/O。主要思想是“更深一层”并调用 VFS level functions而不是直接使用系统调用处理程序:

包括:

#include <linux/fs.h>
#include <asm/segment.h>
#include <asm/uaccess.h>
#include <linux/buffer_head.h>

打开一个文件(类似于打开):

struct file *file_open(const char *path, int flags, int rights) 
{
struct file *filp = NULL;
mm_segment_t oldfs;
int err = 0;

oldfs = get_fs();
set_fs(get_ds());
filp = filp_open(path, flags, rights);
set_fs(oldfs);
if (IS_ERR(filp)) {
err = PTR_ERR(filp);
return NULL;
}
return filp;
}

关闭一个文件(类似于close):

void file_close(struct file *file) 
{
filp_close(file, NULL);
}

从文件中读取数据(类似于pread):

int file_read(struct file *file, unsigned long long offset, unsigned char *data, unsigned int size) 
{
mm_segment_t oldfs;
int ret;

oldfs = get_fs();
set_fs(get_ds());

ret = vfs_read(file, data, size, &offset);

set_fs(oldfs);
return ret;
}

将数据写入文件(类似于pwrite):

int file_write(struct file *file, unsigned long long offset, unsigned char *data, unsigned int size) 
{
mm_segment_t oldfs;
int ret;

oldfs = get_fs();
set_fs(get_ds());

ret = vfs_write(file, data, size, &offset);

set_fs(oldfs);
return ret;
}

同步更改文件(类似于 fsync):

int file_sync(struct file *file) 
{
vfs_fsync(file, 0);
return 0;
}

[编辑] 最初,我建议使用 file_fsync,它在较新的内核版本中已不存在。感谢提出更改建议但更改被拒绝的可怜人。编辑在我审核之前被拒绝了。

关于c - 在 Linux 内核模块中读/写文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1184274/

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