为了账号安全,请及时绑定邮箱和手机立即绑定

Linux内核模块中的读写文件

Linux内核模块中的读写文件

C
白衣染霜花 2019-07-10 10:49:58
Linux内核模块中的读写文件我知道所有关于为什么不应该从内核读取/写入文件的讨论,而应该如何使用/proc或NetLink去做这件事。我无论如何都想读/写。我也读过把我逼疯-你不该在内核里做的事.但是,问题是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()从内核里?
查看完整描述

3 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

您应该意识到,在可能的情况下,您应该避免文件I/O。其主要思想是“更深一层”,并呼吁VFS级函数而不是直接使用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;}

关闭文件(类似于CLOSE):

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

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

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,它在较新的内核版本中消失了。感谢那个可怜的人提出的改变,但他的改变被拒绝了。编辑在我审阅之前就被拒绝了。


查看完整回答
反对 回复 2019-07-10
?
侃侃无极

TA贡献2051条经验 获得超10个赞

从Linux内核的4.14版本开始,vfs_readvfs_write功能是不再出口在模块中使用。相反,只为内核的文件访问提供了功能:

# Read the file from the kernel space.ssize_t kernel_read(struct file *file, void *buf, size_t count, loff_t *pos);
# Write the file from the kernel space.ssize_t kernel_write(struct file *file, const void *buf, size_t count,
            loff_t *pos);

还有,filp_open不再接受用户空间字符串,因此可以用于内核访问。直接(不跳舞)set_fs).


查看完整回答
反对 回复 2019-07-10
  • 3 回答
  • 0 关注
  • 1645 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信