盘点春招跳槽涨薪必备技能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内核完全剖析》,下面就是它的封面:
其实刚开始看这本书的时候也有难度,主要是本人不是计算机专业,所以硬件相关的知识面比较差。另外,内核充斥着大量的汇编代码,所以必须要先了解汇编语言。
直到发现《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.) 著
【文章福利】小编推荐自己的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目录中偶然看到一个你从没见过的的命令,怎样才能知道它的作用和用法呢?
盘点春招跳槽涨薪必备技能Linux内核技术(含学习路线)相关推荐
- Java程序员涨薪必备技能
2019独角兽企业重金招聘Python工程师标准>>> Java程序员涨薪必备技能 Java程序员涨薪必备技能 工作1-3年,当我们向老板提出加薪的时候,或者跳槽去"捡&q ...
- Java程序员涨薪必备技能(1-3年必看!)
工作1-3年,当我们向老板提出加薪的时候,或者跳槽去"捡"offer的时候,我们底气够吗? 敢不敢不给涨薪就"挥一挥衣袖,不带走一个bug"?是不是提出要求后你 ...
- 程序员涨薪必备技能(1-5年必看!!!)
不知道你们多长时间没有参加过面试了. 我昨天参加了一线大厂的技术面,被问到了一些并发相关的问题,没想到这么难: synchronized volatile的CPU原语是如何实现的? 无锁.偏向锁.轻量 ...
- 「2022」跳槽涨薪必备面试题及答案——VUE篇(超详细)
总结不易,希望可以帮助到即将面试或还在学习中的web前端小伙伴,祝面试顺利,拿高薪! 1.vue优点 轻量级 速度快 简单易学 低耦合 可重用性 独立开发 文档齐全,且文档为中文文档 2.vue父组件 ...
- php后台对接ios,安卓,API接口设计和实践完全攻略,涨薪必备技能
2016年12月29日13:45:27 关于接口设计要说的东西很多,可能写一个系列都可以,vsd图都得画很多张,但是由于个人时间和精力有限,所有有些东西后面再补充 说道接口设计第一反应就是restf ...
- 2019 年美团点评高级 Android 开发寒冬跳槽涨薪经验掏心分享
2019 年美团点评高级 Android 开发寒冬跳槽涨薪经验掏心分享 目录 个人简介 笔者的简要介绍 跳槽涨薪要考虑的方面有哪些? 你是正在拿着卖白菜的钱,操着卖白粉的心吗? 你真得觉得是时候跑路了 ...
- 关键选择:等公司加薪or跳槽涨薪?
2008 年我开始在西安工作,月薪是 6800 .2014 年,月薪变为 14900 .这 7 年,薪水年均增长 11.86% . 看起来还不错吧?很多人待在一家公司,会有两三年都不涨薪,或者每年普涨 ...
- 线程池每次用都创建吗_跳槽涨薪季面试题之多线程(三)
点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 面试题一:跳槽涨薪季面试题之java基础(一) 面试题二:跳槽涨薪季面试题之java8特性(二)--文末送书 1.什么是线程? 线程是操作 ...
- java 多态判断非空_跳槽涨薪季面试题之java基础(一)
点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 为迎接金九银十跳槽涨薪季,小编汇总了java精编版面试题,大概从java基础.java8特性.多线程.spring.springboot. ...
最新文章
- 奇点汽车打算明年推L3自动驾驶,不用激光雷达
- linux fedora安装flameshot火焰截图
- Python 学习日记 第四天
- strtus2改成springboot_ssh框架使用springBoot升级迁移替换Struts2
- 3d数学基础:图形和游戏开发(第2版)_人教版五年级数学上册教学计划进度表
- Fast marching on 3D meshes with diffusion distance
- python serial库文件下载_python serial模块
- gflags 调试内存_windows下堆异常调试神器--gflags
- GitHub图片加载不出来解决方案(超详细图文教程)
- 项目实训(一)基于unity的2D多人乱斗闯关游戏设计与开发 unity的下载及了解
- fir.im 自动打包上传
- 《给中国学生的第四封信:大学四年应是这样度过》
- 用github写开源书籍
- Word2013目录设置,页码对齐
- 百度编辑器的样式手机端配置
- MS-RTOS --- 技术特点及其检测标准
- 【JVM学习笔记】内存回收与内存回收算法 就哪些地方需要回收、什么时候回收、如何回收三个问题进行分析和说明
- 给我的电脑右键菜单添加{管理}菜单...
- B2C电子商务系统研发
- java中sha1解密_SHA1解密
热门文章
- 想玩刺激战场丧尸模式?教你怎么进刺激战场国际服体验服打丧尸
- LeetCode 提莫攻击
- 2018年重塑科技行业的15个趋势之(5-10)
- 创建LVM逻辑卷步骤(详细)
- wps专业版 wps表格怎样设置默认保存为xls格式呢
- 6.20-安装Nvidia gt660ti 显卡驱动
- 【Python游戏】Python各大游戏合集(4):足球、拳皇、阴阳师、蔡徐坤大战篮球 ,地道战 | 附带源码
- Windows自带磁盘管理工具——diskpart
- Text 1 Do We Need Extra Vitamins?
- python爬虫下载电影百度文档_写一个python 爬虫爬取百度电影并存入mysql中