自学内容网 自学内容网

【linux】内核文件创建以及写文件

在测试创建文件时,一直创建失败,测试发现需要提升内存访问权限到 KERNEL_DS。内核使用系统调用参数肯定是内核空间,为了不让这些系统调用检查参数所以必须设置set_fs(KERNEL_DS)才能使用该系统调用。记录一下

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/uaccess.h>

static mm_segment_t old_fs;

int test(void)
{
 int ret;
    struct file *filp;
    mm_segment_t old_fs;
    loff_t pos;
    const char *filename = "/path/to/file.txt";
    const char *content = "Hello, world!\n";
     /* 保存当前的内存访问权限级别 */
    old_fs = get_fs();

    /* 提升内存访问权限到 KERNEL_DS */
    set_fs(KERNEL_DS);
   
    /* 使用 filp_open() 创建文件 */
    filp = filp_open(filename, O_CREAT | O_RDWR, 0644);
    if (IS_ERR(filp)) {
        ret = PTR_ERR(filp);
        pr_err("Failed to create file '%s': %d\n", filename, ret);
        goto restore_fs;
    }

    /* 写入文件内容 */
    ret = kernel_write(filp, content, strlen(content), &pos);
    if (ret < 0) {
        pr_err("Failed to write to file '%s': %d\n", filename, ret);
        goto close_file;
    }

    pr_info("File '%s' created successfully.\n", filename);

close_file:
    /* 关闭文件 */
    filp_close(filp, NULL);

restore_fs:
    /* 恢复内存访问权限 */
    set_fs(old_fs);
    return ret;
}

保存当前的内存访问权限级别到 old_fs 变量。
提升内存访问权限到 KERNEL_DS。
使用 filp_open() 以写入模式创建文件。
使用 kernel_write() 将内容写入文件。
关闭文件。
最后将内存访问权限恢复到之前保存的级别。

参考:
https://www.cnblogs.com/friedCoder/articles/12375700.html


原文地址:https://blog.csdn.net/qq_45698138/article/details/140210644

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!