在6月份做过一次《高效学习内核》的presentation,下边是后面的一部份内容及课件,其实对你们有用吧。
**********************************************************************
既然有高效,相对的就有低效。本身就是一件很唬人的事情,有些人整天潇潇洒洒没见如何用心就才能获得挺好的成绩,而有些人则相反,虽然投悬梁锥凛冽也还是成绩平平收获平平。这儿面很大一部份的缘由就是学习的方式。
然而学习方式这样的题目并不好讲,由于基于每位人不同的情况,并没有那样一个标准的方式存在,所以讲上去就很容易成为一场大误导。如同我们的任志强先生前阵子讲演买房子的方式时,就由于太像一场误导,因而被观众扔了鞋。
接出来我就通过自己的一些,抛砖引玉来介绍一下怎样比较高效的去学习linux内核。那些话并不局限于某个部份的内容,很像一句句的标语,我们也可以将它们看作内核学习的大字报。
首先是第一句话:把内核当同学。去年笑来老师有本新书,叫把时间当同学,告诉我们只有把时间当同学,能够更好的借助自己的时间做些有益的事情。同样,我们只有把内核当同事,把它置于对等的地位上,而不仅仅是一堆死气沉沉的代码,我们才才能更好的认识和理解到它的真谛。
之后是第二句话:先会使用它。意思就是我们在学习内核前首先要会用linux,根据一个由上至下循序渐进的过程,在才能熟练的使用Linux以后再去研究内核中的实现。这也是linus本人的观点。
第三句是根据四个层次进行内核学习。笛卡儿在17世纪的某三天,闲极无趣写了那么一本书,书名就叫《方法论》,在这本目前来说绝大部份人都不晓得的书里将方式上升到了理论的高度。笛卡儿在他的这本书里将研究问题的方式归纳为简单的一句话,就是“复杂问题要简单化”。就是说要将复杂的问题分解为好多个简单的小问题,一个个的分开解决。这句话其实可以借鉴运用到内核的学习上,不过须要做些改动,不是分解为多个简单的小问题,而是将内核学习如此一件很复杂的事情界定为由低到高多个不同的层次linux驱动修炼之道 下载,每一层次都有自己须要达到的目标和要求。这也是我自己觉得比较好的认识学习内核的方式。
第四句是走出心理误区。对于学习这些复杂的事情来说,无论是我们在中学的课堂学习,还是这儿说的内核学习,它的疗效好与坏,最主要取决于两个方面:一个是学习的方式,另一个就是学习时的心理。注意,在这里我无视了情商的差别,情商这玩意血刀了,可以将它归于迷信的范畴。而我们在学习时常常会形成一系列的问题或则说误区,只有走出这种误区,在学习中养成一个坚强的心理,我们才才能真正的做到高效。
第五句是使用vim+cscope+ctags浏览内核源码。虽然这句话更主要的意思是说我们须要一个好的工具去浏览内核的代码。在windows下边,我们其实可以很容易的找到好多比较好的IDE可以拿来浏览代码,例如sourceinsight,它可以很便捷的在代码之间进行关联阅读。并且对于Linux新人来说,有没有一个功能类似的浏览代码的工具就成为一个很常见的问题。
第六句是使用kernel地图定位目标代码。应当说学习内核就是学习内核的源代码,而且内核代码千千万,又四处像个迷宫一样,不走失都很难,又如何去直面它?这时我们就须要这样的一幅内核地图来帮助我们去定位所要剖析的目标代码,并缩小目标代码的范围与代码量。
接出来是第七句话:剖析内核源码,心态决定一切。我们好多人似乎有这样的苦恼,也剖析浏览了好多内核的源码,可总是认为剖析完浏览完脑袋里还是空空的,并没有觉得到多大的收获。这个时侯我们其实可以去瞧瞧是不是自己在剖析代码时的心态出现了问题。我们在剖析内核源码时,只有遵守严谨的心态,去理解每一段代码的实现,多问多想多记,而不是抱着走马观花,得过且过的心态,最终必然会有很大的收获。
最后一句是:以内核源码为中心,坚持学习资源建设。在我们内核学习的过程中,内核源码本身就是最好的参考资料,其他任何精典或非精典的书最多只是起到个辅助作用,不能也不应当代替内核代码在我们学习过程中的主导地位。并且这种辅助的作用也是不可忽略的,我们须要以内核源码为中心,坚持各类学习资源的常年建设不动摇。
不仅这儿的八句话,其他的可能会对你们有帮助的感受或则方式还有好多。
把内核当同学linux培训机构,就是要把内核看成一个鲜活的生命体,而不是一堆死气沉沉的代码。
具体一点来说,我们在学习与浏览内核的实现时,可以将它看成是现实世界的映射。内核是由现实中的人写下来的,因而不管是有意还是无意,就会不可防止的包含了一些自己的现实爱情,我们研究内核时可以感受下这些脉络,这些隐藏在代码背后的哲学。例如,我们可以觉得内核是个大世界,一个个进程就是这个世界中的一个个生命体,进程管理和调度就是这个大世界中的权利机关linux运维最佳实践,显存是进程的家,内核的目标就是要做到使每位进程都居者有其屋。
既然要把内核看成是一个鲜活的个体,这么我们认识它的第一件事就是了解它的一些基本信息,如同我们人与人之间相互认识首先也是通过个人的基本信息一样。
首先从名子开始,kernel在字典中主要有两种定义,一种是“软的,一个坚果可食用的部份”,对Linuxkernel来说,其实适用的是第二种定义:“某个东西的核心部份”。所以从广义上来说,linuxkernel就是linux操作系统里最为核心的部份,而从狭义上来说,它不过就是Linus那群人人写的那点儿代码。
其实,这点儿代码是相当复杂的,单单从代码量上来说,早早已突破了千万级。从结构上来说,也早就不是一个人穷自己一己之力就才能全部理解的了。所以,如今指出第二句话:学内核切勿求大求全,选择一点研究的足够深入就很不容易了。
下边介绍介绍kernel的年纪,kernel又不是一个思春的少女,所以它的年纪并不须要保密,从1991年诞生开始,在今年刚才召开了它自己的成人礼,步入了成熟发展期。
如同我们人有自己的青春期、中年期等一样,kernel相应的也有好多不同的版本号,不过不同的是,我们的青春期一去就不复返了,kernel不同的版本号却是共存的。
好多年以来,内核的版本都是以X.Y.Z这3个数字的方式分配的,中间的质数Y代表稳定版,偶数Y代表了不稳定的开发版。所谓的稳定版本是指内核的特点都早已固定,代码运行稳定可靠,不会再降低新的特点,要改进也只是更改代码中的错误。而不稳定版本是指相对于上一个稳定版本降低了新的特点,还处于发展之中,代码的运行不大可靠。
对于目前来说,2.6内核的发布早已持续了很长时间,这么哪些时侯将会推出2.7?Linus本人的回答是,不会有2.7,他不会再依循旧的模式,新采用的模式会更好,不值得重复过去。他表示正在考虑新的编号方法,一种基于时间的版本号。诸如用2008.7代替2.6.26,中间第二个数字代表年,2008年就是2.8,2009年的第一个版本就是2.9.1,然后2010年是3.0,等等。
最后不得不提及是这些眼花缭乱的发行版,内核与发行版的关系就类似那个双生花,彼此相互依赖相互扶植共同成长。没有这些发行版,内核就只能是束之高阁的一个似乎好看的玩具,并不能真正的走入我们的工作生活,而没有内核,这些发行版就缺乏了存在的地基,就只能是个腐竹渣工程。
如今我们了解了内核这个同学的外表,这个时侯我们不能像非诚勿扰中的这些拜金女一样只关心外在的信息,我们还要接着了解内核的内涵,也就是内核的体系结构以及内核是怎样工作的。
首先看第一张图,它向我们传递了这样的信息——内核将应用程序和硬件分离开来。内核一方面负责与计算机硬件进行交互,实现对硬件的控制,调度对硬件资源的访问,另一方面为用户应用程序提供一个中级的执行环境和访问硬件的虚拟插口。
提供硬件的兼容性是内核的设计目标之一,几乎所有的硬件,只要不是为其他操作系统所订制的,都可以得到Linux的支持。
与硬件兼容性相关的是可移植性,也就是在不同的硬件平台上运行Linux的能力。从最初只支持标准IBM兼容机上的IntelX86构架到如今可以支持ARM、MIPS、PowerPC等几乎所有硬件平台,这么广泛的平台支持之所以还能成功,部份缘由在于,内核清晰地界定为了体系相关部份和体系无关部份。因而也就有了第二张图。
体系无关部份一般会定义与体系相关部份的插口,这样,内核向新的体系结构移植的过程就弄成确认这种插口的特点并将它们加以实现的过程。
同时,用户应用程序和内核之间的联系,通常是通过它和内核的中间层——标准C库来实现,而标准C库函数本身,则是构建在内核提供的系统调用基础之上。通过标准C库,以及内核体系无关部份与体系相关部份的插口,用户应用程序和部份内核都成为可移植的。
因而更为确切的是第三张图。其中,进程管理部份实现了一个进程世界的具象,这个进程世界类似于我们的人类世界,只不过我们的世界里的个体是人,而在进程世界里则是一个一个的进程,我们人与人之间通过书信、手机、网络等交通往来,而各个进程之间则是通过不同方法的进程间通信,我们所有人都在分享同一个月球,而所有进程都在分享一个或多个CPU。
在这个进程的世界里,显存是重要的资源之一,就如同我们的农地。因而,管理显存的策略与方法,也就是显存管理是决定系统性能的一个关键诱因。
了解了内核的体系结构,我们再来看看内核是怎样工作的。
首先,内核通过系统调用来促使运行在它前面的应用程序可用。系统调用是内核和应用程序之间的桥梁,例如图中的针对文件操作的open(),close(),read(),write(),针对进程操作的fork(),wait(),还有针对网路操作的socket()等等,它们提供了对硬件的具象,所以有时也被称为linux虚拟机。
内核提供的最接近实际用户的显著具象是文件系统,我们很容易就能借助open()等几个系统调用编撰一段程序打开一个文件并将它的内容拷贝到标准输出。内核通过这种系统调用为用户提供了一个文件的“错觉“,而实际上它不过是一堆数据有了个名子,这样一来就毋须去与硬件底层的堆栈、分区和表针等交涉,这也就是我们常常所说的具象(abstraction),将底层的东西以更易懂的方法抒发下来。
文件系统是内核提供的比较显著的一种具象,我们可以说它是坐落台前的,而相对还有一些是坐落幕后的,例如进程调度。在linux上,任何一个时间,都可能有好几个进程或则程序等待着运行。内核的时间调度给每位进程分配CPU时间,所以就一段时间内来说,我们会有种错觉:笔记本同一时间运行好几个程序。
再例如另外一个坐落幕后的显存管理,幕后到应用开发者都不易察觉的地步。每位程序运行得都似乎它有个自己的地址空间来调用一样,实际上它跟其他进程一样共享计算机的化学储存。显存管理的另外一个方面是避免一个进程访问其他进程的地址空间——对于多进程操作系统来说这是很必要的一个防范举措。
其实坐落台前幕后的还有其他的角色,例如网路等。
我们如今再来简单看下它的化学组成。初期版本的内核是整体式的linux驱动修炼之道 下载,也就是说所有的部份都静态地联接成一个很大的执行文件。