/proc文件系统下创建文件读取内核信息
本文模仿linux内核源码fs/proc/下各.c文件的写法,在/proc下创建一个文件读取CR3寄存器的值。
1. reg_cr3.c
1 #include <linux/kernel.h>
2 #include <linux/proc_fs.h>
3 #include <linux/seq_file.h>
4 #include <linux/module.h>
5
6 MODULE_LICENSE("GPL");
7
8 static int get_reg_cr3(struct seq_file *m, void *v)
9 {
10 unsigned int cr3;
11
12 cr3 = read_cr3();
13 seq_printf(m, "%X\n", cr3);
14
15 return 0;
16 }
17
18 static int reg_cr3_proc_open(struct inode *inode, struct file *file)
19 {
20 return single_open(file, get_reg_cr3, NULL);
21 }
22
23 static const struct file_operations reg_cr3_proc_fops = {
24 .open = reg_cr3_proc_open,
25 .read = seq_read,
26 .llseek = seq_lseek,
27 .release = single_release,
28 };
29
30 static int __init proc_reg_cr3_init(void)
31 {
32 proc_create("reg_cr3", 0, NULL, ®_cr3_proc_fops);
33 return 0;
34 }
35
36 static void proc_reg_cr3_exit(void)
37 {
38 remove_proc_entry("reg_cr3", NULL);
39 }
40
41 module_init(proc_reg_cr3_init);
42 module_exit(proc_reg_cr3_exit);
2. Makefile
1 obj-m += reg_cr3.o
2
3 CURRENT_PATH:=$(shell pwd)
4 LINUX_KERNEL:=$(shell uname -r)
5 LINUX_KERNEL_PATH:=/usr/src/kernels/$(LINUX_KERNEL)
6
7 all:
8 make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules
9 clean:
10 make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean
3. make //生成reg_cr3.ko
4. insmod reg_cr3.ko //加载内核模块
5. lsmod | grep reg_cr3 //查看内核模块是否加载成功
6. 进入/proc/目录,存在reg_cr3文件,cat /proc/reg_cr3 即可打印CR3寄存器的值
7. rmmod reg_cr3.ko //卸载内核模块
8. 进入/proc/目录,reg_cr3文件不存在。