如何更深入地学习 Linux?

admin 2014年12月10日 程序员成长 778次阅读 查看评论

  说说我的学习经历吧。因为我对这方面也非常感兴趣,而且年龄和背景和题主十分相似。

  本人现在大三,专业是计算机工程,带电的东西都学。暑假收到了Apple的CoreOS(桌面操作系统)实习的offer。

  我觉得要深入学习linux,有三个方面是要全面了解的。(下面有些东西会写成英文,因为有些东西的中文翻译我真的不太清楚,所以为了最大程度的避免误人子弟,我还是尽量用词准确,见谅)

  1. 最重要的linux的内核工作方式:包括但是不限于:

  •   内存分页

  •   进程切换

  •   interrupt 和 exception,以及system call

  •   lock

  •   进程管理

  •   内存管理和分配

  •   signal

  •   文件系统(ext2, ext3)

  •   输入输出设备

  •   缓存

  书可以看《understanding the linux kernel》,《intel OS programming volume III》

  这个是理解linux的基础的基础,对于理解操作系统有莫大的好处。而且无论对于high level还是low level的编程都是相通的,很多东西在学完操作系统之后,你对他们的理解就完全不一样了。就像学好缓存在对于提高大运算上面的效率是很有帮助的。

  一边看书一边可以写一个简单的linux自己玩,时长一个学期比较合适。因为课程要求,所以我写过一个可以多任务运行的linux,附带一个声卡driver。当时演示的时候放的是凤凰传奇,教授整个人斯巴达了。但是不得不说这是一个非常大的工作量。

  但是无论是要做内核开发还是驱动开发,我觉得这些都是基础中的基础,是要扎扎实实掌握的,不得有半点马虎。

  2. CPU架构/汇编

  操作系统跟CPU的架构是离不开的,我个人觉得是相辅相成的。很明显的能看到Intel为了和操作系统配合起来,实现了很多硬件功能。最明显的就是虚拟内存已经可以在硬件层面上直接换算,不需要通过软件了。不懂x86或者arm的架构,会一定程度上造成理解linux内核的困难。比如为什么要以某种特定的方式分页,为什么内存管理的时候需要不同的算法,interrupt,system call的意义何在?等等等等的问题都需要精通CPU的架构。

  当时就是因为对TLB的理解不够深入,不够仔细,造成我的系统每次切换任务的时候,会page fault。

  重点在于interrupt的处理,缓存的概念和内存相关结构的设计。至于乱序执行,pipeline之类的都是次要的,对于linux不是特别的重要。

  x86的汇编是基础,有助于debug和理解linux源代码。我写系统的时候大段写过x86代码来实现低层操作。不知道真正的linux是不是这样实现的。

  3. high level编程

  系统毕竟是为了应用程序而服务的,就像有需求才有生产一样。没有应用程序的需求,就不会设计相关的系统功能。了解high level的编程一定程度上可以融会贯通。

  先更新到这里,要是有时间再更新一些自己学习的体会。

  ——————————更新————————————————————

  居然感谢的比赞同的多。。。头一回

  后来看了排名第一的回复,发现确实少回复了关于使用linux方面的内容。

  在使用linux方面实在是提不出什么意见,我只能描述一下我的体会。我的工作环境是:学校使用scientific linux(整个系都在用,没得挑),在家使用Win8,ubuntu和Mac OS。现在已经基本不碰ubuntu了,因为买了mac之后觉得ubuntu的界面和人机实在太丑陋了,win8只用来打游戏,写代码神马的就算了,从来就不会在windows上写代码(free pascal除外)。平常只是在linux上写代码而已(c和python),很少捣鼓linux。会的命令也特别简单,都是基础的什么ls,cd,grep,ps,kill,ip addr,scp,mv,cp之类的。基本上是用什么会什么,不用什么就不会什么。每次要用到新的命令都得上网查。每次装软件头都特别大,因为特别像打游戏,还得上网查攻略,每个linux版本攻略还不一样。mac这方面做得比较好,从来都是一键安装,特省事。

  所以我觉得如果不是做运维的话。。。。。那就不必要刻意去学linux使用方面的东西了,不会的时候再上网查(其实我每次查了都记不下来)。如有不同意见,请无视我的“体会”,因为实在是误人子弟。

  【TankyWoo的回答(25票)】:

  研究Linux内核是一个很不错的选择

  网络方面也是一个必备技能。

  如果是运维,这个要求比较广:

  最简单的就是会用命令,我不清楚你提到的熟悉各种命令到底是熟悉多少/熟悉到什么程度,除开日常使用的大部分命令,运维排查问题还需要了解很多命令,把这些工具用好,你可以解决很多问题。

  借用网上的一幅图,看看你了解多少(反正我还有一些不了解 :( ):

  

  运维的另外一方面就是根据公司需求,用好框架,比如Nagios, Puppet,SaltStack,Docker等,这方面的基础搭建要求非常高,你需要考虑如何做基础构建,才能达到高度模板化、自动化等。至少现在这方面都是我们Boss来做。

  运维更多的就是和业务绑定在一起,根据业务来做开发和调整。

  还有一方面,建议掌握一门除开Shell外的脚本语言,个人建议是Python。用合适的工具,做合适的事情,只靠Shell很难做好。

  就说那么多了,如果你在大二就能达到你说的那个程度,那你已经很棒了,继续钻研吧。我觉得迷茫是正常,但是没必要去过多的想,随心去学,不是很好么。

  【孙立伟的回答(9票)】:

  给你一个网站,Welcome to Linux From Scratch!,尽情的折腾吧。

  【chinatree的回答(3票)】:

  一谈到深入学习Linux,多数人马上联想到Linux内核,但这是一个较长远的目标,建议这个定位在重要但不紧急的任务。因为如果内核就接触就能接触的话,那这就不可以算啥深入的知识啦。

  至于楼主说的熟悉各种命令,能写Shell脚本,不确定是到什么程序,建议楼主寒暑假有时间的话可以去找一两家公司尝试面试一下验证自己有哪些不足 :)

  楼主现在是一个在校大二学生,迷茫是正常现象,之所有产生迷茫主要原因在于没有真实案例给你展示你的能力,而你又觉得你所要学的基本都掌握得差不多。然而人是渴望得到认可、得到掌声的,现在你的能力暂时还没有发挥用武之地,所以缺少了认可和掌声提供的动力,以后你在实际工作中所完成的每一项任务给你带来的成就感和满足感,以及你发现比你腻害的牛人还很撸力的学习的时候,你就会清晰的知道自己该往哪个方向加油。

  Linux内核和驱动开发我不熟悉,没啥可建议的 :(

  运维(ops)职业,要求的知识面很广泛,除了Linux知识,开发的一些技术、网络知识、脚本能力、排错能力、安全等等,像 @Tanky Woo的图片中所涉及到的命令、知识点在监控、排障能力上体现得淋漓尽致。

  最后,学校的知识对实际工作来说,那真的只是冰山一角,提醒楼主多把自己所学知识付诸实践,按老马(马克思)说的,实践是检验真理的唯一标准。在实践中学会思考问题,提出问题,解决问题,这样你会发现要学的东西很多很多,简单的可以理解为属于你现在不懂的知识都可以算作深入学习...

  【梁国栋的回答(2票)】:

  建议你先确定发展的方向(还是做驱动?还是做网络?等),Linux 包含内容太多,确定方向才能选择合适的点深入下去。找到需要深入的点,就选择相关的书籍学习一下,自己编写一些程序实践,在实践过程中回顾存在知识点的不足,再进一步学习。同时可以关注领域内的动态。

  【王树蓬的回答(1票)】:

  先看,Robert Love 的 linux kernel development 。

  《Linux内核设计与实现(原书第3版)》([美]Robert Love)

  【摘要 书评 试读】

  再看,Wolfgang Mauerer 的 professional linux kernel architecture 。

  《深入Linux内核架构》([德]莫尔勒)

  【摘要 书评 试读】

  期间结合代码和实践。

  都搞完了,对内核的机制应该就算比较熟悉了,至于用户态的就另说了。

  偏应用的看看鸟哥私房菜不错。

  【枕水的回答(1票)】:

  如果题主所说属实,那应该是已经到了一个相当的境界了,就这种程度将来求职就不成问题了,我同学当年在学校的时候就一直在玩Linux,现在想想也就是到了会配置Linux的程度,差不多我们装Linux都要找他过来这样子。然后毕业就有公司要,据说工资差不多5K的样子,在我印象里05年毕业生拿5k工资还是不少的吧?

  我是工作之后才接触Linux的,感觉光是“熟练的操作 Linux 系统,熟悉各种命令,独立搭建gcc编译链(而不是找现成的改改参数这种)”就已经算人才了。我不知道题主说的写脚本是不是就是指的写make文件。

  要再深入的话,除了读懂Linux源代码之外,是不是可以加入Linux的邮件列表里?试着跟一下开发进度?最不济也混个脸熟,看看大牛们是怎么讨论代码的。Linux的种种bug真是恨死人,你不知道bug的话,经常代码调了半天不通过,还以为是自己的问题。

  记得我以前公司的一个大牛,跟人讨论起Linux的一个系统功能的时候,直接调出源代码讲Linux在这块是怎么实现的,那逼格真是满到爆表啊!

  深入玩Linux的话,就不要搞运维了,感觉好浪费的样子,虽然有时侯开发的代码水平还比不上运维的。

  【夏华林的回答(1票)】:

  推荐一本书,《深入Linux内核架构》

  有精力的话,可以读一读,书挺厚,中文版翻译的也不错。

  【知乎用户的回答(0票)】:

  运维的话,我不太清楚,不过总觉得在没有实际服务器的情况下学习运维,就好像在没有龙的世界学习屠龙剑法一样,学了再多的知识也没有实感阿。。。

  而且楼主大二就对Linux如此有兴趣,要是以后工作就干运维的话有点浪费了

  我个人觉得工具这东西,只有在有实际需求的情况下,学习才有动力和意义。题主说到了几个方向,比如说学习linux内核,驱动开发或者运维。这些在没有实际目的的情况下,很容易就半途而废得,因为你说的这些方向都不是简单的活儿。。。

  我就举一个例子吧,想当年我开始深入研究Linux,就是因为那会儿我被人忽悠入了一个HP Touchpad。。。现在想想满眼都是泪阿,WebOS系统虽然好看但基本没啥软件支持得,Flash都不支持所以我Bilibili弹幕网站什么都上不了。。。所以当年我就开始研究怎么刷Android系统。而Android系统编译Rom最好的环境就是Linux,我也因此开始折腾之旅了:先是用别人的代码,然后编译不通过,然后尝试Debug,然后为了能看懂代码开始熟悉Android系统框架,然后开始熟悉Android APP编程。。。虽然这一切在我入了iPad后就中止了,不过也因为这个,让我学到不少知识了吧。。。

  所以我觉得题主可以给自己设定一个project,比如自己实现一个小操作系统之类,然后以这个为目的开始学习,效率啊乐趣之类都能够提高不少,更不用说学习的目的性了。

  【XuOTHER的回答(0票)】:

  哈哈哈哈,你有两套方案可以搞:

  1. 如楼上 @孙立伟 说说,去折腾LFS,虽然版本有点老,而且多半是会出问题的,开个虚拟机自己折腾就可以,收获非常多

  2. 但是,我这几年仔细思考后发现,LFS折腾得出来倒还好,折腾不出来是个很累人的事情。我建议新手可以试着去读debian的文档,然后基于debian去定制自己的发行版,在定制发行版的过程中,你会学到另外一套现代linux系统架构思路,收获更多。

  【知乎用户的回答(0票)】:

  波斯,请把我调到B6去。

  【李超的回答(0票)】:

  俺不是科班出身,所以给你提供一点新鲜的见解,Linux是一个让我玩得很happy的系统,比如怎样用shell+tmux扔掉鼠标,怎样把emacs打造成全能环境,怎么最酷地用vim,怎样安装Arch Linux,比较各种桌面环境的优缺点等等,总之鼓捣Linux是满足人好奇心的,如果你现在拿着Linux不知道学什么,就把心态放轻松,把它当玩具来玩好了。

  【haidao的回答(0票)】:

  个人有个比较偏的方法

  理解中断,特别是时钟中断。时钟中断类似于人的心跳,理解了心跳,就能够知道系统如何工作的,进程是在哪里调度,信号在哪里处理,内存在哪里检测是否需要与硬盘切换。

« 上一篇 下一篇 » admin原创文章,转载请注明出处! 标签:linux优化linux设置草根站长成功程序员提高程序员

相关日志:

«   2019年7月   »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  [查看权限]
网站分类
文章归档
网站收藏
友情链接
图标汇集