总结了一个VMWare下内核程序hello.c的学习过程。
编写hello.c文件
#define MODULE
#include <linux/module.h>
int init_module(void)
{
printk("Hello,World!\n");
return 0;
}
void cleanup_module(void)
{
printk("Goodbye cruel world \n");
}
编译:
#gcc -c hello.c
#insmod ./hello.o
出现如下错误:
hello.o: kernel-module version mismatch
hello.o was compiled for kernel version 2.4.20
while this kernel is version 2.4.20-8.
原因:编译内核源代码版本和编译器版本不一致造成的。
有3中解决方式:
1、打开/usr/include/linux/version.h文件,把#define UTS_RELEASE "2.4.20"修改为#define UTS_RELEASE "2.4.20-8"。再用gcc重新编译。
2、用insmod -f ./hello.o强制把hello文件加载到内核里。
3、用vi /usr/scr/linux-2.4/include/linux/version.h中定义为2.4.20-8版本,用如下命令进行编译:gcc -c -I/usr/src/linux-2.4/include hello.c 再装载就可以了。
然而有出现了另一个问题:
Warning: loading hello.o will taint the kernel: no license
See http://www.tux.org/lkml/#export-tainted for information about tainted modules
Module hello loaded, with warnings。
注册的问题,解决办法如下,用vim hello.c 再hello.c文件中添加MODULE_LICENSE("GPL");如下:
#define MODULE
#include <linux/module.h>
MODULE_LICENSE("GPL");
int init_module(void)
{
printk("Hello World!\n");
return 0;
}
void cleanup_module(void)
{
printk("Goodbye!\n");
}
:wq 保存。
再用gcc -c编译hello.c文件,再insmod ./hello.o文件正常,然而还是没有printk的输出。然而可以用 命令:cat /proc/modules 查看到加载成功。
现在需要用执行 dmesg 命令就可以看到输出了。
huanan_(编)
用户385532 2009-1-21 08:27