转自http://edsionte.com/techblog/archives/1350
昨天下午stepbystep的为其他同学演示了内核模块编程hello,kernel!在陈老师的指导下,先为大家演示了最基本的C程序hello,world。然后又一步步的转换成内核模块程序。在这一步步的转变过程中,我也发现了自己在学习内核模块中的不足,下面将下午遇到的一些问题总结如下。
一个简单的hello,world程序如下:
#include <stdio.h> int main() { printf("hello,world\n"); return 0; }
gcc hello.c -o hello
在预处理阶段,一般输入的是.c文件,而输出的是.i文件。在此阶段中通常会处理源文件中的预处理命令,比如#define,#include,#ifdef等命令。如果想要生成这种.i中间文件,那么可以使用下面命令:
gcc -E hello.c -o hello.i
gcc -S hello.i -o test.s
gcc -c test.s -o test.o
gcc test.o -o test
gcc -c test.c -o test.o gcc test.o -o test
了解普通文件的编译过程,我们现在就将hello.c中的代码转换成模块编程中的.c代码。首先我们要更改头文件:
#include <\linux/kernel.h\> #include <\linux/module.h\>
其次,printf到printk是一个典型的用户态下编程与内核模块编程的不同。可能我们一开始会比较奇怪,为什么我make成功,加载也成功,但是就是不能显示printk里面的语句呢?我们可以这么想printk就是专门为内核“服务”。它一般输出的语句都在内核的日志文件当中。