内核学习路线1

为什么学c语言的路线图总是要依靠一系列的书籍呢。这很简单,每本书如果说好书,至少单纯把脑子里的内容写入到纸张上就得好几年,这还是简单的书籍,一些困难的书籍要写得深入浅出那真是甚为痛苦。上一篇的c语言路线图我至少自己探索了快一年,而且成稿就修改了三到四次,单纯我用键盘打字的时间至少超过十个小时吧。每本好的书,我只是简单的串联他们起来,那些书背后是作者无尽的心血和翻译者的日夜。为什么要抛离那些书籍去谈学习路线图呢。 是的对于内核的学习我还是要推荐一系列的书籍。只是这次没有上次那么容易了。如果只是把书简简单单的推荐给你是没有什么意义的。因为内核的围栏太高了。这次不但要把内核的书籍分类,更要提供一个学习内核的不同的阶段,不同阶段的心法。 如果绕开内核不同的学习阶段,去谈内核书籍的选择是没有任何意义的。有时候同一本书籍在不同的学习阶段起的作用也是不一样的。内核的书籍是一个深埋的金矿首先需要你去挖掘才能有意义。而一个正确的学习方法就是挖掘的过程。 内核的书籍必须与内核学习阶段结合在一起谈。 学习内核分好几个阶段的。内核真有点难的。不是写个helloworld就打打字就行了。内核学习的预备阶段,是完成我的路选图。 正式学习内核,最重要的阶段是内核的学习的第一阶段:在我推荐的书籍里细细的体会我前面的总结的四大设计原则。更通俗点说就是把书里章节挑选来看,看与这些设计原则相关,或者自己能看懂的部分。注意这个阶段对书里的内容要节选着看,要在多本书之间跳动的看,带着了解四大原则的目的去读书。这个四大设计原则,几乎是内核处处都会使用的,就如同应用编程里面的malloc函数一样常见,绕不过去的。内核与应用编程最大的区别是内核管理硬件资源,内核需要cpu的各种设计来实现内核的机制,这些硬件的依赖性非常的复杂,非常的琐碎,内容也非常的繁多,但是记住最重要的是与这四个原则相关的硬件相关的机制。所以内核学习的第一阶段不是看源代码,而是了解内核与硬件结合的四大设计原则。我认为对四大设计原则的理解是把内核这个怪异的猛兽驯服成普通应用程序的关键。从网络游戏的角度,你可以把这个理解成新手村的打怪阶段,在这个阶段你要升级成拥有那四大原则的设计技能,因为只要有了这四大技能,内核不再是看不懂的东西了,变成一个复杂或者异常点的应用程序了。 我先不把那些书籍罗列出来。继续讲解内核学习的第二个阶段 因为完成了内核第一阶段的学习,内核变成了普通的大型应用程序。虽然是普通的程序,可是呢,普通的大型程序也是有难度的,内核的很多写法也是挺痛苦的。所以第二个阶段是到了攻击内核源代码的时候了。这个时候尽量从容易到困难,就是把所有写内核的书籍,与源代码相关的部分,只要是简单的,你容易看懂的都去看懂。这个时候要有一个原则,就是因为每个人接触的应用程序不同,也因为不同书籍对不同的部分解释是有详细或者粗略的区别,所以这个时候尽可能把内核能看懂的都看懂。有一个原则不要去硬看,有些东西书本上简单几句话,几个简单的数据结构,但是在内核邮件列表里可能极度的复杂,冗长。所以说呀,第二个阶段是积累力量,了解内核这个程序的各种写法。这里有点要说一下,内核的问题是很复杂的,有些时候即使想讲清楚未必就能讲清楚,又或者作者有一些误解,又或者这个问题以前是书上描述的,后来情况变化了,这个问题的解释又改变了。所以呀,内核的情况就是复杂,所以对内核书籍讲解的内容和方式不能迷信,有时候有些说法是错误的,或者不完全正确的,等你知道正确的逻辑以后你就明白这个人想讲清楚,但是哪里讲得不好了,那本书与这本书的冲突,是他们对某个问题中的概念取了不同的名字吧。甚至有些时候你查资料绕着地球走了一圈你终于发现原来那本书上的描述的方式是根本无法让读者看懂的。这种事情我花了五年的时间终于明白根本不可能靠看书就能看懂。这是在学c程序路线图完全不同的。c程序的路线图的书籍的内容大部分都是能搞懂的。 备注:内核的书籍的作者有两种,一种是明白了,但是在写书过程中因为书的重点的取舍,对某些问题用的笔墨少造成你的理解困难。这种情况就算没把问题讲清楚,但作者的整体的思路和技术的高度是在那的。 还有一种作者就是自己不太懂,对内核的理解不深入造成在逻辑上阐述问题非常混乱,这种作者对普通的问题是能讲清楚的,但是稍微困难或者资料稀缺点的问题就很难讲清楚了。我觉得那本深入理解linux内核第三版就是这种情况。是大学老师研究内核,是临时研究的人写的。不是那些内核开发者写出来的东西。这不存在贬低的意思。我现在也是这种水平。很多人都会比较长时间的停留在这个水平,这种水平是完成了内核学习的第三个阶段才能达到的。 还有第三种人,就是对内核的东西根本就不了解,然后看着别人那么写内核的东西然后就跟着写内核东西,然后就贴在中国的网络上,我有段时间看见网络上的文章,我觉得自己水平真的好差,我看网络上很多国人解释内核的文章多如牛毛,而且看上去很高端,后来我跟他们交流了一下我明白,他们不是真的懂,是看了别人的解释然后自己就这样去解释,他们也不会去管自己理解不理解,这背后的机制是什么。比如说栈这个机制,不理解内核的内存的管理就不能明白他为什么能往下增长。这是内核缺页异常的处理函数(或者说处理逻辑)帮助实现的,虽然没多少人能理解,但大学老师不也还是天天都那么去上课吗?!有n本书n个帖子在谈论栈呀。这就是我说的情况。这些人写的东西最大的特点就是把别人写的东西加上自己有漏洞的猜想组装成新的内容放在网络上,这就是这些人行为,而这样的行为只会带来搜索困难,和更多谬误的常识,而且这种人的理解就是一路往智商和思维能力的下方增长,来做结论。和栈的增长方向是一致的。 第二个阶段尽量去看懂那些容易的东西。把书本上这些容易的东西看懂以后,对内核的理解应该加深了。不懂的部分也有所了解了。知道自己哪些部分不了解了。这样的学习方式主要是为了效率。广泛的接触内核以后以前觉得困难的内核部分,可能就会变容易了。 而第三阶段是在熟悉了内核以后,选择内核的一个方面比如内存管理呀,或者文件系统呀,去专门的学习。这个阶段的学习就是啃硬骨头了。要在网络上搜索资料,在stackoverflow上,在邮件列表上搜索资料了。 这个时候就可以参考我以前对邮件列表文件分析视频。这个阶段是很辛苦的,经常看一个邮件可能要十几个小时的。这个时候你能够获得的资料就非常的少了,对于你研究的某个问题。一般邮件列表的帖子都是讨论具体的问题。在具体的问题的分析中,大牛们会慢慢的暴露出内核的一些机制出来。 我以前总结过,内核的学习靠四个东西,第一个是比较详细的分析资料,第二个是邮件列表里谈论具体问题时候暴露出来的只言片语,可以理解成非常简陋的资料。第三个靠源代码,从源代码理解,如果源代码有很多宏,就直接看源代码对应的汇编代码来理解。第四个就是靠推理,根据对内核的理解他可能会有哪几种的实现的方式。到了第三个阶段研究一些很生冷的问题,资料很匮乏,需要到邮件列表里去搜索邮件,然后猜想应该搜索的关键字,然后去bing搜索或者谷歌搜索里面去搜索,如果没有结果就调整关键字,实在不行就先放一放。以后再解决,这里要说一下的是调整关键字很重要,甚至还要组合关键词。优先在stackoverflow里面找。 我所理解的第三阶段就是反复的在邮件列表里寻找你在专心学习的模块,然后找你能理解的问题去学习。 第三个阶段要持续很久的。那你一定会问我,这和我学应用程序c语言的路线图不一样呀,怎么会这样呢。是的,内核的学习就是这么没有成就感,真的是台上一分钟台下十年功呀。像写程序的学习最后的结果是你能写程序了,而内核的学习最后的结果是你能写内核某些技术机制的分析文章。简单的说是写内核文档了。写文档的事情就是前人栽树后人乘凉的事情了。而我这个文科生,可以分析内核的困难程度,学习过程中不同的阶段和方法,我想这是我主要的贡献,是我亲身实战过的结论了。当然以后有时间也可以写一些比较难理解的问题的分析,但那要放到后面了。总结出内核学习的路线图是最优先的。最重要的。内核学习本质上是要自己去探索的,是要提供机制不提供策略的。要靠更多的人去拓展去参与的。 前面讲的都是内核的学习阶段,但是人呢都是有冷暖和温饱,还有喜怒哀乐的。所以现在讲学习过程中的内功心法了。 首先要认识内核和赚钱真没有什么关系,从投入产出比来说,这么多的时间,这么大的精力,但从赚钱来说不确定性非常高。所以内核的学习跟赚钱和就业没多少关系,真没有什么关系,你有这个毅力学什么学不会,干什么干不成。 内核对西方世界的程序员来说就是程序员彰显自己实力的竞技场,展现自己技术强大的舞台而已。外国人的生活压力比中国人小很多,房子不会那么贵,攀比心理也不会那么重,特别是西方程序员那是很自我很封闭的,但外界的评价无所谓的。他们只需要对自己感兴趣的东西感兴趣就可以了。中国不行的,在中国单纯的程序员是很吃亏的,中国还是要有个关系的大网来保护自己比较实在的。办什么事情都方便。中国程序员的社会性是比较强的,而且如果只懂技术很容易被那些搞管理和搞人力资源的坏人算计的。当然坏人不是很多,就怕遇上,脑子里缺个人际斗争的弦,那是要吃大亏的。可程序员一旦深刻的明白了内部斗争的逻辑,分享知识这个方面就会打折扣的。只要是人就会明白大学的计算机教育与实战多脱节,可是又有几个程序员出来批判呢。大家好像什么都没有发生过一样。如果不是操作系统事关国家安全,我也是无所谓的,干嘛大半夜熬夜去写教程。好好过我的日子不是好得很嘛? 西方人,很多西方国家对美国垄断操作系统和计算机的基础设施这个事情是默认的,或者说是无力反抗的,或者说他们的国家意识没有我们这么强烈,他们的国家规模也是没有那么多人力资源来为了安全专门打造一套完整的计算机体系,但中国人可以。而且中国有一部分人有强烈的愿望要这么干。这不单单是关系到国家安全,注意美国的商业企业垄断了操作系统,但是这些企业都是高科技企业,需要高度的资金投入的,所以他们利用操作系统的优势窃取信息也只能是偷偷的干,如果说明火执仗的瘫痪一个国家的所有计算机,那这些商业公司的产品马上全世界都会抛弃掉,那这个商业公司在市场经济下马上就会死掉的。所以美国拿着操作系统的核武器还是只能干棱镜之类的监听项目。他也只能提出网络战的概念,不能干一夜之间让一个国家所有计算机格式化硬盘自毁的事情。但是美国人天天偷我们的资料搞暗地的大数据分析也是很讨厌的事情。操作系统最大的问题是民族自尊心的问题,不把这个搞出来好像对不起祖先的5000年文明,对不起我们中华民族天朝上国的地位。你说你是超级大国,看一下发现你用的是别人的操作系统。这好像不太好意思。我女儿问我,谁是世界上最强大的国家,我还是只能说美国,因为美国确实还控制着整个计算机体系的和软件的大部分基础设施。对西方或者欧美的程序员内核是一种获得荣誉感的地方,是自己在程序世界青史留名的地方。对中国人完全不一样,内核是程序员报效祖国的战场。是中国新时代的两弹一星。内核的难度甚至超过了cpu芯片本身,芯片毕竟是个物理的产品,而内核是软件,而且有免费的国外产品可以用。中国搞两弹一星有很多国际专家的,钱学森呀等等。中国哪里有内核这个级别的专家。我研究内核快五年,我是没有看到过的。在国际上有点威望的人,我是没有看到过的。所以前面要讲清楚内核不是赚钱的工作,要赚钱别去研究内核,研究上面的那些实现功能的api,实现各种功能的算法。应用类的算法是多数企业需要的,也是多数消费者需要的。比如华为mate20的摄像建模,比如黑白背景的视频,这些本质上都是算法。以前国外就有个算法在物体上画点,从不同角度拍摄照片来用算法生成3d的模型。未来的随着人工智能的演进提供算法需求的岗位会越来越多。而对简单服务的劳动替代也会越来越多。很多行业会被软件半自动化的完成,这种上层应用的竞争中国不会吃亏的。中国有规模,有研究机构,有资金,有政府的扶持和限制国外竞争者的进入。所以要赚钱就业别太往底层跑。 或者换句话说搞内核的人要有一定的经济基础的。要么你是与世无争,要么你是争够了。没有经济基础很难专心搞内核,中国人的中产真的对程序员有点难,要把生活安定和稳定不到四十岁都很难的。等有经济基础研究内核的时候人都老了,上有老下有小来,真是力不从心的。所以我认为不管你从事哪个行业,是程序员也好,是大学的老师也好,是研究院的人也好,你研究内核都是一种牺牲,花了大量时间(至少三年到五年的时间)不产生经济的效益的。也没多少学术的价值的。从本质上说没有经济性的事情就没有持续性。内核所以在国内的研究才那么稀缺。所以这一点事大家学习内核前我必须要说清楚的。对内核的学习本质上是一种偏执和不经济的行为。这一点必须严重的申明,我可以鼓励大学生按照我的c程序员的路线图去学习计算机的世界,去打牢计算机的基础,但是绝不鼓励大学生花大量的时间研究内核,大学生的时间是宝贵的,内核这种时间杀手级别的研究对象还是等你们长大一点,在社会上更加历练历练,人格更加完整以后你再决定你是不是要做一个千夫所指的人来研究内核和发展内核。有人说来,我不那么花时间,我随便玩玩不行吗,那是可以,随便玩玩有两种结果一个是玩不起来,没有什么趣味性,半天看不懂,自然就不看来。另外一种就是会上瘾,研究内核是会上瘾的,你可能很难相信,事实就是这样不管搞不搞的懂但是每天很喜欢去思考,用那些问题蹂躏自己,对别的事情不感兴趣。这并不是开玩笑。你真的喜欢上来内核也很难离开的。但你自己的生活可能是一团糟的,你要有一个好的家庭愿意收留你照顾你才行,这对于内核深度痴迷者而言都是这种情况。对一个东西痴迷来想不成功都很难,但是呀你要知道你的生活上可能会乱糟糟的,你可能没法那么富裕呀,所以呀劝君谨慎。当然对内核的研究不是大学生阶段可以去做的,是你工作几年以后,工作稳定来以后才能决定的。是不是投入到内核的研究里面去。 上面是我从整个人生的角度去告诉你内核研究在人生命和生活和整个人生中可能占用的时间和损失的机会成本。只要能过这个关,后面的心法,只是去阐述内核学习与应用程序开发的成就感的区别而已。这个倒是很简单,内核的学习有一定的水平后也只是能写文章完成对某些机制的解释而已,却无法写出一个,创造出一个内核的新机制来,这就像重大的物理发现一样的困难。动手写出个内核机制来真的是大牛才能做到的。而应用程序的编程只要你有一定的水平,你就能写出各种程序来。所以不要把应用程序的成就感和操作系统内核的成就感想当然的对等起来,以为到了能把内核大改特改才是在内核上有一定造诣。很多内核的开发者只是在做维护的工作而已。找bug,测试内核而已,发现各种源代码的安全和逻辑的错误,移植内核的机制在不同的cpu体系之间。 先写到这里,已经写了四个小时来。 还差一个对各种书籍的在不同阶段作用的介绍,还有一部分是国家产业和科技政策怎么去引导,或者推出怎么样非常规的政策。

作者:红红火火急急急
https://www.bilibili.com/read/cv1419219
出处: bilibili
posted @ 2019-01-27 17:29  lemaden  阅读(66)  评论(0)    收藏  举报