我知道所有关于为什么不应该从内核读/写文件的讨论,而是关于如何使用/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而不是syscall处理程序:

包括:

#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;
}

关闭文件(类似于关闭):

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++相关问答推荐

Visual Studio和Codebocks中的不同输出

了解返回函数指针的函数定义

当包含头文件时,gcc会发出隐式函数声明警告

C:gcc返回多个错误定义,但msvc—不""'

如何使用Python C API实现多线程程序?

C:scanf(%d&q;,...)输入只有一个减号

为什么在C中进行大量的位移位?

如果我释放其他内容,返回值就会出错

为什么GDB/MI进程的FIFO循环中有read()阻塞

是什么让numpy.sum比优化的(自动矢量化的)C循环更快?

解决S随机内存分配问题,实现跨进程高效数据共享

如何按顺序将所有CSV文件数据读入 struct 数组?

在for循环中指向数组开头之前

无法访问共享目标文件内的共享指针

使用%f格式说明符打印整数值

链接器脚本和C程序使用相同的头文件,这可能吗?

为什么二进制文件的大小不会随着静态数据的大小而增加?

不兼容的整数到指针转换传递';char';到类型';常量字符*

当另一个指向 const 的指针观察到数据时,通过指针更改数据是否安全?

中位数和众数不正确