红联Linux门户
Linux帮助

Linux0.01内核分析的一点心得

发布时间:2006-08-13 12:00:07来源:红联作者:hfh08
  Linux0.01内核基本上分析完了,高版本的内核也看了一点。有一点心得与大家分享一下吧!这里我并不打算说具体的技术方面的东西,而是针对读内核的方法,谈谈自己的一点感受。

  我前段时间主要看的是0.01版本的内核。Linux0.01是Linux的"祖师爷"Linus完成的最早的一个Linux版本,其内核编译后仅仅只有512K,麻雀虽小,五脏俱全,0.01包括了从软盘启动、文件系统、控制台管理的操作系统完整功能,并提供了不少标准的用户接口,具体有kernel, boot, fs, init,mm等几个部分,没有网络部分。为什么选择Linux0.01?各位大虾一看到0.01肯定直摇头:哎呀,都什么时代的东东了,有看的必要么?笔者当初选择0.01并没有太多的想法,只是Tm-linux小组刚开始选择的是0.01,于是就开始读吧,现在仔细想想,读Linux0.01对于初学者来说可能更容易上手些。可能有下面的几个好处吧

  1)0.01的代码量较小。很多同学都曾有成为Linux高手的欲望,也曾抱回若干砖头书,但 Linux的发展何其之快,而coder又是黑客型高手,往往坚持不了多长时间而中途放弃!

  2)0.01的代码简单而精简(这个简单当然是相对于后续版本而言的)。实际上0.01完成的就是一个操作系统的最初的要求,包括启动,进程调度,内存管理等,而这些往往与硬件结合,在看高版本的内核时往往还没有接触到这些硬件知识,层层下调已经把你搞糊涂了。

  3)从低版本看更能看到技术进步的源动力,比如0.01的内核很小,其启动代码可以只放在一个扇区内,而后续版本的内核较大,无法放入一个扇区内,于是压缩核心的装入方法诞生了。再如内存管理,0.01的内存管理比较简单,内存的申请释放直接通过使用前申请,使用后释放,但考虑以后的版本功能复杂,如何解决可能的"外碎片"问题,如何解决内存不足的问题,于是对后续版本采用的"伙伴算法",slab技术,页面守护进程有更好的理解。

  我说上面的这一些并非是为0.01做广告啦,而是提醒一下读内核可能遇到的问题:

  比如说层次复杂难以理清,代码众多不知主次,哪些是操作系统必需的,那些是为提高系统性能的等。看内核的目的是什么,这是每个看内核的人都需要问问自己的问题。我想对于大多数初看内核的人来说,最重要的是解决从操作系统原理到一个实际操作系统的过渡,简单一点说是操作系统到底是怎么跑起来的。操作系统原理大家都学了,但一个操作系统到底是怎么启动的,所谓的保护模式到底是怎么一回事,进程调度和切换到底是怎么进行的,一个文件系统具体应该怎样,可能很多还是模糊的。通过看Linux内核,这些问题可以得到清晰的解答。当然,一个有强大生命力的操作系统决不会仅仅满足于能跑起来,她采用的众多先进的技术使得她有出色的性能,对于以后的工程设计、编程还有类Unix下的系统开发会有很多帮助。

  鉴于Linux的强大技术实力,在很多领域都会遇到跟其采用技术相关的,如嵌入式领域,网络接口等等。理解了内核,当然在以后的开发中可以事半功倍。

  我当初读内核的目的比较简单,我就是想看看Linux是怎么跑起来的,为什么多个进程可以互不干扰的运行。

  我读代码的工具是用的source insight,可惜不能自动识别汇编.s文件,而0.01汇编文件不少。哦,讲了这么多,还没进入主题:我的体会心得啦从哪部分开始读,一般读内核都建议从boot部分开始读,这样循序渐进,而且一般启动部分似乎最神秘,最能满足好奇心啦!不过我是从memory部分开始读的,因为对逻辑地址到物理地址的转换一直很模糊。从你感兴趣的地方开始读,在以后比较容易坚持。在读内核的方法上,我建议"先横后纵"。

  在读内核的方法上,我建议"先横后纵"。

  Souce insight的好处就是你点上某个函数,能自动显示该函数的定义,这样比较方便的跳入察看。对于刚开始看内核的人,我并不太建议一开始用这种方法。因为函数层层嵌套,等你下到最底层,早已忘了当初的调用的功能,建议只跳一层看看调用函数的注解或者简单看看函数代码猜测功能,做一些记号。我个人觉得,操作系同比较重要的是数据结构和算法,算法固然在程序中体现,而数据结构需要查看相关的头文件及相关的文件才能了解。所以刚开始时我还是采用一个文件一个文件的读,即所谓的"横",因为一个文件中的安排总是对特定的数据结构的一些操作,你有更多的机会去理解各个主要数据结构的功能,包括结构中各个子项的含义。当然不要忘了写注释啦(虽然现在的理解可能并不准确)。

  在一个模块,如FS模块的各个文件都读完之后,就采用了所谓的"纵"了,你可以选择一个比较重要的函数入手,进行层层跳入(或若干层)以领会各个数据结构间的有机关系。如fs模块涉及的主要数据结构有:超级块,节点索引块,数据索引块,高速缓冲块,文件等,在单独理解各个相关文件后,可以从do_execve入手,看一个文件从输入文件参数到最后执行的主要步骤,进而理解VFS和具体fs之间的接口。在每一个主要模块读完之后,最后自己写一份总结(书面总结啦),看看自己对这个模块的把握。因为读代码往往是比较细致的,可能专注于读懂代码本身而忽略了模块的功能和组织形式。这点我认为比较重要,所谓"牛吃草要反刍回味",读代码也许要在看完之后进行总结,这样才能上升一个层次,真正理解其方法和结构的精妙之处。

  最后,谈谈看Linux内核需要的一些基础吧

  1) Intel386硬件知识,比如各寄存器,TSS,段描述表(IDT,GDT,LDT)等,段页转换机制等(高版本的Linux支持其他硬件体系,但对intelx86的比较熟一些吧)

  2) 汇编指令,尤其是AT&T语法及其迁入式汇编,当初我初次看到诸如

  代码:


引用:
__asm__("std ; repne ; scasw\n\t"
"jne 1f\n\t" "movw $1,2(%%edi)\n\t"

"movw $1,2(%%edi)\n\t"
"sall $12,%%ecx\n\t"
"movl %%ecx,%%edx\n\t"
"addl %2,%%edx\n\t"
"movl $1024,%%ecx\n\t"
"leal 4092(%%edx),%%edi\n\t"
"rep ; stosl\n\t"
"movl %%edx,%%eax\n"
"1:"
:"=a" (__res)
:"0" (0),"i" (LOW_MEM),"c" (PAGING_PAGES),
"D" (mem_map+PAGING_PAGES-1)
:"di","cx","dx");



  这样的一条汇编语句感到头脑发胀,不过了解其格式后,多看就习惯了。

  3) 操作系统的基本知识,对于操作系统的一般理解,这个大家都有吧!

  4) 一本或几本Linux内核的参考书,有参考书总要好得多,毕竟很多数据结构不用自己去猜,我在读0。01感觉有很大不同,很多地方只能猜,不过还是有用的。至于Linux内核的书已经很多了,到都乐去看看就知道了

  5) 恒心+毅力:这是最重要的一点,初始的兴趣往往会被遇到的困难一扫而光,再加上其他杂七杂八的事情,坚持确实很困难。当初Tm-linux组刚开始参加内核分析的人不下几十,但坚持到底的也就寥寥数人(这只是0.01哦)

  6) 跟别人多多交流,毕竟个人能力有限,通过交流,可以增进知识,我很鼓励书面的交流,虽然可能需要花费一些时间来写,因为书面的东西以后可查,而书面的跟别人交流总希望正确一点,少犯错误啦。这一点西安交大做得比较好,组织了Linux内核论坛,隔一段时间聚会交流一次,每次有一主题,先有人主讲,然后大家互相讨论。这些你有些没有吗,那么恭喜你啦,因为通过读内核你就可以增加这方面的知识和经验了。

  读内核也不是最终目的,对自己在嵌入式系统的开发,或Linux的"运用自如",或者实现自己的操作系统,那才是"剑出鞘时"!估计成电读Linux内核的人不少,只是大家交流比较少,我想交流还是很重要的,虽然牛人从来都不是问出来的,但具体问题通过交流可以增加理解,提高认识。很愿意也鼓励大家通过各种方式交流,虽然我不是大牛(也不是小牛啦J),很愿意通过bbs,Email,或其他方式进行交流。罗嗦了这么多,希望自己的一点见解能对大家有所启发,也希望成电涌现更多的Linux牛人啦!
文章评论

共有 13 条评论

  1. pythonner 于 2012-12-13 10:39:58发表:

    汇编是弱项呀,看不太懂,得加紧学习了

  2. afeikuo7 于 2012-08-06 15:13:45发表:

    是的,版本越低对新手来说学到的东西越多~~

  3. Gcome 于 2012-08-03 13:35:07发表:

    今天刚发布的3.6

  4. 1715920565 于 2012-08-01 16:45:09发表:

    写得不错,学习了

  5. js001sdx 于 2009-10-26 15:55:19发表:

    xuexi>>>>

  6. wangdonghua 于 2009-10-26 14:16:21发表:

    没有学过操作系统原理, 对代码的理解好型有点难度啊 痛苦之中

  7. superspecter 于 2009-10-26 05:14:38发表:

    现在还不0.01版的内核代码下吗?
    如果有,我也看看,现在就去找……

  8. kgduu 于 2009-10-24 21:04:51发表:

    谢谢

  9. js001sdx 于 2009-10-20 08:32:13发表:

    UP!UP!UP

  10. kkk215215 于 2008-01-08 13:22:06发表:

    条条大路通罗马。学习下

  11. jerrya 于 2008-01-06 19:15:11发表:

    我要读也会先选0.01啦呵呵呵

  12. niutao0602 于 2008-01-05 17:04:27发表:

    顶,正要看呢,苦于无法入手,谢谢提示。

  13. wangling219 于 2008-01-05 09:46:02发表:

    thanks...:0wmjh(1