今天必须吐槽一下!
我有个搞内核的同事说过:对现在的新人来说,内核的学习曲线越来越陡了,不知道搞内核的这些前辈退休以后,后辈能否扛起内核这个重担。。。开始的时候还不以为然,随着这几天陆续接触内核代码,才深刻的体会到这句话的滋味。
举一个最简单的例子,我看的内核代码是2.6.11,选这个版本的原因很简单,因为有ULK3,这对于新人来说很重要,结合代码看书可以起到很好的效果。我用source insight建完工程之后发现一个很烦人的事情就是,内核里面的很多宏针对不同的arch有不同的定义,所以在查看定义或者声明的时候罗列出很多不相关的内容,找起来很乱。后来我打算把一些用不到的arch和其他代码都从工程里删掉,这样可以让搜索过程更清晰一些,于是我保留了arch下面i386,x86_64,ia64以及include下面asm-i386,asm-x86_64和asm-ia64等目录,其他的都删掉了。
后面麻烦来了,在我看到内核最终页表设置的时候,查看变量"pud_offset",发现只有asm-x86_64下面有一个定义,但是奇怪的是我当前正在看的文件是arch/i386/mm/init.c,引用asm-x86_64下的定义很不应该啊,但是又没有找到其他的地方有定义。fuck!怎么回事?纠结了很久,后来我又构建一个完整的内核代码工程,这次我搜索发现了这样一个目录asm-generic,速度google下,结果找到了答案:“每个架构都有自己的asm文件夹,放一些架构相关的。但是有些架构没有实现某些函数,为了让编译通过,就把这些东西放在asm-generic”
后来我问了下公司那个搞内核的前辈,确认了此事!!!哎,弄巧成拙啊,但是我也真心无奈,有木有人提到过这个问题啊,那么多的博客,特别是那些所谓“一步步教你xxx”,“内核xxx入门”,代码流程我们都可以慢慢看,各位大神也并非必须给我们一步步地讲,像这些点才是应该着重指出的,对于菜鸟们来说。
允许我在这发点牢骚,请前辈们谅解!希望后来学习顺利吧。。。