如何更深入地学习 Linux?

时间:2021-11-05 15:13:36

如何更深入地学习 Linux?  这是在知乎上看到的提问和回答,原地址:http://www.zhihu.com/question/23564190 

觉得很有用,就搬到这里来了。以下为原帖内容:-----------------------------------------------------

如何更深入地学习 Linux?

我是一个在校的大二学生,对 Linux 非常感兴趣,以后想往 Linux 方向发展,现在能熟练的操作 Linux 系统,基本上熟悉了各种命令,也能写一些 shell 脚本,平时写代码都用 Linux,基本上可以独立搭建各种开发环境,C 语言、操作系统原理学的不错,但是学校并没有这样的课程安排,现在也很迷茫,不知道如何才能更加深入的学习 Linux,比如 Linux 内核,驱动开发或者运维等等,希望各位大神能给一些意见

如何更深入地学习 Linux?Tianheng Chen一事无成,倒霉透顶

知乎用户、周泰陶菡 等人赞同
说说我的学习经历吧。因为我对这方面也非常感兴趣,而且年龄和背景和题主十分相似。
本人现在大三,专业是计算机工程,带电的东西都学。暑假收到了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使用方面的东西了,不会的时候再上网查(其实我每次查了都记不下来)。如有不同意见,请无视我的“体会”,因为实在是误人子弟。
2014-05-04 收起评论 感谢 分享 收藏  没有帮助  举报如何更深入地学习 Linux?梁玉亮有什么中文书你觉得比较好的啊,系统 linux 嵌入式编程有关的2014-05-13 回复  举报如何更深入地学习 Linux?Tianheng Chen(作者) 回复 梁玉亮不太清楚,我都是看的英文版的。。。。国内这方面资料比较匮乏,我看过一本《深入理解linux内核》,不过这本书的翻译言不达意,一比吊糟,不推荐。2014-05-13   如何更深入地学习 Linux?知乎用户楼主在国内?10:53   如何更深入地学习 Linux?Tianheng Chen(作者) 回复 知乎用户不在,美国10:59   如何更深入地学习 Linux?陈大炮 回复 Tianheng Chen(作者)一比吊糟。。你是南京人??16:07   如何更深入地学习 Linux?知乎用户同意,原来也捣鼓了一些命令,配置什么的,发现那样没什么大的帮助,还是看一些系统开发和应用开发比较好17:52              
孙立伟资深码农 noware.cn给你一个网站,Welcome to Linux From Scratch!,尽情的折腾吧。

夏华林未来准攻城狮,准程序猿。吃货一枚,但怎么都不胖
推荐一本书,《深入Linux内核架构》
有精力的话,可以读一读,书挺厚,中文版翻译的也不错。

王树蓬Linux 嵌入式工程师
先看,Robert Love 的 linux kernel development 。
《Linux内核设计与实现(原书第3版)》([美]Robert Love)【摘要 书评 试读】
再看,Wolfgang Mauerer 的 professional linux kernel architecture 。
《深入Linux内核架构》([德]莫尔勒)【摘要 书评 试读】
期间结合代码和实践。