- 论坛徽章:
- 0
|
本帖最后由 程序员王柏生 于 2013-11-02 00:19 编辑
reyleon 发表于 2013-10-15 18:03
做为一名运维人员,根本就看不懂内核源码怎么办?
个人没有运维经验,但是和做运维的兄弟们多少有些交流。您也是做运维的,我相信您也和他们有近似的意见。从他们的角度来看,运维工程师更需要的是对系统宏观的掌握。对某个组件的内部的理解相对次要一点。
举一个昨天遇到的实际的例子。有一位同事遇到一个特殊的问题,大致情况是这样:发现服务器上有人通过 USB 接了一部手机,然后网络通过这部手机路由出去了。但是这位同事也不敢贸然动这部手机,就是想把这个网络禁掉。但是他通过如类似 ifconfig down 的命令发现这个手机模拟的出的 USB 网卡还很顽强,down 后马上又 up。事实上,即使能把这个手机模拟的 USB 网卡down掉,又能如何呢。如果再有另外一个通过 USB 接进来的网络设备呢,怎么处理? 我给这位同事提了解决方法之一:在 udev 中加一个 rule, 在这个 rule 中将内核报上来的 usb 网络设备全部禁掉。
从这个问题可以看出,了解系统的宏观结构是多么的重要,否则,遇到问题,可能没有一点线索,就会像无头苍蝇一样到处乱闯,而且费尽九牛二虎之力可能还没有加这么一个 udev rule来的方便通用。
对于您提到的“根本就看不懂内核源码”,这不是问题。如果您有那么一点小理想,只要坚持,一定可以看懂内核源码的。事实上,很多程序员可能都有这样的经历,即当我们接手其他程序员写的代码时,即使是比较简单的应用程序,初看时,我们也会经常丈二和尚,摸不着头脑。所以,从这个角度可以看出,并不是内核的代码逻辑上有多么难懂,而是我们的出发点不是特别恰当。当然,经过多年的演进,内核的代码要晦涩一些。
举个文件系统的例子,很多书中,一句一句分析寻找文件inode、文件读写的代码实现。看上去代码都不是很难,但是为什么很多程序员看完了也没有能很好的理解文件系统呢?我个人认为原因还是我们为了读代码而读代码。
换个角度,假设有这样一个题目:我们已知文件在存储介质上的存储方式(不同的文件系统都有相应的规范),那么请你编写一段代码来实现从存储介质上找到特定文件, 并读/写文件的内容。您怎么来解决这个问题?
显然,你首先要根据熟悉特定文件系统的规范,清楚的了解文件在存储介质上的存储方式,然后从根结点的inode开始,顺藤摸瓜,找到指定文件的inode, 然后根据文件inode中指向的datablocks, 读取datablocks的内容。所以,从这个角度,这段代码与一个简单的如某类文件的解析器有本质区别吗?只不过就是复杂点而已。所以,如果我们首先带着问题,并且从更高的角度宏观上理解某个部分的功能后,再去结合逻辑功能看代码实现,就要容易很多。原本打算把类似这些子系统的分析也放到《深度探索...》一书中,但是担心膨胀的太厉害,而且破坏主线。所以如果最近用空,我会陆续的在 CU 上把这些子系统写一下。当然和本书的风格一样,都是从实践、宏观的角度入手。
再比如驱动,事实上,写过驱动的工程师基本上都会认为驱动相比一些复杂的程序要简单很多。之所以大家比较关心驱动,原因之一是作为软件工程师,接触硬件的机会不多,造成大家觉得驱动很神秘,是系统底层。事实上,内核中的驱动部分之所以看上去比较复杂,很大一部分原因是拜操作系统所赐。以 Linux 为例,为了让驱动工程师开发更容易,Linux 将驱动的公共部分尽可能抽象出来,所以大致上可以概括为三层:最上层是对应文件系统接口;中间是公共的代码层,一般称之为 core;最下面的,也是最简单的部分,一般称为 low level层,这一层直接面对具体的硬件设备,由具体的硬件驱动工程师编写。显然,这样可以极大减少 low level 工程师的工作量。如果有过在一些结构相对单纯的操作系统(比如 RTEMS)上开发过驱动的经验的人,就会知道,驱动的开发要容易得多。就因为这些分层的结构,更加重了代码的复杂度。没办法,没有免费的午餐,这就是tradeoff。low level容易,其他实现就得麻烦点。而且,老外把这叫 framework, 很多程序员一看到 framework 就慌,别怕,没什么。
最后,我个人的观点认为最重要的还是宏观的掌握。对于任何部分,包括内核源码,也包括那些广为传播的经典书籍,比如《UNIX环境高级编程》,这些书籍都是作者用尽心血之作(当然不包括那些攒的书籍了),并无必要从头看到尾,很多书适合做 manual, 用的时候查阅一下就可以了。比如好多书中细致到把各个结构体的每一项都讲解一下,您能记住吗?反正我是记不不住。而且,为什么要记住呢?! 全部都去看也是浪费你宝贵的时间,一旦你宏观上理解了,很多部分都是融汇贯通,稍加理解和分析就可以很快看清其本质。从宏观上理解了,用的时候结合 man page + google + 书籍 进行实现即可。
|
|