{eval=Array;=+count(Array);}
linux 0.11的内核源码,结合下面这本书,我花了大概一个寒假(1个半月),看了一遍。
然而,现在的内核已经膨胀的不成样子了,以还不算最新的linux-4.9.229为例:
整个内核源码一共约 801M:
驱动代码占了大概一半,大约407M:
体系相关的代码大约164M:
网路子系统相关的代码29M:
文件系统相关的代码38M:
linux内核核心代码大约7.7M:
但是就这7.7M,其实你要完全看完看懂也不容易。linux内核代码涉及c语言、硬件组成原理、操作系统、数据结构和算法等,这些基础知道你都具备了吗?如果没有具备,即使看完linux内核源码,你也看不懂liux内核的精髓。
linux内核源码大而全,一个人,即使再聪明、再有精力,也不可能完全看完、看懂所有的linux内核源码。你得选择一个主线进行深入研究,这些主线可以是:
沿着某一个主线,深入进去,在研究清楚这个主线的同时,向其他的主线扩展、渗透和学习。由点到线、由线到面、由面到体,层层深入、不断精进,是学习linux内核源码的一个有效的方法。
关注”技术简说“,带你由浅入深学习linux内核源码。linux内核开发100讲免费教程,每周二、周四晚上9点更新视频,每周一、周三晚9点更新文章,敬请收看。进我主页点”视频“栏目即可观看。
linux内核不需要看完,分分类,选几个必须看的研究一下,多数不需要看。
内存管理,中断管理,进程管理,进程调度,设备管理,inode数据结构等是必修的,设备驱动看俩代表性的,串口的,键盘的, 磁盘的。文件系统看一个意思一下,文件系统很多,代码太多一辈子都看不完。中断管理要多看看,涉及到很多定时,包括进程调度。
当年我花一学期陆陆续续看完所以unix内核代码,但那时的代码少,就2,3万行,现在linux全部内核一辈子也看不完。
老铁,我也在学习linux内核,我说一下我的想法吧。
我曾经很早的时候就想学习linux内核了,当时准备啃书,并对着代码看,热情了一阵子,可由于太深奥就不了了之了。
最近工作原因,涉及到内核文件系统的研究,重新学习内核,感觉比较容易弄懂了。为了避免走弯路,我建议:
1. 不要一来就对着内核源码啃。内核源码压缩后现在都一百多M了,有生之年你也别想全看完弄懂,各种算法,诡异的写法会弄晕你。
2. 先找一些内核实现原理的书来大致看一遍,这个时候不必深究细节,不懂的就做一些问题清单记起来。
3. 内核由几大模块构成,你要大概了解它们的相互关系。例如进程中就记录了打开的文件信息,进程的地址空间主要内存管理模块来分配和管理内存。
4. 选择一个模块作为切入点,通过实验对内核下手!我是从文件系统这块开始的,比较简单这次没有搞晕我了。
5. 必须动手实验,光看书是没用的!!!你亲自通过加打印,或断点调试跟踪代码调用路径,通过自己写代码实现一些功能后,你自己会豁然开朗,信心大增了!
希望我的回答对你有用!
linux内核代码算是开源社区里面一盏明灯般的存在,虽然代码是开源但是核心领域能够看懂并且能够真正修改的数量极其的稀少了,大部分代码的更新更多是外围设备功能的增添,这种修改距离内核级别的改动还是存在本质的差异,而且很多中国的程序员已经参与到很多模块代码的提交了,证明了中国软件行业也在快速发展壮大过程中,证明了很多国内程序员已经度过了最原始的积累过程。
从一个程序员对于编程系统掌握的层次来讲,首先是基础编程语言的语言学习过程,然后是能够看懂代码,最后是代码的项目实战过程中,其实看代码和写代码的过程两者属于相辅相成的过程,不断的研究代码机构从中汲取精华然后应用到实际环境中,在实际项目中找到具体的场景把自己掌握的一些理论模型在实战中发挥出来,这种属于学以致用的典型,所以一个成熟的程序员需要不断的研究新的代码机构,然后想办法在实践中展示自己的能力,形成良性的循环在现实中很多程序员在初级入门阶段还是积极的学习优秀的代码,在掌握了一定层次的编程能力之后就放慢了学习的脚步,这种模式下非常容易慢慢落伍。
如果从一个普通C++程序员的角度慢慢学习linux内核,需要具备以下几种基础首先由一个认知linux内核的代码是C语言和汇编完成,单纯的C++未必能够满足其基本的研究需要,所以先要把C语言的基础语法以及内部关键的语法掌握清楚,同时掌握一定的汇编知识,在linux内核的影响效率的地方会使用汇编,所以掌握了汇编和C语言基础的语法之后再去尝试研究linux内核源码,如果不准备好基础编程语法,去研究linux内核将是一种灾难般的存在;对linux内核的api接口有一定的了解,了解外围的调用接口才能有助于了解内部是如何实现的,对于linux内核的驱动常规知识也需要有一定程度的掌握。
至于需要多长的时间能够看完linux内核知识,这种时间是无法确定有些人linux内核已经研究十几年了还是觉的里面有很多不了解的地方,可以尝试先从基础的模块开始熟悉从宏观上了解其工作原理,然后根据自己的兴趣爱好找到感兴趣的模块进行研究学习,不要指望多长时间能够掌握透彻,能够当成一辈子研究的事业去做,不要尝试给自己设定时间去完成学习linux内核这种巨大的工程,可以设定时间掌握宏观的框架,但更合适的做法是当成一种兴趣爱好长期去做,希望能帮到你。
Linux内核分为CPU调度、内存管理、网络和存储四大子系统,针对硬件的驱动成百上千。代码的数量更是大的惊人。看看最新的关于内核代码量的统计。
从图中可以看出,2020年1月份,内核的代码量大约是2千6百万行。回忆你一下你一天能看懂多少代码?反正我自己觉得自己一辈子都看不完Linux内核的代码。
其实阅读代码无非是为了学习代码中有用的内容,所以,我们没有必要阅读所有的代码,只需要阅读关键的代码,或者说对自己有用的代码。
由于内核分为四大子系统,因此我们可以选择自己相关的子系统来阅读。比如你是做存储相关的,可以阅读存储栈相关的代码,如果你是做网络的,你可以做网络相关的代码。
对于代码阅读方法从两个角度来介绍,一个方面是需要选择一个比较有效阅读代码的工具,这样能辅助我们来理解代码;另外一个方面是先阅读基础代码,比如链表,自旋锁等等。
当然,Linux内核确实博大精深,想要一下子搞明白是不可能的。
有些人推荐先阅读一些低版本的内核,比如0.01版的,总代码量才1万行左右。阅读这个代码大概一个月应该能比较清晰了。但是,改代码与现在的代码差异巨大,阅读后可以理解基本思想,但对理解现有代码的帮助不是特别明显。所以,还是要根据自己的需求来选择性的阅读比较好。
以上个人观点,仅供参考。
代码并不是写给人看的,而是交给机器运行的。
所以我们去理解别人的代码时,并不能像看小说一样去通篇的阅读代码,而应该是像研究化石一样去调查它,解密它。有时我们往往也需要把对方的一段代码亲手的实现一遍,然后自己举一反三看自己会怎么去实现它,才能真正的理解。
举个例子:
不管是建一栋楼还是建一栋木屋,大致流程是这样的:画图纸→打地基→整平地面→建框架→砌墙→装修。
虽然大致流程是一样的,但显然建一栋楼所需要实现的细节远远大于建一栋木屋。
如果我们要学习如何去建造一栋楼,我们可以先学会如何建一栋“木屋”,然后再深入的学习建造一栋“楼”的某个模块,再转向其他模块的学习。只有通过不断的实践,才有可能建成一栋布局合理、坚固耐用的楼,而不是空想。如果只知道生搬硬套别人的理论知识而不懂得根据实际情况作出改变,就像搭积木一样,建成的楼最终还是会东倒西歪而倒塌。
在战场上可以没有某个士兵,但不能没有拥有全局观念的指挥官,指挥官即使不亲自上战场也能左右整个战争的结果。指挥官也是从士兵做起的,但不是每个士兵都能变成指挥官。
Linux内核最初是由李纳斯•托瓦兹在赫尔辛基大学读书时出于个人爱好而编写的。第1版本于1991年9月发布,当时仅有10000行代码。如今的Linux内核Git源码树中的代码达到了2780万行,核心代码只有2%是由李纳斯•托瓦兹自己编写的,其他均是其他个人和组织贡献的,李纳斯•托瓦兹公开了Linux但保留了选择新代码和需要合并的新方法的最终裁定权。
这么多的代码一个人可能穷尽一辈子都很难吃透,如果有人能够完全吃透,世界上除了Windows、MacOS、Linux,早就诞生了其他的很流行的系统了。“耐住寂寞,阅读代码”并不是一个可行的办法。在大多数情况下会半途而废,一个月之后,可能全部都忘记了。
假如我们向某个人很有能力的人学习,并不是跟在他的屁股后面,他做什么你就做什么,那你的这个学习的过程只可能形似,而不是神似。当你多带带处理某件事时,还是会手忙脚乱、处理的很不好。学习这个人的过程应该是看他处理某件事分开了哪个步骤,每个步骤又是如何处理和衔接的,自己有没有更好的方法实现。
学习Linux也是一样的,你需要知道Linux内核是由那些模块组成的,这些模块实现的是什么样的功能,这些功能实现的原理是什么,模块与模块之间又是如何衔接才构成了一个完整的系统。通俗一些讲就是要有将军的架构意识和合理调控意识,而不是士兵的冲锋陷阵和奋勇杀敌的意志。因为Linux是一个庞大的系统,而不是时间线上的某一件事情。
没有当过士兵的将军能不能算是好士兵?不能,充其量只能算是“纸上谈兵”,将军只有清楚地了解士兵是如何冲锋陷阵和奋勇杀敌才知道如何去摆兵布阵。所以学习Linux不光光是要有阅读代码的能力,还需要有能熟练写出优秀代码的能力。
比如:
所以我们对Linux内核的框架结构有了全面的了解之后,可以通过深入的学习某个模块来培养我们写代码的能力。当写代码的能力不断的提升就会对Linux内核有一个比较透彻的理解,这时就已经完全学会了Linux内核。
有人说穷尽一个人的一生都很难写出媲美Windows、MacOS、Linux那样的系统,但如果你对操作系统有架构层面的全面认识的时候,就不会这么说了。
Windows、MacOS、Linux并不是一个人独立完成的,他们是许许多多的人团队协作的结果。假如一个人独立完成一个操作系统需要100年,通过划分模块,将每个模块分给不同的团队来做,最终每个模块测试完后,整合成一个完整的系统,可能只需要几年。Linux内核从最初的10000行代码到现在的2780万行代码就是全球精英共同贡献的结果。
以上个人浅见,欢迎批评指正。
认同我的看法,请点个赞再走,感谢!
喜欢我的,请关注我,再次感谢!
究竟要多久才能看完Linux内核源码,这取决于你是否是计算机大类专业的毕业生(或者说你学过操作系统原理、计算机网络、计算机组成原理、汇编语言程序设计、数据结构等基础课程),也需要根据你学习的目的来确定:
第一、如果你只是希望大致了解一下Linux操作系统的设计原理等基础知识,那么对照Linux 2.4的内核源码,结合操作系统原理(普通教科书,比如汤子瀛编著的)、LINUX操作系统原理与应用(陈莉君编著)等书籍,大约半年就能够有个大概了解。
第二、如果你希望将来做Linux系统上面的应用开发,那么对照Linux 较新的内核源码,结合LINUX操作系统原理与应用(陈莉君编著)、Linux程序设计(第4版)、Unix环境高级编程等书籍,大约一年左右就能够上手。
第三、如果你希望将来做Linux系统的内核开发,那么对照Linux 较新的内核源码,结合Linux内核设计与实现、Linux Device Drivers等书籍,大约一年以上就能够上手。
可能需要三五年吧!现在的内核代码越来越大,如果你只是想学习核心的知识,可以看看以前的内核代码,比如 Linux2.4代码情景分析,估计几个月就可以看完。
我觉得一个人穷其一生也看不完整个内核的源码,Linux内核全世界的程序员在维护,现在已经变得无比庞大,连Linus本人也未必能读完。现实一点,找几个自己感兴趣的框架阅读一下就可以了,比如网络框架、多媒体框架等等。更深入一点阅读内存管理文件管理也是可以的,但意义不大,除非自己想搞一套操作系统,并且要有一定的硬件基础。
学习任何东西,都要明白目的是什么。像Linux内核源码是一个庞大系统工程,需要大量精力和时间投入才能理解里面逻辑结构和算法体系。我想你肯定已经是工作了,内核源码这种东西可能需要消耗掉你平时休闲大量时间,而且投入时间长,回报周期长,这种投资回报明显是不合适,除非你的工作是有关linux的内核源码或者你本身就是linux内核源码开发者。我个人建议是,可以结合自己本身工作的知识点,抓住与工作相关内核源码知识研究。
0
回答0
回答0
回答0
回答0
回答0
回答0
回答10
回答0
回答0
回答