写点什么

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

作者:Linux爱好者
  • 2022 年 4 月 12 日
  • 本文字数:5043 字

    阅读完需:约 17 分钟

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

前言:从开始接触 Linux 内核应该有 4 ~ 5 年了,虽然不敢说非常了解 Linux 内核,但起码也有了点眉目。所以,本文主要想分享一下我的 Linux 内核入门之路,如果对大家有帮助的话,希望能够转发一下,帮助更多想学习内核的同学们。


23岁精通所有底层原理,拿到了腾讯60万年薪offer

2022年嵌入式开发想进互联网大厂,你技术过硬吗?

从事十年嵌入式转内核开发(23K到45K),给兄弟们的一些建议

我的“码农”之路

本人大学的专业并不是计算机系,而是应用化学。在机缘巧合下接触到 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内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈

为什么要学 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 内核完全剖析》,下面就是它的封面:


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

直到发现《x86 汇编语言-从实模式到保护模式》这本书,我才开始慢慢了解操作系统的原理,封面如下:

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

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

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 个专题组成:进程管理专题,内存管理专题,设备驱动专题,网络协议专题,内核组件专题,文件系统专题,内核项目实战专题。


进程管理专题

进程原理:进程生命周期,task_struct 结构,进程优先级,进程系统调用。

进程调度机制:调度器实现 schedule(),完全公平调度类 CFS,实时调度类原理

多核模式调度 SMP。

进程竞争机制:RCU 机制原理,内存优化与屏障,大内核锁,per_CPU 计数器。

进程系统调用:写时复制原理,进程内存布局,进程堆栈管理,系统调用实现流程。


内存管理专题

内存原理:(N)UMA 模型组织,页表原理,处理器高速缓存,TLB 工作原理。

物理内存:伴伙算法,slab/slub/slob 分配器,内存映射。分配器原理,不连续页原理。

虚拟内存:进程内存映射,进程堆栈管理,用户空间缺页异常,内核空间与用户空间。

内存系统调用:kmalloc/vmaloc,BRK,内存池机制,内存优化。


设备驱动专题

设备子系统原理:字符设备子系统,块设备子系统,网络适配器子系统,I/O 原理。

字符设备驱动:file_operations 原理,系统调用流程,ioctl 流程,请求中断

块设备驱动:资源管理,I/O 调度,BIO 结构原理,PCI 总线原理

网卡设备驱动:net_device/net_device_ops,sk_buff 原理,网卡数据中断,网络适配器映射。

内核模块架构:模块添加与删除,自动化与热插拔,主从设备号,版本控制。


网络协议专题

网络系统架构:接收缓冲区,发送缓冲区,netfilter,iptables。

网络协议栈:TCP/UDP,TCP 控制块,IP 协议,netlink 机制

系统 API:POSIX 网络 API,epoll 实现原理,socket 初始化,网络系统参数设置


内核组件专题

时间管理:通用时间子系统,高分辨率定时器,动态时钟结构,定时器系统调用实现。

系统缓存:页缓存实现,块缓存实现。

数据同步:数据同步原理,inode 同步与拥塞,强制回写与完全同步。


文件系统专题

虚拟文件系统 VFS:通用文件模型,VSF 结构 ,文件操作系统调用,file/inode 原理。

无存储文件系统:proc 文件系统,文件系统数据结构,管理/proc 数据项,系统控制机制。

sysfs 文件分析:sysfs 数据结构,装载文件系统,文件目录 操作,向 sysfs 增加数据。

磁盘文件系统:Ext2 文件系统,Ext3 文件系统,Ext4 文件系统。

用户态文件系统: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.) 著


附录

面试常考题:

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

发布于: 刚刚阅读数: 2
用户头像

外在压力增加时,就应增强内在的动力。 2020.12.03 加入

擅长底层原理开发技术,分享技术和经验

评论

发布
暂无评论
盘点春招跳槽涨薪必备技能Linux内核技术(含学习路线)_内存管理_Linux爱好者_InfoQ写作平台