前言:从开始接触 Linux 内核应该有 4 ~ 5 年了,虽然不敢说非常了解 Linux
内核,但起码也有了点眉目。所以,本文主要想分享一下我的 Linux
内核入门之路,如果对大家有帮助的话,希望能够转发一下,帮助更多想学习内核的同学们。
本人大学的专业并不是计算机系,而是应用化学。在机缘巧合下接触到 PHP(那时候 PHP 还是挺火的),开始着迷地学习 PHP,基本上把图书馆所有 PHP 的书籍都借回来了。
由于不是计算机专业,所以只能在课堂偷偷看 PHP 的书(也不算偷看吧,因为根本没人会关注,哈哈)。并且开始自己写一些留言板、小型论坛、博客之类的网站(那时是08-09年的时候,现在论坛好像消失了),也开始接触 MySQL 数据库。
当然,写些小论坛是不能满足我的,所以不知天高地厚的我,开始看 PHP 是怎样实现的。但一看发现,全部都是 .c 的文件,我以前接触的都是 .php 的,所以完全看不懂。Google一下才发现(那时还没被墙的),原来是 .c 的文件是使用 C 语言编写的。
OK,不懂就学咯,还好那时是大四,比较闲。就去图书馆借了本经典的谭浩强版《C语言程序设计》,现在想起来,虽然这本书很多小错误,但还算比较通俗,不像C语言经典之作 K&R 版本的《C程序设计语言》那么难懂。
PS:我觉得是不是好书的标准是,你能不能从中学习到知识。所以对我来说,谭浩强版的《C语言程序设计》还算是本好书。
C 语言学起来不难,但用起来真的 TMD 难(So!PHP 是世界上最好的语言!!!),不过我学 C 语言也只是为了能看懂 PHP 源码。对 C 语言有了一点基础后,就开始看 PHP 的源码,最开始看的是 PHP 3.0 版本。其实那时候还是看不懂的,而且资料少之又少。
我也忘记是怎么开始看懂的,反正有一天突然好像开窍一样看懂了(难道是顿悟?),接着开始看 PHP 4.0 版本的源码。
这就开始我的程序员(码农)生涯…
毕业后一直从事 PHP 的开发,由于不是计算机专业,所以刚开始找工作挺困难的,只能从小公司做起(俗话说,万事开头难嘛)。
2011 年的时候,那时刚毕业2年,就开始不知天高地厚的想分享自己的经验(年轻人就是不懂事啊),但想起来当时好像也没什么经验分享… 就邀约了帅气的白菜兄写了本 PHP 的书籍《PHP核心技术与最佳实践》。
说了那么多废话,现在讲讲本人为什么要学 Linux 内核吧。因为第一家公司是家小公司,所以很多事情都要自己去干,比如:编译安装 PHP 环境,安装 MySQL 数据库等(因为当时没有云平台,都是自己搭建机器的)。
这样就开始接触到 Linux 系统,虽然大学也自己捣蛋过 Linux,但也没怎么深入去了解。刚开始使用 Linux 的时候,用惯 Windows 的我觉得太 TMD 难用了。不过因为工作需要没办法,硬着头皮上。
用着用着,就出现很多奇怪的问题,比如文件系统的 inode 不足(当时想,这是什么鬼…)。
好奇心的驱使下,又是不知天高地厚的我下载了最新版本的 Linux 源代码(当时应该是 3.0 吧)。解压后一看,傻眼了,简直是天书一样(因为当时也看了很长一段时间的 PHP 源码,对 C 语言也有比较深的认识),这还是我认识的 C 语言吗?所以,不得不放弃。
不过,怀着寻根问底的信念,我还是重新开始学习 Linux 内核。下面介绍一下我的学习之路。
有了上次的经验,这次我就从低版本的 Linux 学起,也就是 Linux 0.12。从 0.12 开始学起是因为 0.12 版本有本不错的书籍介绍,就是《Linux内核完全剖析》,下面就是它的封面:
其实刚开始看这本书的时候也有难度,主要是本人不是计算机专业,所以硬件相关的知识面比较差。另外,内核充斥着大量的汇编代码,所以必须要先了解汇编语言。
直到发现《x86汇编语言-从实模式到保护模式》这本书,我才开始慢慢了解操作系统的原理,封面如下:
这本书解开我很多迷雾,比如实模式和保护模式,虚拟内存与物理内存映射等。这本书虽然非常好,但有个问题,就是 Linux 使用的是 AT&T 风格的汇编,而这本书介绍的是 Intel 风格的汇编。所以,要看内核前,最好先了解下 AT&T 风格的汇编,网上也挺多资料。
所以,我建议先看完《x86汇编语言-从实模式到保护模式》这本,然后再看《Linux内核完全剖析》,那就基本能看懂 Linux 0.12 的源代码了,看懂 Linux 0.12 就算是 Linux 内核的入门了。
看懂 Linux 0.12 后,就可以开始看高版本的内核了。但在看高版本的内核之前,最好先了解下现代 Linux 的设计,所以我推荐下面这本书《Linux内核设计与实现》:
这本书介绍的是 Linux 2.6 版本,比较简单,而且没有过多的展示代码。但缺点就是,只是大概介绍 Linux 的设计,没有很详细的分析,不过作为入门是个不错的选择。
然后就是看 Linux 内核最经典的书籍:《深入理解Linux内核》。
这本书是学习内核必看的书籍,它非常详细的分析了 Linux 内核的原理和实现,而且译者是在 Linux 内核方面很有建树的“陈莉君”老师,翻译质量不错。这本书也是以 Linux 2.6 作为分析对象的,看完这本书,就可以直接去看 Linux 代码了。
看完上面这 4 本书后,对内核也有不错的认识了,当然最重要还是要多看内核源码。如果看完上面这些书,还是觉得不是太懂,那么就要祭出神器了。就是下面这本:
为什么说这本书是神器?因为这本书是我看过分析内核最详细的书籍,详细到你会觉得啰嗦。但缺点就是,使用的 Linux 版本太低(2.4.0),还有就是配图有点少。
除了上面这本,我还要推荐一下《深入Linux内核架构》这本书:
这本书分析比较详细,而且版本也相对较高,这本书我觉得作为选读吧,不看也没什么关系,可以直接看 Linux 源码。
Linux 内核的参考书就大概是上面这些了,当然还有很多其他的书籍,但我认为看完上面这些,再直接看源码就好了,毕竟看源码才能真正理解 Linux。
格拉德威尔在《异类》一书中指出:人们眼中的天才之所以卓越非凡,并非天资超人一等,而是付出了持续不断的努力,1万小时的锤炼是任何人从平凡变成世界级大师的必要条件。
所以,不是天赋异禀的话,还是好好遵从“1万小时定律”吧。
另外,如果你是刚入门的同学,建议把本文收藏起来,然后按照这个学习路径来学习,我觉得一定能学会 Linux 内核的。
那么,学习 Linux 内核有什么用途?最明显的就是面试时可以装下逼吧,还可以在工作中解决一些奇怪的内核问题。
内核学习路线推荐,喜欢研究内核,想在内核这块深入学习的,可以参考。课程体系7个专题组成:进程管理专题,内存管理专题,设备驱动专题,网络协议专题,内核组件专题,文件系统专题,内核项目实战专题。
进程管理专题
内存管理专题
设备驱动专题
网络协议专题
内核组件专题
文件系统专题
内核项目实战专题
1、手把手实现进程间通信
2、网络适合器实现
3、无存储文件系统实现
4、为内核添加自己系统调用
5、添加进程调度器
6、用户态文件系统实现
7、为内核防火墙做贡献之iptables
8、用slab实现内存池
9、内核定制化系统
10、向VFS添加自定义文件系统
Linux内核学习参考书籍
1、《深入理解LINUX内核》 第三版 [美] 博韦等著
2、《Linux设备驱动开发详解》 宋宝华 编著
3、《Linux内核设计与实现》 原书第3版 拉芙 (RobertLove) 著
4、《深入理解LINUX网络内幕》 [意] Benvenuti 著
5、《Linux设备驱动程序》 [美] 科波特(Corbet J.) 著
【文章福利】小编推荐自己的Linux内核技术交流群:【865977150】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!
面试常考题:
1、绝对路径用什么符号表示?当前目录、上层目录用什么表示?主目录用什么表示?切换目录用什么命令?
2、怎么查看当前进程?怎么执行退出?怎么查看当前路径?
3、怎么清屏?怎么退出当前命令?怎么执行睡眠?怎么查看当前用户id?查看指定帮助用什么命令?
4、Ls命令执行什么功能?可以带哪些参数,有什么区别?
5、建立软链接(快捷方式),以及硬链接的命令。
6、目录创建用什么命令?创建文件用什么命令?复制文件用什么命令?
7、使用哪一个命令可以查看自己文件系统的磁盘空间配额呢?
8、查看文件内容有哪些命令可以使用?
9、随意写文件命令?怎么向屏幕输出带空格的字符串,比如"hello world"?
10、终端是哪个文件夹下的哪个文件?黑洞文件是哪个文件夹下的哪个命令?
11、移动文件用哪个命令?改名用哪个命令?
12、复制文件用哪个命令?如果需要连同文件夹一块复制呢?如果需要有提示功能呢?
13、删除文件用哪个命令?如果需要连目录及目录下文件一块删除呢?删除空文件夹用什么命令?
14、Linux下命令有哪几种可使用的通配符?分别代表什么含义?
15、用什么命令对一个文件的内容进行统计?(行号、单词数、字节数)
16、Grep命令有什么用?如何忽略大小写?如何查找不含该串的行?
17、Linux中进程有哪几种状态?在ps 显示出来的信息中,分别用什么符号表示的?
18、怎么使一个命令在后台运行?
19、利用ps怎么显示所有的进程?怎么利用ps查看指定进程的信息?
20、哪个命令专门用来查看后台任务?
21、把后台任务调到前台执行使用什么命令?把停下的后台任务在后台执行起来用什么命令?
22、终止进程用什么命令?带什么参数?
23、怎么查看系统支持的所有信号?
24、搜索文件用什么命令?格式是怎么样的?
25、查看当前谁在使用该主机用什么命令?查找自己所在的终端信息用什么命令?
26、使用什么命令查看用过的命令列表?
27、使用什么命令查看磁盘使用空间?空闲空间呢?
28、使用什么命令查看网络是否连通?
29、使用什么命令查看ip地址及接口信息?
30、查看各类环境变量用什么命令?
31、通过什么命令指定命令提示符?
32、查找命令的可执行文件是去哪查找的?怎么对其进行设置及添加?
33、通过什么命令查找执行命令?
34、怎么对命令进行取别名?
35、du和df 的定义,以及区别?
36、awk 详解?
37、当你需要给命令绑定一个宏或者按键的时候,应该怎么做呢?
38、如果一个linux新手想要知道当前系统支持的所有命令的列表,他需要怎么做?
39、如果你的助手想要打印出当前的目录栈,你会建议他怎么做?
40、你的系统目前有许多正在运行的任务,在不重启机器的条件下,有什么方法可以把所有正在运行的进程移除呢?
41、bash shell中的hash命令有什么作用?
42、哪一个bash内置命令能够进行数学运算?
43、怎样一页一页地查看一个大文件的内容呢?
44、数据字典属于哪一个用户的?
45、怎样查看一个linux命令的概要与用法?假设你在/bin目录中偶然看到一个你从没见过的的命令,怎样才能知道它的作用和用法呢?