在SMEP的测试中需要在kernel态去执行标志有user bit的一段内存代码,所以需要写一个简单的module来模拟。了解了一下写一个Linux module的基本方法,下面总结一下。
0. 准备一个linux系统,当让GCC、Make等基本的工具是需要有的。
1. 安装kernel源代码:在Ubuntu上可以用 apt-get install linux-headers-$(uname -r),在RHEL等上可以用yum install kernel-devel来安装。或者去kernel.org下载代码包来解压到/usr/src目录。
2.写一个Makefile:mkdir hello; cd hello; vim Makefile
一个简单的Makefile文件的示例如下:
1 2 3 4 5 6 |
obj-m = hello.o KVERSION = $(shell uname -r) all: make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules clean: make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean |
3.写一个简单的module:hello.c 示例如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include /* Needed by all modules */ #include /* Needed for KERN_INFO */ #include /* Needed for the macros */ MODULE_AUTHOR("Jay, "); MODULE_DESCRIPTION("Jay's first module."); MODULE_LICENSE("GPL"); MODULE_VERSION("Version-0.0.1"); static int __init hello_start(void) { printk(KERN_INFO "Loading hello module...\n"); printk(KERN_INFO "Hello, Jay.\n"); return 0; } static void __exit hello_end(void) { printk(KERN_INFO "Goodbye, Jay.\n"); } module_init(hello_start); module_exit(hello_end); |
4. 编译这个module,命令:make。 编译好后,可以看到生成了hello.ko这个module。
5. 安装这个module:insmod hello.ko (之后可以用lsmod | grep hello来查看是否安装成功)
6. 查看加载module的log:dmesg | tail; 或者 tail /var/log/messages; 可以看到在hello.c中写一些Kernel info。
dmesg中示例为:
[136161.503081] Loading hello module...
[136161.503083] Hello, Jay.
/var/log/messages中示例如下:
Sep 15 22:22:03 jay-intel kernel: [136161.503081] Loading hello module...
Sep 15 22:22:03 jay-intel kernel: [136161.503083] Hello, Jay.
7.modinfo hello来查看module的一些信息(在hello.c中写的作者、表述、License、版本等信息),本文示例为:
1 2 3 4 5 6 7 8 |
filename: hello.ko version: V0.0.1 license: GPL description: Jay's first module: hello, Jay. author: Jay, srcversion: 2F7FF08C52DC08E92E4EF39 depends: vermagic: 2.6.32-29-generic SMP mod_unload modversions |
8. 卸载module: rmmod hello; 卸载后,可以看到dmesg中有我留下的信息“Goodbye, Jay”。
至此,你已经看到了linux中写一个最简单的module的步骤了。
参考资料:
http://www.cyberciti.biz/tips/compiling-linux-kernel-module.html
http://www.tldp.org/LDP/lkmpg/2.6/html/index.html