上午还在为修改内核的问题发愁,到现在已经不为这件事情发愁了,又更愁的事了。
今天要做的事情很简单,在 fs/block_dev.c 里保存一个变量, 在 fs/ext3/inode.c 里去调用。我开始看到这两个文件都包含了一个头文件 mpage.h , 就想用最传统的方法,在头文件中加一句 extern ..., 然后随便在一个文件中定义这个变量就可以了。可是事实是,内核在编译了近一个小时的时候出错了,泪奔呀。
后来问了问QW,他说这是个很愚蠢的问题。模块间互相调用要用 EXPORT_SYMBOL 宏导出。我然其言,再试,又出错了。这次再把他请过来一问,他又很不屑:你加反了。应该是先有内核后有模块,把定义加在模块代码中内核编译时,还没有模块呢。
我悄然大悟,再把定义改在了内核中,果然成功了。
通过这件事情明白了,在编译内核时,“内核”和“模块”其实是“平级”的,内核是最早生成的模块,所以用于在模块间导出函数的宏 EXPORT_SYMBOL ,也可以用于在内核和模块之间。至于这个宏的工作原理,我还不了解,有时间了了解一下。
最后总结一下编译内核的过程:
因为有 .config 文件,不用自己配置,make 一把就过了。然后 make modules_install, 最后 make install。最后一步完成,grub里的menu.lst 文件也改了。爽。开机选择启动就行了。2.6 的内核,编译起来真是方便很多。