学习内核


作者:麻薬販売穗乃果 链接:https://www.zhihu.com/question/20541014/answer/93834041 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

“以后想从事Linux 后台开发” 根据这个描述,题主应该是打算入linux系统开发这个坑

说到linux或者unix开发,没有用过这类系统以及没接触过底层系统开发的人都会错误地认为,系统开发就是开发系统,所以他们总是觉得,非要去看懂系统源码才能干系统开发。 实际上这也是这几年我司招应届生遇到的一个尴尬问题,就是好多人不敢投系统开发岗的原因是因为他们觉得自己没读过linux源码,没那个“资格”投系统开发。 实际上系统开发这个岗的工作无外乎就是调用现有的linux操作系统外部编程接口(applicant programming interface, API)来实现一些“底层应用”,需要他们了解的无外乎就是socket接口,TCP/IP协议,以及一些基本的服务端编程经验,例如你要是用linux的socket api for C写过服务器那就更好了。

简单介绍一下几个与操作系统相关的开发层次: 1)硬件系统开发:这一层主要负责做一些诸如电路板设计,如VHDL,实现一个提供基本二进制映射的芯片器,或者将硬件指令烧制到CPU内部实现微指令集之类的工作,不属于IT公司所说的底层开发。 2)内核系统开发:这一层主要负责在给定的体系结构系统上实现一个操作系统,从无到有实现一个操作系统。所谓实现一个操作系统,无外乎就是实现操作系统的一些服务和功能,例如,提供文件读写啊,提供TCP/UDP的数据传输接口啊。这一层位于系统API之下,具体而言,就是试图在硬件结构之上实现系统的编程接口的功能。什么意思?大家应该都调用过read/write函数,但是有人想过这些函数是怎么实现的吗(就类似于大部分C语言学习者都用过printf但是很少有人去考虑实现一个printf吧),这就是内核开发干的事儿,即实现那些你经常调用的系统函数。 3)系统应用开发:这一层是大部分IT企业所说的系统开发干的事儿,就是,调用我上面说的那些系统API去实现一些基本的应用功能,例如用linux提供的文件读写接口函数实现一个STL,例如用linux socket接口实现一个HTTP协议的服务器(如nginx或apache之类的服务程序)。你可以发现,干这些活其实不需要真的去了解内核代码,即不需要去了解这些程序所调用的API是怎么实现的,你需要了解的无非是:我调用那些系统函数,这些系统函数是干什么的,接受什么参数,按什么顺序调用;最后根据你需要实现的功能去编写代码。

学习内核
所以题主现在的问题是,他错误地把这个图中“内核开发”那一块的工作当成后台开发的全部,而实际情况是,后台系统开发的工作大部分都集中在第一层和第二层!

对于linux开发,如何入门? 其实既然你打算入这个坑,那么看看Linux源码也没坏处。但凡事都要循序渐进,我的建议是题主可以根据这样一个姿势入坑:
  1. 首先,了解如何使用linux

换言之,你需要从了解这个系统“提供哪些功能/服务”开始,学习shell脚本,练习如何在命令行端口使用linux提供的各类操作,如文件删除,创建,格式化,链接等等。这个过程是必不可少的,一个不了解linux提供什么功能的人,去看代码也看不懂它到底是打算实现个什么玩意儿。

入门书推荐底下两本: 1)鸟哥的linux私房菜(不想买书的可以去看他的博客 ==>鸟哥的Linux私房菜简体首页2)Linux命令行和Shell脚本大全 其中强烈推荐基础较弱的可以用鸟哥那本来入坑,相对没那么复杂,原理介绍什么的都还算浅显易懂。

2. 其次,学习使用linux系统库函数 在你了解了linux操作系统提供哪些具体功能后,你肯定对它的某些功能非常感兴趣,例如,你可能会问,这个权限怎么检查,怎么去实现一个cat/rm/rmdir之类的文件处理命令,怎么去编程实现ping这类命令?那么你就需要了解系统API,即了解linux都提供了你那些系统函数可供调用。

学习用书推荐两本:
  • UNIX高级环境编程
  • UNIX网络编程

第一本介绍UNIX系统的主要几个编程接口,包括文件读写,网络接口读写等,读完这本书中的API你会了解如何自己去实现那些shell脚本中的文件处理命令。 第二本重点介绍UNIX系统提供的套接字API(socket API)。这些套接API提供了用户TCP和UDP传输层协议的编程接口,以及一些多线程的编程接口。 利用这些接口你可以实现一个你自己的“服务器程序”,实际上,那些比较牛逼的apache或者nginx的服务器程序就是通过调用linux的套接字接口,来实现了HTTP协议的服务器程序。

发现了吗?Linux系统直接提供了TCP/UDP的传输层编程接口,而底层开发的时候,你不需要去了解TCP/UDP的具体实现机制,只需要关注如何设计应用层协议,如何编程实现应用层协议,如何优化TCP连接队列等。这是目前我司招的学生主要干的事情,至于优化linux的网络协议模块,额,这基本上是一个低概率事件,实际情况是,如果可能,我们大多选择优化应用层协议。

这也反映了一个问题,现在很多学校对HTTP协议只进行简要介绍,但是对协议的具体实现提及甚为罕见。而在实际工作中,我们又很缺一些了解和实践过HTTP等应用层协议的开发人员,这可能是个问题吧。

3. 学习应用层协议,阅读开源服务器源码:在你足够了解linux的底层socket API之后,你可以尝试着去看一些开源服务器,如nginx的源码,了解一些应用层协议的具体机制,如HTTP。这方面资料你可以自己去百度

我看的是这两本: 《HTTP权威指南(国内首本HTTP及其相关核心Web技术权威著作)》([美]David...)【简介 《Nginx高性能Web服务器详解》(苗泽...)【简介

4. 深入内♂部:由于你已经了解了系统接口,同时也学习了如何使用这些接口进行编程,那么接下来再去了解linux系统的源码就是游刃有余了。不过linux源码那么长,功能那么多,你不是每个都需要去看的,根据需要选择自己感兴趣的部分进行阅读,建议你可以先从了解linux的系统架构开始,接着选择模块进行代码阅读。
  • TCP/IP详解:总共三卷,涉及到协议的实现机制(比那本国内的计算机网络要详细的多),协议的实现,以及应用层协议的实现等,如果你打算入网络这个方向的坑,可以试着在读完史蒂芬的《unix网络编程》两卷之后去看看这三本神书,也是他写的,虽然我没读过→_→
  • 深入Linux内核架构:如果你想了解linux系统,那么从架构入手是最吼滴,推荐下面两本

《深入Linux内核架构 (德)莫尔勒 著》(德)莫尔勒 著 《Linux 内核完全剖析――基于0.12内核》(赵炯...)【简介

参考书目链接(购买需谨慎,没到那步请先不要购入)
  • 第一阶段:学习使用linux系统命令
[1] 《鸟哥的Linux私房菜 基础学习篇(第三版)(Linux领域名人鸟哥带你迈入Linux殿堂)》(鸟哥...)【简介 [2] 《鸟哥的Linux私房菜:服务器架设篇(第3版)(超级畅销书第三次改版升级,适用于各种主流Linux版本!决战大数据时代!IT技术人员不得不读!)》(鸟哥...)【简介 [3] 《Linux命令行与Shell脚本编程大全(第2版)(轻松全面掌握命令行和shell 黑客进阶必读)》([美]Richard...)【简介
  • 第二阶段:学习linux系统函数
[4] 《UNIX环境高级编程(英文版 第3版)》([美]W...)【简介 [5] 《UNIX网络编程(卷1套接字联网API第3版)/图灵计算机科》(美)史蒂文斯//芬纳//鲁道夫 [6] 《UNIX网络编程 卷2 进程间通信 第2版 英文版》([美]W....)【简介 [7] 《Linux/UNIX系统编程手册(上、下册)》([德]Michael...)【简介 [8] 《UNIX编程环境》([美]Brian...)【简介
  • 第三阶段:使用linux API开发系统应用
[9] 《HTTP权威指南(国内首本HTTP及其相关核心Web技术权威著作)》([美]David...)【简介 [10] 《Nginx高性能Web服务器详解》(苗泽...)【简介 [11] 《TCP/IP详解 卷1:协议(英文版第2版) (TCP/IP领域不朽名著,Stevens传世之作)》((美)Kevin...)【简介
  • 第四阶段:研读linux内核源码

其实没啥好推荐的,等你到了这个阶段问其他大神吧 TvT PS:请务必记住,上面的书不是说你现在就马上买进来!注意,必须是你到了这个学习的阶段再买,否则买来浪费钱你还看不懂。

  • 推荐些源码

学习使用linux API开发服务端程序的源码你可以去看看nginx,这是目前实际应用比较多的,但是有个前提,就是你已经通过第二阶段的学习,并进入第三阶段再学。 nginx: download 《Nginx高性能Web服务器详解》(苗泽...)【简介

  • Linux系统开发学习路线图总结

学习内核
当然,无论你是往上走(系统应用开发),还是往下走(内核/开发操作系统),前两个都是必经之路(当然有的大神早已对第一第二步是轻车熟路,还求轻喷- -)

至于题主说的,自己想做“linux后台开发”,那么就是要往上走,因为目前国内比较需要的就是开发和维护服务器程序,无外乎写几个脚本(第一阶段),牛逼点的让你开发个小的服务器/日志处理程序(第二阶段),牛逼哄哄的就抓去优化现有的服务器架构(往上走,第三阶段),极少有需求会提及优化TCP/UDP程序接口的(往下走,第四阶段)。

当然貌似有些公司就特别喜欢自己搞一套新的内核模块装逼,但我所在的部门很少去重构个内核啥的,我所了解的服务端底层开发还没见有多少涉及到重写内核的。

当然,如果你除了第一到第三阶段的技能点都点满外,还读过linux内核代码,那么是加分项,面试官也不会因为你学了个不怎么用的技术就去鄙视你,毕竟我周围不少同事也没读过linux内核,他们大都处于第二步的初期学习阶段

或者第一阶段TwT

-------------------------------------------------------------- 还有题主说C语言,算法什么的,那是基础好吗,你数据结构都没学好的话,估计也是通不过笔试的吧→v→