linux kernel学习路线

学习路线一

先了解操作系统基本概念。如果不会,可以学习《操作系统:设计与实现》Andrew S.Tanenbaum 写的那本。以MINIX为例子讲解操作系统的概念。

非常推荐一本基础教材叫做Linux内核情景分析。下面是看这本书的建议:

(1) 首先重点阅读“第1章预备知识”和“第2章存储管理 ”这两章,特别是对于不太熟悉X86架构和段式/页式内存管理的读者。这不仅是因为这两章奠定了全书的基础,还在于“预备知识”这一章虽然篇幅不大,但对Linux的来龙去脉和X86内存管理机制的历史渊源作了详尽的介绍,使读者能够了解到一些内核机制存在的原因和历史背景,我一直认为要了解一项工程技术,首先要了解的是其作用和起源,然后才能更好地掌握其内部实现;再者,第一章和第二章的开头部分很少涉及代码,主要是作者对历史和内存机制的讲解,看起来不会枯燥,同时也可对作者的叙述能力有所领略,不失为阅读本书的好起点。

(2)关于设备驱动,“第8章设备驱动”占了全书篇幅的约1/4(全书1500多页),但其覆盖的内容也只是冰山一角。作者也特别提到:“由于设备的多样性,设备驱动是一个需要整本专著的大课题”,“此外,有些设备的原理和机制就很复制,需要有专著加以介绍。我们既无足够的篇幅,也缺乏有关的专门知识来深入阐述这些设备的原理、机制和操作”。 尽管如此,对于想了解设备驱动的读者,“第8章设备驱动”仍然值得一读,而且《情景分析》不是一本Linux内核说明书或开发者手册,而是一本带领读者掌握Linux核心原理和了解其背后设计思想的书,作者的一些观点在其他书中难得一见,可以把第8章看做是设备驱动的导读,带着这章提供的全局视角去阅读其他设备驱动的专著,相信会有一览众山小的感觉。

(3)本书前后章节有很强的依赖关系,对于没怎么接触过Linux的读者建议还是按原文章节顺序阅读,否则直接跳到后续章节阅读会有寸步难行的感觉;而对于已经熟悉Linux的主体框架,想深入理解某个模块的读者,大可以按需挑选章节阅读。

有了操作系统的基本概念以后,可以了解Linux的机制了。推荐《Linux内核设计与实现》Robert Love 写的。这本书从概念上讲解了Linux有什么,他们是怎么运行的。这本书要反复认真看透。

有了Linux内核的了解,还需要具体研究Linux内核源码。最经典的就是《深入理解Linux内核》Daniel P. Bovet 写的。学习这本书的时候,要对着内核代码看着学。这本书学起来相当费力了,那么多多代码要研究。不过这本书如果学明白了,恭喜你,Linux内核你已经很熟悉了。

如果要开发设备驱动,可以学习《linux设备驱动程序》O’Reilly出版社的。这本作为驱动的入门是很好的资料。另外还有一本《精通Linux 驱动程序开发》也是不错的教材,可以参考着看。学习驱动,免不了要学习一些硬件的协议和资料,研究哪个就找到相应的硬件文档,把硬件的工作原理搞明白。这些就不细说了。

网络部分,学些Linux网络部分就学习《深入理解LINUX网络技术内幕》。这本书把Linux的网络部分讲的非常清晰透彻。但是通常不做这方面的工作研究,也不用研究这么深,毕竟现在国内相关职位较少。

现在Linux相关的工作,多集中在一些嵌入式开发领域,arm,mips等,要学习以下这些体系架构的的资料,了解CPU的设计和工作方式。ARM就看对应的芯片手册,讲的很细致。MIPS就看 《see mips run》,有一二两版,两版内容有些差异,推荐都看。

补充一点经验。不要认为Linux很庞大,很复杂,就觉的很难学。任何东西认真学下来都是能学会的,看你都恒心和毅力了。另外,不要走弯路,不要看市面上讲什么Linux0.11的那些书,直接学你要学的东西。就像学C语言看什么谭浩强一样,弯路走了,力气没少花,还严重影响学习效果。

顺便说几句应用linux编程,有时候经常会需要的:

学习Linux应用编程,建议看《unix环境高级编程》,把里面的例子都做一遍,会对整个Linux编程有系统都认识。
针对Linux,有本 《Linux系统编程》,学完上一本,这本很快看一遍就懂了。主要是针对Linux具体懂一些内容,讲的挺全了,很实用。
Linux网络编程,系统的学习一下《unix网络编程.卷1,套接字联网api》,基本上网络应用相关的程序就都没问题了。
这些内容,你分几年时间,分步计划学习,就会成为Linux高手了。 可以修改IP,或同时修改CS和IP的指令统称为转移指令。概括地讲,转移指令就是可以控制CPU执行内存中某处代码的指令。

学习路线二

初一开始拿到赵炯的书时是兴奋的,代码几乎每行都有注释,心想这不手到擒来的吗。但是代码看到十几行就看不下去了,没错就是十几行,操作系统的代码跟应用层的代码完全是两回事,注释再多也不明白什么意思。后来才知道需要 实模式和32位保护模式 的基础,这个是操作系统的核心知识。 这里总结一下需要的基础知识。按学习顺序:

《汇编语言_第2版》,王爽
《x86汇编-从实模式到保护模式》,余洁。操作系统知识的核心
《C语言XXX》,就不多介绍了,网上一堆 ,本人具备c语言能力!
《Orange’S 一个操作系统的实现》,于渊。傻瓜式教程,从0开发一个简易操作系统
《AT&T汇编》,这个内容比较少,只要注意一下语法就行了。linux内核到处用到学完以上所有,再来看linux内核非常轻松。最后就是下面这本
《Linux内核0.11完全注释》,赵炯
有几个地方需要注意:

网上总有人说内核中汇编用到不多,不用学。这是个极大的误区,在整个内核代码中,汇编代码确实不是很多,但地位极度重要,而且穿插用在很多核心模块,并不只是启动那块才用到汇编。比如说进程切换,从高层到底层的层层流程下来,最终就是汇编的切换进程代码;还有系统调用,也是最终调用的是80中断。例子太多。而且,汇编讲的不只是汇编代码,还有计算机底层的运行机制,这对于想学操作系统的你来说,简直就是必学课程。比如说计算机刚启动时,内存是什么情况,那些中断代码放在哪里,那操作系统就不能动这里的代码等等。

《x86汇编-从实模式到保护模式》这本书不是讲汇编的,实际上是讲操作系统的书,直接从实模式开始看,实模式是讲以前的操作系统架构,然后就是现代操作系统架构32位保护模式。这本要是不看,就不用往下进行了。

于渊的那本书只看到上篇就好了,因为他的下篇是按照Minix的微内核来实现的,linux是宏内核,两者在代码实现上有很大的不同。但他上篇的内容很有价值,因为讲解得非常详细傻子都能看懂,而且基本上每章内容都和Linux内核相似。毕竟操作系统的底层基本知识都差不多。看完这本相当于有人带你学习了一遍简易版的linux内核。

AT&T汇编不是讲汇编知识的,而是讲另一种汇编语法的,所以内容比较少,linux内核里大量用到这种语法格式的汇编。分析linux内核用到的时候再看也可以,我就是这样。

最后提一点非常非常重要的,就是每看一本书一定要做笔记。因为操作系统包含大量的知识,用笔记记录每个知识点的核心,能很方便下次翻阅,因为你必定会回头来翻阅的,你不可能记住每个知识点。如果你没有这种习惯,到时候知识一多就会引发混乱,然后导致放弃。

目前我先按照该路径学习!

posted @ 2023-03-11 19:11  道阻且长行则将至Go  阅读(326)  评论(2编辑  收藏  举报