Daily Archives: January 1, 2006

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就可以了。

元旦

这是2006年的第一个晚上,可惜我却没怎么意识到这一点。除了BBS上的十大和日历中的1.1,没有任何迹象说明这是新的一年的开始。

这是我在哈尔滨待的第一个晚上,也是最后一个晚上。前者是就阳历2006年而言,后者是就阴历2005年而言。明晚,我已经在南下的火车上了。

很有意思,今年我是我们寝室第一个走的。而去年,我是最后一个走的。当时,我在寝室中一个人睡,那时候有传闻,一个研究生在寝室里一个人住,结果吃烧鸡中毒,死了。想想的确挺恐怖的,打开门,竟然发现一个死了有多日的人!而那个人,自己在over的时候,我不知道他的感觉是什么样的,但我知道那晚,我的确是比较害怕、无助。在二公寓这种连凌晨三点都会有人的“干净”的地方,谈鬼无非是自己吓自己。那晚我真的被吓倒了,至少是失眠了。要知道,失眠对于我来说,是上个世纪的事情了,这个问题以后再谈。
回到现实,我要早点回去收拾东西。走在马路上,从来没有发现原来这里还是这么美。马路上因为下雪的关系,现在都是冰渣,在这种环境下,更准确的说应该是冰晶。它们在路灯下,在月光下,随着我的移动,不断变换着闪烁着,那效果,即使是最好的灯光师也无法做出来的。而我,仿佛是亲身经历一出绝伦的舞台剧。

是啊,我何尝不是在经历舞剧呢?悲剧、喜剧、正剧,每天都在上演,今天,也许我是主角,也许是一个路人甲。我不是一个好的演员,聚光灯下表现得不如平常放得开,但是毫无疑问,我会尽力演好我的角色。

人生不乏高潮,我不喜欢高潮,因为这意味着你必须为高潮付出很多铺垫,这通常很累。高潮越高,铺垫就越多。高潮之后,留下的是真空,高潮越高,真空越空。所以,我宁愿去演肥皂剧,每天都是温馨的生活,如果实在心里闷的慌,可以不经意的制造一些高潮,但是还是会围绕温馨这个主题。所以我特别想做阿甘那样的人,他的生活就是我的桃花源境。做人可以不考虑太多得失,想跑就跑,想停就停。做自己爱做的事情,也许这就是生活……