盘点春招跳槽涨薪必备技能Linux内核技术(含学习路线)

前言:从开始接触 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 内核?

说了那么多废话,现在讲讲本人为什么要学 Linux 内核吧。因为第一家公司是家小公司,所以很多事情都要自己去干,比如:编译安装 PHP 环境,安装 MySQL 数据库等(因为当时没有云平台,都是自己搭建机器的)。

这样就开始接触到 Linux 系统,虽然大学也自己捣蛋过 Linux,但也没怎么深入去了解。刚开始使用 Linux 的时候,用惯 Windows 的我觉得太 TMD 难用了。不过因为工作需要没办法,硬着头皮上。

用着用着,就出现很多奇怪的问题,比如文件系统的 inode 不足(当时想,这是什么鬼…)。

好奇心的驱使下,又是不知天高地厚的我下载了最新版本的 Linux 源代码(当时应该是 3.0 吧)。解压后一看,傻眼了,简直是天书一样(因为当时也看了很长一段时间的 PHP 源码,对 C 语言也有比较深的认识),这还是我认识的 C 语言吗?所以,不得不放弃。

不过,怀着寻根问底的信念,我还是重新开始学习 Linux 内核。下面介绍一下我的学习之路。

Linux 内核入门之路

有了上次的经验,这次我就从低版本的 Linux 学起,也就是 Linux 0.12。从 0.12 开始学起是因为 0.12 版本有本不错的书籍介绍,就是《Linux内核完全剖析》,下面就是它的封面:
盘点春招跳槽涨薪必备技能Linux内核技术(含学习路线)_第1张图片

其实刚开始看这本书的时候也有难度,主要是本人不是计算机专业,所以硬件相关的知识面比较差。另外,内核充斥着大量的汇编代码,所以必须要先了解汇编语言。

直到发现《x86汇编语言-从实模式到保护模式》这本书,我才开始慢慢了解操作系统的原理,封面如下:
盘点春招跳槽涨薪必备技能Linux内核技术(含学习路线)_第2张图片

这本书解开我很多迷雾,比如实模式和保护模式,虚拟内存与物理内存映射等。这本书虽然非常好,但有个问题,就是 Linux 使用的是 AT&T 风格的汇编,而这本书介绍的是 Intel 风格的汇编。所以,要看内核前,最好先了解下 AT&T 风格的汇编,网上也挺多资料。

所以,我建议先看完《x86汇编语言-从实模式到保护模式》这本,然后再看《Linux内核完全剖析》,那就基本能看懂 Linux 0.12 的源代码了,看懂 Linux 0.12 就算是 Linux 内核的入门了。

Linux 内核进阶之路

看懂 Linux 0.12 后,就可以开始看高版本的内核了。但在看高版本的内核之前,最好先了解下现代 Linux 的设计,所以我推荐下面这本书《Linux内核设计与实现》:
盘点春招跳槽涨薪必备技能Linux内核技术(含学习路线)_第3张图片

这本书介绍的是 Linux 2.6 版本,比较简单,而且没有过多的展示代码。但缺点就是,只是大概介绍 Linux 的设计,没有很详细的分析,不过作为入门是个不错的选择。

然后就是看 Linux 内核最经典的书籍:《深入理解Linux内核》。
盘点春招跳槽涨薪必备技能Linux内核技术(含学习路线)_第4张图片

这本书是学习内核必看的书籍,它非常详细的分析了 Linux 内核的原理和实现,而且译者是在 Linux 内核方面很有建树的“陈莉君”老师,翻译质量不错。这本书也是以 Linux 2.6 作为分析对象的,看完这本书,就可以直接去看 Linux 代码了。

还有吗?

看完上面这 4 本书后,对内核也有不错的认识了,当然最重要还是要多看内核源码。如果看完上面这些书,还是觉得不是太懂,那么就要祭出神器了。就是下面这本:
盘点春招跳槽涨薪必备技能Linux内核技术(含学习路线)_第5张图片

为什么说这本书是神器?因为这本书是我看过分析内核最详细的书籍,详细到你会觉得啰嗦。但缺点就是,使用的 Linux 版本太低(2.4.0),还有就是配图有点少。

除了上面这本,我还要推荐一下《深入Linux内核架构》这本书:
盘点春招跳槽涨薪必备技能Linux内核技术(含学习路线)_第6张图片

这本书分析比较详细,而且版本也相对较高,这本书我觉得作为选读吧,不看也没什么关系,可以直接看 Linux 源码。

最后说说

Linux 内核的参考书就大概是上面这些了,当然还有很多其他的书籍,但我认为看完上面这些,再直接看源码就好了,毕竟看源码才能真正理解 Linux。

我们来总结一下读上面这些书的顺序:
盘点春招跳槽涨薪必备技能Linux内核技术(含学习路线)_第7张图片

格拉德威尔在《异类》一书中指出:人们眼中的天才之所以卓越非凡,并非天资超人一等,而是付出了持续不断的努力,1万小时的锤炼是任何人从平凡变成世界级大师的必要条件。
所以,不是天赋异禀的话,还是好好遵从“1万小时定律”吧。

另外,如果你是刚入门的同学,建议把本文收藏起来,然后按照这个学习路径来学习,我觉得一定能学会 Linux 内核的。

那么,学习 Linux 内核有什么用途?最明显的就是面试时可以装下逼吧,还可以在工作中解决一些奇怪的内核问题。

内核学习路线:

内核学习路线推荐,喜欢研究内核,想在内核这块深入学习的,可以参考。课程体系7个专题组成:进程管理专题,内存管理专题,设备驱动专题,网络协议专题,内核组件专题,文件系统专题,内核项目实战专题。

进程管理专题

  1. 进程原理:进程生命周期,task_struct结构,进程优先级,进程系统调用。
  2. 进程调度机制:调度器实现schedule(),完全公平调度类CFS,实时调度类原理 多核模式调度SMP
  3. 进程竞争机制:RCU机制原理,内存优化与屏障,大内核锁,per_CPU计数器。
  4. 进程系统调用:写时复制原理,进程内存布局,进程堆栈管理,系统调用实现流程。

内存管理专题

  1. 内存原理:(N)UMA模型组织,页表原理,处理器高速缓存,TLB工作原理。
  2. 物理内存:伴伙算法,slab/slub/slob分配器,内存映射。分配器原理,不连续页原理。
  3. 虚拟内存:进程内存映射,进程堆栈管理,用户空间缺页异常,内核空间与用户空间。
  4. 内存系统调用:kmalloc/vmaloc,BRK,内存池机制,内存优化。

设备驱动专题

  1. 设备子系统原理:字符设备子系统,块设备子系统,网络适配器子系统,I/O原理。
  2. 字符设备驱动:file_operations原理,系统调用流程,ioctl流程,请求中断
  3. 块设备驱动:资源管理,I/O调度,BIO结构原理,PCI总线原理
  4. 网卡设备驱动:net_device/net_device_ops,sk_buff原理,网卡数据中断,网络适配器映射。
  5. 内核模块架构:模块添加与删除,自动化与热插拔,主从设备号,版本控制。

网络协议专题

  1. 网络系统架构:接收缓冲区,发送缓冲区,netfilter,iptables。
  2. 网络协议栈:TCP/UDP,TCP控制块,IP协议,netlink机制
  3. 系统API:POSIX网络API,epoll实现原理,socket初始化,网络系统参数设置

内核组件专题

  1. 时间管理:通用时间子系统,高分辨率定时器,动态时钟结构,定时器系统调用实现。
  2. 系统缓存:页缓存实现,块缓存实现。
  3. 数据同步:数据同步原理,inode同步与拥塞,强制回写与完全同步。

文件系统专题

  1. 虚拟文件系统VFS:通用文件模型,VSF结构 ,文件操作系统调用,file/inode原理。
  2. 无存储文件系统:proc文件系统,文件系统数据结构,管理/proc数据项,系统控制机制。
  3. sysfs文件分析:sysfs数据结构,装载文件系统,文件目录 操作,向sysfs增加数据。
  4. 磁盘文件系统:Ext2文件系统,Ext3文件系统,Ext4文件系统。
  5. 用户态文件系统:FUSE使用场景,FUSE原理,FUSE实现 ,用户态文件接口实现。

内核项目实战专题

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】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!
盘点春招跳槽涨薪必备技能Linux内核技术(含学习路线)_第8张图片

附录

面试常考题:

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目录中偶然看到一个你从没见过的的命令,怎样才能知道它的作用和用法呢?

你可能感兴趣的:(编程语言,linux,大数据,架构)