教育培训 > 需要多久才能看完linux内核源码?

需要多久才能看完linux内核源码?

2020-11-07 05:02阅读(70)

需要多久才能看完linux内核源码?作为一名普通的c++程序员,目前想要学习linux内核源码,想逐步阅读,需要多久才能看完linux内核源码呢?:linux 0.11的内核源码

1

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网络子系统的研究
  • linux内存管理机制的研究
  • linux调度器的学习和研究
  • linux进程管理的学习和研究
  • linux虚拟机制(kvm)的学习和研究
  • linux内核实时化技术的研究

沿着某一个主线,深入进去,在研究清楚这个主线的同时,向其他的主线扩展、渗透和学习。由点到线、由线到面、由面到体,层层深入、不断精进,是学习linux内核源码的一个有效的方法。


关注”技术简说“,带你由浅入深学习linux内核源码。linux内核开发100讲免费教程,每周二、周四晚上9点更新视频,每周一、周三晚9点更新文章,敬请收看。进我主页点”视频“栏目即可观看。

2

老铁,我也在学习linux内核,我说一下我的想法吧。

我曾经很早的时候就想学习linux内核了,当时准备啃书,并对着代码看,热情了一阵子,可由于太深奥就不了了之了。

最近工作原因,涉及到内核文件系统的研究,重新学习内核,感觉比较容易弄懂了。为了避免走弯路,我建议:

1. 不要一来就对着内核源码啃。内核源码压缩后现在都一百多M了,有生之年你也别想全看完弄懂,各种算法,诡异的写法会弄晕你。

2. 先找一些内核实现原理的书来大致看一遍,这个时候不必深究细节,不懂的就做一些问题清单记起来。

3. 内核由几大模块构成,你要大概了解它们的相互关系。例如进程中就记录了打开的文件信息,进程的地址空间主要内存管理模块来分配和管理内存。

4. 选择一个模块作为切入点,通过实验对内核下手!我是从文件系统这块开始的,比较简单这次没有搞晕我了。

5. 必须动手实验,光看书是没用的!!!你亲自通过加打印,或断点调试跟踪代码调用路径,通过自己写代码实现一些功能后,你自己会豁然开朗,信心大增了!

希望我的回答对你有用!

3

linux内核代码算是开源社区里面一盏明灯般的存在,虽然代码是开源但是核心领域能够看懂并且能够真正修改的数量极其的稀少了,大部分代码的更新更多是外围设备功能的增添,这种修改距离内核级别的改动还是存在本质的差异,而且很多中国的程序员已经参与到很多模块代码的提交了,证明了中国软件行业也在快速发展壮大过程中,证明了很多国内程序员已经度过了最原始的积累过程。

从一个程序员对于编程系统掌握的层次来讲,首先是基础编程语言的语言学习过程,然后是能够看懂代码,最后是代码的项目实战过程中,其实看代码和写代码的过程两者属于相辅相成的过程,不断的研究代码机构从中汲取精华然后应用到实际环境中,在实际项目中找到具体的场景把自己掌握的一些理论模型在实战中发挥出来,这种属于学以致用的典型,所以一个成熟的程序员需要不断的研究新的代码机构,然后想办法在实践中展示自己的能力,形成良性的循环在现实中很多程序员在初级入门阶段还是积极的学习优秀的代码,在掌握了一定层次的编程能力之后就放慢了学习的脚步,这种模式下非常容易慢慢落伍。

如果从一个普通C++程序员的角度慢慢学习linux内核,需要具备以下几种基础首先由一个认知linux内核的代码是C语言和汇编完成,单纯的C++未必能够满足其基本的研究需要,所以先要把C语言的基础语法以及内部关键的语法掌握清楚,同时掌握一定的汇编知识,在linux内核的影响效率的地方会使用汇编,所以掌握了汇编和C语言基础的语法之后再去尝试研究linux内核源码,如果不准备好基础编程语法,去研究linux内核将是一种灾难般的存在;对linux内核的api接口有一定的了解,了解外围的调用接口才能有助于了解内部是如何实现的,对于linux内核的驱动常规知识也需要有一定程度的掌握。

至于需要多长的时间能够看完linux内核知识,这种时间是无法确定有些人linux内核已经研究十几年了还是觉的里面有很多不了解的地方,可以尝试先从基础的模块开始熟悉从宏观上了解其工作原理,然后根据自己的兴趣爱好找到感兴趣的模块进行研究学习,不要指望多长时间能够掌握透彻,能够当成一辈子研究的事业去做,不要尝试给自己设定时间去完成学习linux内核这种巨大的工程,可以设定时间掌握宏观的框架,但更合适的做法是当成一种兴趣爱好长期去做,希望能帮到你。

4

linux内核不需要看完,分分类,选几个必须看的研究一下,多数不需要看。

内存管理,中断管理,进程管理,进程调度,设备管理,inode数据结构等是必修的,设备驱动看俩代表性的,串口的,键盘的, 磁盘的。文件系统看一个意思一下,文件系统很多,代码太多一辈子都看不完。中断管理要多看看,涉及到很多定时,包括进程调度。

当年我花一学期陆陆续续看完所以unix内核代码,但那时的代码少,就2,3万行,现在linux全部内核一辈子也看不完。

5

可能需要三五年吧!现在的内核代码越来越大,如果你只是想学习核心的知识,可以看看以前的内核代码,比如 Linux2.4代码情景分析,估计几个月就可以看完。

6

代码并不是写给人看的,而是交给机器运行的。

所以我们去理解别人的代码时,并不能像看小说一样去通篇的阅读代码,而应该是像研究化石一样去调查它,解密它。有时我们往往也需要把对方的一段代码亲手的实现一遍,然后自己举一反三看自己会怎么去实现它,才能真正的理解。

举个例子:

不管是建一栋楼还是建一栋木屋,大致流程是这样的:画图纸→打地基→整平地面→建框架→砌墙→装修。

虽然大致流程是一样的,但显然建一栋楼所需要实现的细节远远大于建一栋木屋。

  • 如果让一个人去建好一栋楼,这在技术实现和时间成本上是不切实际的。一栋楼的建成是许多分属不同工种的人群共同协作的结果。
  • 如果以做一栋楼的标准去建一栋木屋,显然也是不切实际的。比如:不可能用建一栋楼的地基去建一栋木屋。

如果我们要学习如何去建造一栋楼,我们可以先学会如何建一栋“木屋”,然后再深入的学习建造一栋“楼”的某个模块,再转向其他模块的学习。只有通过不断的实践,才有可能建成一栋布局合理、坚固耐用的楼,而不是空想。如果只知道生搬硬套别人的理论知识而不懂得根据实际情况作出改变,就像搭积木一样,建成的楼最终还是会东倒西歪而倒塌。

在战场上可以没有某个士兵,但不能没有拥有全局观念的指挥官,指挥官即使不亲自上战场也能左右整个战争的结果。指挥官也是从士兵做起的,但不是每个士兵都能变成指挥官。

一个人看完Linux内核源码的难度

Linux内核最初是由李纳斯?托瓦兹在赫尔辛基大学读书时出于个人爱好而编写的。第1版本于1991年9月发布,当时仅有10000行代码。如今的Linux内核Git源码树中的代码达到了2780万行,核心代码只有2%是由李纳斯?托瓦兹自己编写的,其他均是其他个人和组织贡献的,李纳斯?托瓦兹公开了Linux但保留了选择新代码和需要合并的新方法的最终裁定权。

这么多的代码一个人可能穷尽一辈子都很难吃透,如果有人能够完全吃透,世界上除了Windows、MacOS、Linux,早就诞生了其他的很流行的系统了。“耐住寂寞,阅读代码”并不是一个可行的办法。在大多数情况下会半途而废,一个月之后,可能全部都忘记了。

学习Linux最重要的是培养自己写代码的能力和对Linux框架结构的了解

假如我们向某个人很有能力的人学习,并不是跟在他的屁股后面,他做什么你就做什么,那你的这个学习的过程只可能形似,而不是神似。当你单独处理某件事时,还是会手忙脚乱、处理的很不好。学习这个人的过程应该是看他处理某件事分开了哪个步骤,每个步骤又是如何处理和衔接的,自己有没有更好的方法实现。

学习Linux也是一样的,你需要知道Linux内核是由那些模块组成的,这些模块实现的是什么样的功能,这些功能实现的原理是什么,模块与模块之间又是如何衔接才构成了一个完整的系统。通俗一些讲就是要有将军的架构意识和合理调控意识,而不是士兵的冲锋陷阵和奋勇杀敌的意志。因为Linux是一个庞大的系统,而不是时间线上的某一件事情。

没有当过士兵的将军能不能算是好士兵?不能,充其量只能算是“纸上谈兵”,将军只有清楚地了解士兵是如何冲锋陷阵和奋勇杀敌才知道如何去摆兵布阵。所以学习Linux不光光是要有阅读代码的能力,还需要有能熟练写出优秀代码的能力。

比如:

  • 同一个软件项目,有的人项目规划很简洁,有的人项目规划很繁琐,项目规划决定了整体代码的规模。
  • 写程序代码实现某个功能时,有的人算法简洁代码量少在硬件上执行效率高,有的人算法繁琐代码量多在硬件上执行效率低。

所以我们对Linux内核的框架结构有了全面的了解之后,可以通过深入的学习某个模块来培养我们写代码的能力。当写代码的能力不断的提升就会对Linux内核有一个比较透彻的理解,这时就已经完全学会了Linux内核。

我们不需要纠结于多久能读完Linux内核源码,而是学会如何去读懂它

有人说穷尽一个人的一生都很难写出媲美Windows、MacOS、Linux那样的系统,但如果你对操作系统有架构层面的全面认识的时候,就不会这么说了。

Windows、MacOS、Linux并不是一个人独立完成的,他们是许许多多的人团队协作的结果。假如一个人独立完成一个操作系统需要100年,通过划分模块,将每个模块分给不同的团队来做,最终每个模块测试完后,整合成一个完整的系统,可能只需要几年。Linux内核从最初的10000行代码到现在的2780万行代码就是全球精英共同贡献的结果。


以上个人浅见,欢迎批评指正。

认同我的看法,请点个赞再走,感谢!

喜欢我的,请关注我,再次感谢!

7

究竟要多久才能看完Linux内核源码,这取决于你是否是计算机大类专业的毕业生(或者说你学过操作系统原理、计算机网络、计算机组成原理、汇编语言程序设计、数据结构等基础课程),也需要根据你学习的目的来确定:

第一、如果你只是希望大致了解一下Linux操作系统的设计原理等基础知识,那么对照Linux 2.4的内核源码,结合操作系统原理(普通教科书,比如汤子瀛编著的)、LINUX操作系统原理与应用(陈莉君编著)等书籍,大约半年就能够有个大概了解。

第二、如果你希望将来做Linux系统上面的应用开发,那么对照Linux 较新的内核源码,结合LINUX操作系统原理与应用(陈莉君编著)、Linux程序设计(第4版)、Unix环境高级编程等书籍,大约一年左右就能够上手。

第三、如果你希望将来做Linux系统的内核开发,那么对照Linux 较新的内核源码,结合Linux内核设计与实现、Linux Device Drivers等书籍,大约一年以上就能够上手。

8

先抛结论,Linux内核源码属于那种有生之年都不能看完的类型,但是并不妨碍我们通过努力成为某个领域的系统专家。

Linux内核代码行数有多少?

最近Phoronix发布了对Linux内核仓库的统计信息。统计信息显示Linux内核代码库虽然过去一年linux内核大肆精简了大约100万的代码,仍然2780万行代码,其中核心代码占5%,网络相关的代码占35%,驱动超过40%。

看重点,总代码行数超过2700万行,而且这个总量还在因为新的硬件驱动代码加入而持续增加中。

代码这么多? 学习内核该如何入手?

从上面数据看,如果纯粹看代码,估计有生之年都没办法阅读完。那么Linux内核真的没有办法学习了吗? 答案是否定的, 既然操作系统是人创造出来的,那么就一定是人能够掌握和维护的。单纯从数据上看,内核中有75%的代码都是和网络与驱动相关的。网络部分实现了各种网络协议栈,驱动部分适配的各种各样的硬件,核心代码大概只有5%,涉及调度,内存管理,虚拟文件系统等。

也就是说除了这两个部分,核心代码数量也没有那么夸张。

内核包含很多子模块,包括调度,内存管理,文件系统,网络,系统接口,驱动等等,每一个子模块都代表一个大的领域,都是大有可为的,但是每个人不可能有那么多精力去全部精通,因此只能选择一个自己感兴趣的方向去深入,而其它的模块只需要大概了解原理即可。

作为Linux创始人Linus Torvalds ,他贡献的代码现在在内核里面也仅仅占到百分之3点几,Torvalds精力也是有限的,他负责审核的代码仓库也就那么几个,而其它的大多都交给开源社区维护管理去了。

要成为大神一定要读一读Linux源码吗?

很多人都抱着朝圣的心理,想去拜读一下Linux内核源码,好像没有看过源码就不够格成为大神,真的是这样吗? 作为一个多年的内核开发者,真的不建议新手就去直接学习内核源码。

且抛开操作系统的复杂性不谈,光是内核里面的各种宏技巧,各种炫技的写法,就足够新手迷惑好半天。事实上,内核代码并不是一个很好的入门读物,你得有一定的开发基础,并且在真正需要的情况下,才会试图去了解它的原理。而且绝大部分情况下,你都用不着修改它,毕竟能发现了一个内核bug,都算是很牛的事情了。

要成为大神,其实有很多很多的努力方向,不一定非看懂操作系统不可,操作系统方向是成为大神的一条路,但不是唯一的路。等你在工作中,真正到了需要修改优化系统的时候,再去深入了解也不迟。

我是科技领域博主@经纬科技谈,我的回答希望对你能有所帮助,喜欢我的文章朋友欢迎点赞和关注。

9

是否先去学习如何基于Linux写系统软件,然后有了完整的Linux系统软件工作经验,再去深入学习Linux代码,会不会更好?

请有基于Linux系统软件的大神指点。中国基于Linux写系统软件的公司应该不多吧?华为鸿蒙、阿里云,深度、红旗麒麟、红旗xx。

10

Linux内核兼容的驱动太少,现在老的新的海量的芯片核显和独立显卡等硬件研发生产时,各厂家都是围绕Windows进行驱动程序调试适配生产的,硬件一出厂就和Windows定下了青梅竹马的“娃娃亲”,烧成灰都相互认识,装机顺利没有Linux装机磕磕碰碰鼻青脸肿也进不去。跟Linux完全就是“陌生人”,又看不上Linux穷小子,兼容不兼容无所谓,不是这些硬件厂家考虑的事,各大硬件官网只有Windows7、Windows10主流系统的驱动提供下载。

有些小白说,驱动不是问题,光要国产软件应用丰富就行,说得倒很轻飘简单。他们不知道生态分两部分:①硬件及驱动 ②应用软件。没有主要核心零部件驱动,连装系统和体验系统的门都进不去。电脑的机理跟我们人体系统机理差不多,手脚、眼睛、耳鼻等一系列的器官只不过是人体系统的硬件,神经系统才是器官连接大脑CPU的驱动程序,让人能够活动自如,没有神经驱动我们人就变成聋子、睁眼瞎、瘫子、瘸子类型的残疾人。大家平时主要直接跟各种行业应用和系统设置面对面的打交道,系统运行稳定时跟驱动接触少,只有装系统和出故障时才接触到驱动程序,驱动程序是系统中协调系统各层面的默默无闻的幕后英雄。

同时驱动程序也是闯祸者,成熟系统只占故障率的10%左右,系统80~90%的故障都是来源于驱动系统的缺失和不兼容,驱动出错,系统背锅。驱动缺失,系统挨骂!

驱动兼容缺失会导致很大一部分机器U盘引导装深度Deepin64位和优麒麟系统时就卡死到蓝屏状态,装Deepin32位正常,装Windows64位也正常,说明Linux内核和硬件厂商没有相互协作把Linux驱动维护升级,半途荒废到那儿了。所以Linux和这些芯片显卡硬件相遇时会出现“你不认识我,我不认识你”的卡死状态,能装上deepin都是碰上了运气!像中彩票一样。

实在要硬盘真实安装,制作U盘启动盘安装碰碰运气吧,如果装不上,就不要勉强,不管你用什么U盘烧录工具都没用,白费劲。即使通过什么调试勉强安装上,接下来会有各种各样的其他类型驱动引起的问题让你寸步难行,挂了都是家常便饭。

要想看看Deepin是个啥样子,装个虚拟机,虚拟机就像是“孙”,会七十二般变化,它能虚拟变化成出各种各样的兼容Linux的驱动,虚拟机运行deepin非常稳定流畅,没有各种驱动困扰。作为体验过各大Linux的过来人说句实话,不管是deepin还是优麒麟、新支点、Ubuntu等五花八门的Linux发行版都是非常低级的,都属于狗肉上不了席的程序员使用的小众系统,成不了大众系统,尤其是AI智能的未来,像原始DOS的命令行方式的系统只能当个玩具玩玩而已,不能当作生产力,跟不上时代发展的要求。

国内一些的Linux技术人员和团队仍然固步自封,自我陶醉在Linux所谓的代码效率高的小圈子里,成了“井底蛙”,就不想跳出井口看看外面的世界,哪怕看一眼Android这个成功的范例,它可是Linux的亲儿子,问Android中有一条或者是有半条命令行了吗?想起了一位主持人说的话:就算低头拉车,也要抬头看一看天。

目前的Deepin被一批肤浅者带偏了,正事不足讨论什么圆角直角的美与丑、额头的大与小、老桌面与新桌面的比较投票,走偶像派。无可厚非,走偶像是收获了一点粉丝,“新鲜劲”是有期限的,还得靠系统的可靠和能力维持人机的长期协作伙伴关系。就目前深度不可能维持鱼和熊掌二者兼得的局面,把有限的精力投入到关键的地方。

关于Linux内核,它是属于全世界的,不专属于哪个国家地区和组织。中国还没有哪一家公司有强大的人力、物力、影响力、科技实力对Linux内核进行改进和提升,贡献中国智慧,中国力量,中国解决方案,改善内核兼容海量的驱动,都想投机取巧,喜好形式主义的表面文章,争先恐后干换皮的装修公司一大堆,包括华为、小米这样典型的公司都拿现成的安卓换皮装修。鸿蒙系统,自己和媒体一波一波吹牛声波传遍了全世界,只有敏锐者看清的是只剩名字起得好!连哄带蒙,至今连个影子都没有。

国内Deepin和优麒麟将要面对生态链中遇到第一道难以逾越的驱动鸿沟。一大部分机器安装失败其实是Linux内核天生的营养不良的缺陷导致。