超级解霸之父梁肇新在他书中提到程序员进阶的几个阶段,我非常同意这位大师的观点。
其中有个阶段就是学习驱动程序和理解操作系统的内核,从1990年一直有以研究linux内核所引发的研究操作系统内核的一股风潮。Ring0,Ring3,虚拟内存,系统调用,进程同步,缺页等等,有一些听起来很炫的专业词汇,更有甚者,以为自己能说出这些词,自己就是高手了。
Ring0/3,如果你不懂Intel IA-32体系架构,那么请你谦虚一点。
虚拟内存,page pool,page file,swap partition,如果你没有仔细研究过当代CPU中的MMU的一些共性,当虚拟页面不在时,CPU如何响应,CPU特权级如何切换。这些都是硬件知识。虚拟内存的管理涉及ring0内核的管理,和ring3普通进程管理,他们是关系?这些你都不懂,那么请你谦虚一点。
系统调用,Intel CPU的trap 0x80是实现linux系统调用的入口,然后ring0内核再进行一次派发,最后到达实现体。windows也是类似,他们运行在同一个CPU上,不可能有太大区别。当然这里有安全机制,不可能让你这么容易就进入ring0胡作非为。如果这些你都不懂,那么你就很难想象windows如此多的DLL是干什么的,他们之间的堆叠关系,Windows丰富的API都做了些什么,在哪个ring运行,更很难想象,很多API会引发一场轰轰烈烈的ring3到ring0的切换。ntDll.dll这个连接ring0与ring3的使者在干什么。Glibc在linuxz这个系统中的地位。如果你不懂,那么请你谦虚一点。
进程同步,进程调度算法,这个是现在的大学最喜欢教学生的部分,还会出很多颠过来倒过去的题让学生作答。这些东西没他们宣扬的那么重要。Tanenbaum教授在<
缺页,现代物理内存有限,只好用虚拟内存,没进程2GB,或者4GB空间,说起来很容易,我只想问你理解么?为什么WINCE5.0进程是32MB,6.0是2GB?微软会做什么调整?你能想象一下么?如果你是微软,那么你怎么做这个调整?createprocess底层实现中,进程空间内存分配原则就要改掉。.exe有两个模型,一个是在文件系统中的模型,一个是在进程空间的模型,他们往往会有差异,微软建立在COFF文件结构基础上的的PE文件结构是如何来说明她们的不同。Process loader在操作系统中的地位。有次引发的page on demand策略的产生。多任务不一定要实现缺页,只要进程足够小。但是多任务,而且每进程空间都是CPU所能承受的最大空间,这就必须有缺页机制。如果你都不懂,那么请你谦虚一点。
一个操作系统是在另一个操作系统里面编译完成的,你信么?还有很多很多的知识,你懂么?如果你说你都懂,好,那么我告诉你,你也没什么了不起。哦你说你可以用C+汇编实现上面东西,那么我告诉你,你同样没什么值得骄傲的,这个世界上很多人都能写自己的内核,注意我说的是“内核”,仅仅指“内核”。你能写只能说明你的编程功底很深,你能预见这些技术难题。补充一下,这些“技术难题”在现代根本不是难题,但确实是几十年前的技术难题。说明你把“古人”的解决这些问题的方法掌握了,计算机对你已经很通透。但是程序员的最高境界你仍未达到。内核只是整个操作系统中的一部分,是核心部分,注意不要被“核心”二字迷惑,它只是指地理位置的核心,并不是指重要性的核心。你可知道微软的office套件比他的XP professional贵很多。相信不用我说你也可以理解。说明微软在OFFICE上所花的心血绝对不亚于一个操作系统。从这些“高手”认为,内核最牛,可是你看office这样应用程序会比你的内核复杂,你信么?有幸您写一个能和微软这么强大的OFFICE出来,在下一定跪拜师学艺。就不说office,就说XP操作系统,内核是什么,ntoskrnl.exe一个2MB的文件,好了不用我多说,你也能很清楚掂量内核的地位。内核以外,操作系统要提供友好的界面,丰富的API,安全机制,大量可用的应用程序等等这些才是大头。一个不懂电脑的人,你和他说操作系统,他不会懂。你说对他重要么?不重要。“能用,好用”这才是重要的,你那些后台努力的骄傲就收起来吧。享受一下用户说这个东西好的感觉。
程序员最高境界不会再关心这些,什么语言?什么系统?什么内核?什么驱动?什么应用?那是一种对大局的把握。对一个庞大软件的设计能力。不过没有前一阶段的积累,你也决不可能到达这个阶段。因为假如让你来设计这个庞大系统,你会有很多自己的技术问题还没有解决,你根本不敢乱想。很多人或者公司也做大系统,为企业定制。那也许不是我说的庞大系统。你注意到,你的系统里只涉及若干东西,数据库操作,浏览器等等。我想大概oracle算是这样庞大软件了。当然office,3Dmax,maya,ProE,apache等等应该都算。他们的设计者是真正的高手。
工作经历告诉我,对硬件的控制并不是什么难事,一个驱动程序你能做,往往只是指你能做硬件控制部分,和操作系统的部分也往往是别人都写好的代码,并不是你设计的,如果这部分你也可以设计,那你也是高手,可以小骄傲一下。所以收起骄傲,停止说这个驱动简单,那个驱动简单,我看哪怕是一个完整串口驱动的设计者,也绝对是行业中的高高手。奉劝那些为windows,Linux或者WINCE写驱动程序的程序员,谦虚点,不要一搞就瞧不起做应用程序的。去看看apache之父的言谈,就知道什么才是真正的高手。
1 条评论:
谢谢分享。写得很好!
发表评论