学习内核


 
作者:麻薬販売穗乃果 链接: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→
译 者 序 当着手翻译这本书时,我不由得回想起开始接触Linux的那段日子。 几年前,我们拿到Linux内核代码开始研究时,可以说茫然无措。其规模之大,叫“覆压三百余里,隔 离天日”似乎不为过;其关系错综复杂,叫“廊腰缦回,檐牙高啄,各抱地势,勾心斗角”也不言过其实; 阿房宫在规模和结构上给人的震撼,可能与Linux有异曲同工之妙。“楚人一炬,可怜焦土”,可能正是因 为它的结构和规模,阿房宫在中国两千多年盛极的封建历史中终于没有再现,只能叫后人扼腕叹息;但是, Linux却实实在在的矗立在我们面前,当我们徘徊在这宏伟宫殿之前时,或许,我们也需要火炬——不是用 来毁灭,而是为了照亮勇者脚下的征途。 Linus Torvalds在我们面前展现的Linux魔法卷轴,让我们的视野进入一个自由而开放的新世界。自由 意味着自我价值的实现,开放代表着团结协作的理想,这对于从没把握过核心操作系统的中国人来说,无 疑点燃起了心中的梦想。于是,许多人毫不犹豫地走进来了,希望深入到那散发自由光彩、由众人团结协力 搭造起的殿堂。但是很快,不少人退缩了。面对这样一个汪洋大海,有的人迷惑了,出海的航道在哪里?有 的人倒下了,漫漫征途何时是尽头?我常常想,如果那时他们手中就有这本书的话… Daniel P.Bovet和Marco Cesati携手,为我们打造了这本鸿篇巨著,自此我们有了火把,有了航海图, 于是我们就有了彼岸,有了航道,也有了补给码头。不是吗,中断虽繁,但第四、六两章切中肯綮地剖析, 肯定能让你神清气爽;内存管理虽难,但多达三章细致入微的说理,一定会让你茅斯顿开。而内容的组织更 是别具匠心,每章开始部分一般性原理的描述,打破知识的局限,将每个部分的全景展现在你面前。而针对 每个知识点,落到实处的独到分析,又会使你沉迷于知识的融会贯通之中。第三版对Linux2.6的全面描述, 会使你为2.4与2.6之间的沟壑而感叹,但请放心,你曾从Linux旧版本获取的点滴依然是你前进的基石。总 之,你面对的不再是赤裸裸的代码,而是真正能雅俗共赏的艺术。 对整个Linux社区来说,这绝不是微末的贡献而已,连Andre Morton都已经指出:“内核学习曲线 变得越来越长,也越来越陡峭。系统规模不断扩大,复杂程度不断提高。长此以往,虽然现在这一拨内核开 发者对内核的掌握越发炉火纯青,但却会造成新手无法跟上内核发展步伐,出现青黄不接的断层”。而这本 书的目的,无疑于此吻合。按照这本书指明的道路,我们可以躲过暗礁,绕过险滩,穿过逆流,勇往直前。 这也是为什么这本书总在Linux书籍排行榜中稳居前列的原因之一。 不过,除非行动,否则地图再好,也不会让人向自己的目标迈进半步。所以,在读书的同时,你还一定 要亲身实践:理解内核某部分的捷径就是对它做些修改,这样你才能越过代码本身看到内核深层机理。 Linux是一个全新的世界,世界意味着博大精深,而新或许代表对旧的割舍和扬弃,加在一起,就是要 我们在割舍和扬弃的同时还要积累知识到博大精深的地步,这容易做到吗?是的,这不容易做到。Gerald M. Weinberg在《Becoming a Technical Leader: An Organic Problem-Solving Approach》一书中总结成长为高 原-低谷模式:“成长是跳跃式的,要经过量的积累,在积累的过程中,往往要伴随着扬弃,所以常常会跌 入低谷”。面对Linux这个需要长期孜孜以求的学习对象,无疑这种震荡会加重我们的疑虑,降低我们的信 心,消磨我们的意志,使我们轻易的认为达到了自己的成长上限。 根据我们的经验,这需要系统思考来改变心智模式,最好有一个学习型组织来提供帮助:团队是学习 的最佳单位。(可以参看彼得.圣吉的《第五项修炼》,这本书值得有心改变自己,并进而改善周围世界的人一 读再读)所以,我们希望结合这本《深入理解Linux内核》,创造这样的一个氛围,一种环境。为此在 www.KernelTravel.net 建立了中文网站“内核之旅”,不但有一些有价值的资料,而且我们会把这些资料按 照学习路径组织起来,让它们真正伴随内核学习者前进。 阅读本书,需要一份耐心,更需要一份执着。当你闯过一道道难关,阅读到本书的最后一章时,会有“ 蓦然回首,那人却在灯火阑珊处”的感觉!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值