Header檔:
#include <linux/fs.h>
#include <linux/file.h>
#include <asm/uaccess.h>
程式碼:
char *path = "/abc/test"
struct file *fp = NULL;
mm_segment_t old_fs;
u8 buf[256];
fp = filp_open(path, O_RDONLY, 0);
if (fp == NULL) {
return -1;
}
old_fs = get_fs();
set_fs(KERNEL_DS);
fp->f_op->read(fp, buf, sizeof(buf), &fp->f_pos);
set_fs(old_fs);
filp_close(fp, NULL);
主要重點是紅字的部份
簡單來說是要防止User space破壞到Kernel space的內容
傳遞給->read / ->write的參數因為是kernel的位址
會被認為不合法, user被禁止存取,
所以要先把ds改成kernel, 才不會被誤認成user
大概是個root的概念
不過操作完記得設回來
沒有留言:
張貼留言