在测试创建文件时,一直创建失败,测试发现需要提升内存访问权限到 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