简介
在内核中读取硬盘文件,内核5.10测试了下,可以正常运行。
代码
1. 使用filp_open打开文件
2. 使用kernel_write和kernel_read读写文件
3. 使用filp_close关闭文件
#include <linux/module.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/slab.h>static int __init test_file_init(void) {char *buffer;ssize_t bytes_read, bytes_written;loff_t pos = 0;struct file *filp;char *path = "./test.txt";printk(KERN_INFO "test file inited\n");filp = filp_open(path, O_CREAT | O_RDWR, 0);if (IS_ERR(filp)) {pr_err("Error opening file\n");return PTR_ERR(filp);}buffer = kmalloc(128, GFP_KERNEL);if (!buffer) {pr_err("Failed to allocate memory\n");filp_close(filp, NULL);return -ENOMEM;}strcpy(buffer, "hello kernel");pos = 0;bytes_written = kernel_write(filp, buffer, strlen(buffer), &pos);if (bytes_written < 0) {pr_err("Error writing file\n");kfree(buffer);filp_close(filp, NULL); }pos = 0;memset(buffer, 0, 128);bytes_read = kernel_read(filp, buffer, 128, &pos);if (bytes_read < 0) {pr_err("Error reading file\n");kfree(buffer);filp_close(filp, NULL);return -EIO;}printk(KERN_INFO "read string: %s\n", buffer);kfree(buffer);filp_close(filp, NULL);return 0;
}static void __exit test_file_exit(void) {printk(KERN_INFO "test file exited\n");
}module_init(test_file_init);
module_exit(test_file_exit);MODULE_LICENSE("GPL");
历史
- 据说以前在内核中读写文件要使用get_fs set_fs等函数强制把上下文切换到用户上下文,这样才能在内和中读写文件。
- 后来,get_fs和set_fs被认为不安全,换成了force_uaccess_begin和force_uaccess_end切换,但是同样被认为是不安全的。
- 5.10以后得版本,1和2中的方法都被弃用了。直接用kernel_write和kernel_read读取就可以了。
插入内核模块运行
insmod test.ko
在日志文件里查看: