说说我的学习经历吧。因为我对这方面也非常感兴趣,而且年龄和背景和题主十分相似。
本人现在大三,专业是计算机工程,带电的东西都学。暑假收到了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使用方面的东西了,不会的时候再上网查(其实我每次查了都记不下来)。如有不同意见,请无视我的“体会”,因为实在是误人子弟。

— 完 —

本文作者:Tianheng Chen

【知乎日报】
你都看到这啦,快来点我嘛 Σ(▼□▼メ)

此问题还有 12 个回答,查看全部。
延伸阅读:
如何深入学习 Linux 系统管理?
学习 Linux 有哪些好处?

分享到