Compile Linux Module

在学习内核的时候总是有一种在学习理论的感觉。应该很多东西都实验不了。比如说内核的寄存器、全局变量等等。像内核空间的地址在正常的用户空间就根本接触不到。

但是当我看到了Linux的模块的时候,我发现这个问题解决了!我们完全可以通过插入一个自定义的模块来了解内核态的情况。

于是,今天依样画葫芦写了一个helloworld的模块。代码如下:

hello.c

[coolcode lang=”cpp”]
#include “linux/init.h”
#include “linux/module.h”
MODULE_LICENSE(“GPL”);
static int hello_init(void)
{
printk(“Hello,world!n”);
return 0;
}
static void hello_exit(void)
{
printk(“Good Bye!Exit!n”);
}
module_init(hello_init);
module_exit(hello_exit);
[/coolcode]

Makefile:
[coolcode]
obj-m += hello.o
default:
make -C /usr/src/linux SUBDIRS=$(PWD) modules
clean:
rm -f .*.cmd *.mod.c *.o *.ko -r .tmp*
[/coolcode]
很奇怪的Makefile,不是吗?当然,这个是2.6内核专用的。
更奇怪的是,我make的时候出了好多错:

make -C /lib/modules/2.6.8-2-686-smp/build/ SUBDIRS=/home/marvel/programming/module modules
make[1]: Entering directory `/usr/src/kernel-source-2.6.8′
CC [M] /home/marvel/programming/module/hello.o
In file included from include/linux/init.h:4,
from /home/marvel/programming/module/hello.c:1:
include/linux/config.h:4:28: error: linux/autoconf.h: 没有那个文件或目录
In file included from include/linux/module.h:10,
from /home/marvel/programming/module/hello.c:2:

没有找到autoconf.h,这个可是源码包,怎么会少文件呢?郁闷……

尝试直接gcc -c hello.c,错误更多:

In file included from /usr/include/linux/sched.h:12,
from /usr/include/linux/module.h:10,
from hello.c:2:
/usr/include/linux/jiffies.h:84: error: syntax error before ‘jiffies_64’
/usr/include/linux/jiffies.h:88: error: syntax error before ‘get_jiffies_64’
/usr/include/linux/jiffies.h: In function ‘timespec_to_jiffies’:
/usr/include/linux/jiffies.h:320: error: called object ‘u64’ is not a function
/usr/include/linux/jiffies.h:320: error: called object ‘u64’ is not a function
/usr/include/linux/jiffies.h:320: error: ‘NSEC_PER_SEC’ undeclared (first use in this function)
/usr/include/linux/jiffies.h:320: error: (Each undeclared identifier is reported only once
/usr/include/linux/jiffies.h:320: error: for each function it appears in.)
/usr/include/linux/jiffies.h:321: error: called object ‘u64’ is not a function
/usr/include/linux/jiffies.h:321: error: called object ‘u64’ is not a function

Linuxsir上寻找帮助无果,只能自己动手。先从/usr/include/linux/下复制一个autoconf.h文件过来,然后将asm-i386建立一个asm的链接(其实那一堆错误还有没有找到asm/下的文件)。这样似乎大体可以了,但是最后说什么缺少script/basic/下的一个可执行文件。很明显了,这个文件需要在编译内核的时候生成。

不管怎么样,先重新编译一个内核试一试。没想到编译到一半,make居然成功了。 :)

后来分析了一下 ,我认为原因是这样的。#include的init.h文件就在/usr/src/linux/include/linux目录下,但是这个目录开始的时候没有autoconf.h这个文件,它应该是在编译之前自动生成的,而asm也是自动建立的。至于那个可执行文件,当然是编译中间生成的啦。

事实上,这些文件是在make  [menu|x]config 的时候生成的。理论上内核2.6有结构树,所以不需要编译整个内核,当然你可以试一试编译内核,之后make-kpkg clean就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值