• Linux内核学习之路


    每当学习到一定阶段自己觉得还行时,就会搜一些别人的文章。

    这篇文章是原作者14年3月写的。转过来与自己共勉。学习累了就换着学也挺好

    原文:

    现在回首看看,接触Linux已经很长时间了。 在大三的时候开始学习Java, 但是一直学Java的话, 感觉有点腻, 就尝试找点其他东西来学习。 所以当时就选择学习了Linux。 至于为什么要学习Linux, 有以下三个原因。 

    一是我比较喜欢开源的东西, 当时学习Java就是因为它开源, 以后选择学习Android很大一部分原因也是因为它开源。 现在已经工作了大半年, 每当有搞不懂的问题, 通过翻看源代码解决了这个问题, 我都会很庆幸自己的选择。 开源对程序员的影响是巨大的。

     第二个学习Linux的原因是, 我感觉自己操作系统方面的知识太欠缺了, 因为自己不是科班出身, 大学学的是机电专业,只学过C语言, 所以基础的东西必须恶补回来。 学习操作系统理论知识有很多途径, 但是我还是决定选择一个具体的系统来入手, 那就只能选择Linux了, 资料和书籍也多, 源码也开放, 是学习的不二选择。 虽然每天都在用Windows, 但是基于Windows学习操作系统那可真是天方夜谭。 Linux才是程序员应该真正学习的好东西。 现在Linux越来越火, 在服务器和嵌入式等领域风生水起, 也让我坚信学好Linux对自己的职业生涯肯定是有百利而无一害。 也有人劝说我学习这个没用, 我已经在以前的博文 我为什么要学习Linux?这篇文章中做出过解释。

    第三个学习Linux的理由是, 我喜欢它, 想搞清楚他的原理, 而且也愿意花时间去研究。 兴趣是最好的老师, 只有真正的喜欢一个东西, 才能把它学好, 就像娶个老婆, 你必须爱她, 才能和她一起度过漫长的岁月。 此外, 程序员的好奇心是天生的, 要是不弄明白一件事, 就会吃不下饭, 睡不着觉。 没有好奇心的程序员不是真正的程序员。

    刚开始接触Linux的时候, 并没有想学习内核知识, 只是想尝试着使用它。 所以就读了一些基础性的, 偏应用的书籍。 读的第一本书当然是《鸟哥的Linux私房菜》啦。 网上评论这本书是最适合的“入门级”教材, 但是我感觉很有深度的, 并非仅仅是教你怎样敲命令行。 它讲的全面而且深入, 包括计算机组成原理,各个命令和参数的使用, 如何配置等等, 非常详尽。 给我最深印象的是文件系统那一章, 什么i节点, 超级块, 文件系统分区, 对于初学者而言高大上的概念都深入的讲了一遍, 看的太过瘾了。 

    此后零零散散的学了一些linux相关的知识。 包括看了兄弟连李明老师的linux视频和传智播客韩顺平老师的linux视频, 感觉受益匪浅, 在此感谢两位老师的无私奉献。 当然要自己学会装Linux系统, 刚开始在VMware装的Centos , 此后又在真机上装的Ubuntu 。 记得当时装Linux很费劲, 总会出现这样那样的问题, 也导致自己很郁闷, 现在想来真是有点好笑。 但是这都是学习过程中必须承受的痛苦, 只有踏踏实实的一步一步走过来, 没有什么捷径可言。 知识的获取是艰难的, 任何一点知识的提升,都要付出很多的时间和精力。 

    一次逛图书馆的偶然的机会, 看到了新设计团队的《Linux内核设计的艺术》, 读来很不错,虽然是以早期的Linux内核版本来讲解, 但是结构清晰, 讲解清楚, 配有很多插图, 这些插图都基本呈现了Linux内核的运行状态, 真是匠心独运啊。  书的大部分篇幅讲解了Linux内核的启动过程, 这也是本书和其他书籍不同的地方, 其实把启动过程弄明白也是一件相当不容易的事情, 因为启动过程基本上涉及到了内核各个方面的知识。 这本书读了两遍, 大三学习java的时候读了一遍, 毕业之前又读了一遍。这时候我对自己的评价还是仅仅停留在会使用Linux, 对内核的知识有一个模糊的印象, 虽然知道了一些内核中的概念, 但是对原理知之甚少。

    然后我就很苦逼的毕业了, 要上班了。 我做的是Android应用开发的工作, 所以要将重心转移到Android上来。 这时候是2013年7月, android已经很火了, 市面上很多讲解android应用开发的书籍, 不过都是千篇一律, 天下文章一大抄。 有些还是直接翻译的android的官方文档。 因为android刚出现几年的时间, 毕竟很多人还没有学通, 没有能力自上而下的把android的架构讲清楚, 只能写一些关于四大组件的书籍, 连Framework框架也很少有提及的。 关于学习android, 我看过的最好的一本书是罗生阳的《Android系统源代码情景分析》, 还有他的专栏博客《老罗的Android之旅》, 从内核驱动层, 到硬件抽象层, 再到原生服务, 最后到运行时和Java服务, Framework框架。 真是至上而下, 全部搞定。 正是这本书, 促使我继续学习Linux内核。 

    以我当时的水平(其实现在水平也不高), 看《Android系统源代码情景分析》这本书真是太难了, 很多讲的都是Linux内核相关的东西。 因为看不懂, 所以下定决心好好学习Linux内核。 其实学习继续Linux内核也不只是为了深入学习android, 毕竟操作系统的基础知识对于一个程序员是至关重要的, 趁年轻的时候大点基础, 修炼一下内功, 可能会在以后走的轻松些。 因为过一两年, 随着工作压力越来越大, 也随着精力越来越差, 可能就没有时间和精力打基础了, 然后就只能抱着现有的一点知识, 在这个行业苦苦挣扎, 然后抱怨干程序员是吃青春饭的。其实看看很多大牛, 无不是基础扎实, 内功深厚的人。 所以很多人抱怨干程序员没什么发展, 其实很大一部分原因是自己没有努力, 没有努力打基础, 练内功。 以至于让自己在漫长的职业生涯中抱残守缺, 然后逐渐被淘汰。 为了让自己避免陷入这一困境, 所以要让自己在年轻的时候打好基础。

     从毕业到现在, 看了很多Linux内核的经典书籍。 最先看的是毛德操教授的《Linux内核源代码情景分析》, 只看了上册, 只能说是囫囵吞枣过了一篇, 对内核中的一些概念有了更深“一点”的了解, 还称不上理解。 再加上这边书是以源码驱动的, 对于我这种菜鸟当然是不可能完全理解的。 我也知道自己不可能理解, 但是为什么还要去读呢?我认为不能每天都读自己已经懂得的东西,写自己已经写了N遍的代码。 因为总是做自己熟悉的东西, 是没有什么进步可言的, 必要的时候必须让自己忍着压力和痛苦, 去学习一些比较难的知识。 学一遍学不懂就学第二遍, 再学不懂就学第三遍, 总有一天会搞明白。 

    看完毛教授的书, 感觉对内核的很多概念还是很模糊。 没关系 , 继续学习。 然后又读了《Linux内核设计及实现》,这本书不是大部头, 也讲的不是很深入, 对我来说很适合, 然后读了这本书。 然后又买了《深入理解Linux内核》, 接着读, 读完之后又买了《深入Linux内核架构》, 这两本书都是很有深度的, 可以说是大而全的书。 我以为读了之后会有很大的进步, 但是我想错了, 其实只有很小的进步。 然后自信心有点受挫。 尤其是看《深入Linux内核架构》,但是我再出差, 每天加班到晚上十点多, 回到宾馆已经快十一点了, 回去后就抱着书看, 每天都一两点睡觉, 然后第二天还得八点半上班。 感觉自己付出了这么多的努力, 然后就得到了少的可怜的回报 , 感觉心里挺难受的。 所以就先把Linux搁置起来了, 可能是我太心急了, 需要平静一段时间。 

    在这最近一个多月的时间了, 我没有再啃Linux内核, 而是学了点Python , 学了一些Go语言, 看了看设计模式。 但是我知道自己一直没有放弃Linux内核。 纵然它虐我千百遍, 我却待它如初恋。 两周之前, 我有把以前读过的《Linux内核设计及实现》拿过来重读, 这次再读, 就明显感觉轻松了很多, 很多概念也熟悉了, 可以说理解的都差不多了, 对整个内核的运行机制有了更深的理解。 以前读这本书痛苦的要死, 现在一个多星期就读完了, 是完完整整的读完, 并且大部分内容都能理解的差不多。 这种感觉还是很好的。 其实真正完完整整的读完一本书,并且理解它讲的大部分内容, 是一件相当难的事。比如, 有人写了10年的Java代码, 给他一本《Java编程思想》, 他也不一定能全部看明白。  我也是在读完这本书之后, 感觉心情不错, 才想起写这篇博客, 记录下来这一个还算有意义的时刻, 在这里将这本书的封面记下来(该图片来自百度搜索):

    到目前为止, 对于Linux内核, 我给自己的评价是 : 入门了 。  对于内核中的概念有了比较深刻的理解, 对大部分的原理也理解了, 对内核中如进程管理, 内存管理, 系统调用, 文件系统等的实现也有一定的了解。 但是我还会继续学习, 继续读《Linux内核源代码情景分析》, 继续读《深入理解Linux内核》, 继续读《深入Linux内核架构》。 但是在继续学习的时候, 要尽量做到下面两条:

    1 尽量多读源码。 之前也读过源码, 但还算读的不多, 主要还是以读书为主。

    2 尽量把自己掌握的知识写下来, 写成博客的形式。 写博客会让人进步很快。 其实关于Linux内核的知识, 早就想写一写了, 无奈腹中空空, 水平有限, 确实写不出来。 

    写到这里, 我目前所走的Linux学习之路就写完了。 你看, 人生是多么的艰难, 折腾了这么长时间, 才刚刚入门而已。 但是又有什么办法呢? 希望付出的越多, 迟早一天会有丰厚的回报。 

  • 相关阅读:
    挑战程序设计竞赛 dp
    算法导论 动态规划
    算法导论第二章
    divide conquer
    时间戳
    bootstrap 针对超小屏幕和中等屏幕设备定义的不同的类
    jQuery中的Ajax
    怎么判断一个变量是Null还是undefined
    认识Ajax
    关于apache
  • 原文地址:https://www.cnblogs.com/Caden-liu8888/p/5885390.html
Copyright © 2020-2023  润新知