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源码也没坏处。但凡事都要循序渐进,我的建议是题主可以根据这样一个姿势入坑:

首先,了解如何使用linux

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

入门书推荐底下两本:

1)鸟哥的linux私房菜

2)Linux命令行和Shell脚本大全其中强烈推荐基础较弱的可以用鸟哥那本来入坑,相对没那么复杂,原理介绍什么的都还算浅显易懂。

其次,学习使用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等应用层协议的开发人员,这可能是个问题吧。

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

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

深入内部:由于你已经了解了系统接口,同时也学习了如何使用这些接口进行编程,那么接下来再去了解linux系统的源码就是游刃有余了。不过linux源码那么长,功能那么多,你不是每个都需要去看的,根据需要选择自己感兴趣的部分进行阅读,建议你可以先从了解linux的系统架构开始,接着选择模块进行代码阅读。

TCP/IP详解:总共三卷,涉及到协议的实现机制(比那本国内的计算机网络要详细的多),协议的实现,以及应用层协议的实现等,如果你打算入网络这个方向的坑,可以试着在读完史蒂芬的《unix网络编程》两卷之后去看看这三本神书,也是他写的,虽然我没读过→_→深入Linux内核架构:如果你想了解linux系统,那么从架构入手是最吼滴,推荐下面两本

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

第一阶段:学习使用linux系统命令
第二阶段:学习linux系统函数
第三阶段:使用linux API开发系统应用
第四阶段:研读linux内核源码

推荐些源码
学习使用linux API开发服务端程序的源码你可以去看看nginx,这是目前实际应用比较多的,但是有个前提,就是你已经通过第二阶段的学习,并进入第三阶段再学。

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

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

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

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

【免费】C/C++Linux服务器开发/架构师

Linux、C/C++技术交流群:【960994558】整理了一些个人觉得比较好的学习书籍、大厂面试题、和热门技术教学视频资料共享在里面(包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等等.),有需要的可以自行添加哦!~在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值