现在位置: 首页 > 笔记 > 心得 > 正文

找不着北–我的操作系统学习之路

2013年06月14日 暂无评论 ⁄ 被围观 (浏览总计: 1,348 次)+

首先申明,小编对操作系统没有搞明白,这里写的都是个人感受,没多少技术含量。那为何还要谈这个话题呢,一来是吐吐苦水,这个玩意太复杂,从来就没搞太明白过,大概也是好多程序员的命门;二来是总结一下,对自己也算是个交代,毕竟接触这个东西也有不少年了,花了不少时间,也买了好几本书,算记录下感悟吧。

大约95、96的时候,还没机会用到win 95, 上机用到DOS的机会都很少,去机房啥命令都不会敲,看高手敲键盘飞快,屏幕滚屏晃眼,真的是羡慕嫉妒恨。有一次和同学(条件好,已经见识过win 95)逛书店,看到一本很厚的DOS书籍,里面对DOS命令讲解的很详细(现在回想大概是《DOS程序员参考手册》),当时就很想买,同学说现在DOS不流行了,要买就买Windows 95的书。没电脑,所以就没买,现在想想,要是当时把《DOS程序员参考手册》看了,肯定比看那些Windows 95的书收获大。

看看《DOS程序员参考手册》的前言写的内容介绍,许多到现在还有参考价值,唉,那时啥也不懂,不知道哪些书值得看。

《DOS程序员参考手册》
本书是介绍MS-DOS编程的技术书籍,是一本多年来的权威性畅销著作。内容非常全面,覆盖了DOS的各个方面。

包括了MS-DOS 6.xx的全部内容,并覆盖了DOS的各个版本(1.0-6.22)。书中包括全部的DOS功能调用及数据结构,包括一些未公开的功能和保留的功能。

介绍了PC编程时所需的BIOS、鼠标、EMS、XMS、DPMI、任务切换等的功能调用。

分专题介绍了DOS编程的各个方面:输入/输出设备;内存、文件、目录、设备管理;TSR及设备驱动程序;DOS出错处理等等。

介绍了如何在汇编语言、BASIC C/C++及Pascal中使用DOS及BIOS的技术。

丰富而实用的大量实例源代码。

本书的读者对象为对PC编程有兴趣的专业技术人员、大专院校学生及计算机爱好者。

DOS程序员参考手册
标题: DOS程序员参考手册 (908 次点击)
文件: DOS程序员参考手册.zip
大小: 497 kB
描述:

再后来就用上Windows 95/98了,对操作系统的认识就是桌面和图标,鼠标代替键盘,方便是方便了,但其实对操作系统的理解更糊涂了。用VC、VB、C++ builder啥的就知道弄些界面,什么网络、线程编程,感觉深不可测,高不可攀,力所不能及,还没开始就放弃了。有一次听一个同学讲,他老师在搞嵌入式系统,用WinCE,不是电脑,但是界面和win 95一样,佩服得不得了,高科技的一塌,唉,没机会学,只好看看电影,打打游戏算了。前一阵子看周立功的微博,他公司现在主要做高端测试仪表,用WinCE,C++语言开发,以前周公可是搞单片机为主啊。

Windows CE
Windows CE是微软公司嵌入式、移动计算平台的基础,它是一个开放的、可升级的32位嵌入式操作系统,是基于掌上型电脑类的电子设备操作系统,它是精简的Windows 95,Windows CE的图形用户界面相当出色。其中CE中的C代表袖珍(Compact)、消费(Consumer)、通信能力(Connectivit)和伴侣(Companion);E代表电子产品(Electronics)。与Windows 95/98、Windows NT不同的是,Windows CE是所有源代码全部由微软自行开发的嵌入式新型操作系统,其操作界面虽来源于Windows 95/98,但Windows CE是基于WIN32 API重新开发、新型的信息设备的平台。

嵌入式实时操作系统μC_OS-2(第2版)

再后来有机会搞单片机开发了,开始用C51开发,纯粹的中断驱动的前后台系统,搞得不亦乐乎,后来就渐渐赶时髦要上操作系统,此时比较流行μC/OS-II,买了《嵌入式实时操作系统μC/OS-II(第2版)》,还有机会听了翻译者邵贝贝的讲座,书看得似懂非懂,总算是能结合代码来理解一些操作系统的概念了。以前大学里的教课书里关于操作系统的章节写的啥一点印象都没有了,这些教科书只能当小说和少儿科普读物看,没一点干货,跟国外的教材一比,那是差得十万八千里。我后来纳闷,为啥国内高校不引进这些国外的经典教材来授课呢,现在想想除了版权问题,估计也没几个老师会教。记得有次上《微机原理》这门课,看书看得云里雾里,啥8086最小系统,PCI总线,天书一般。听老师讲还是不懂,最后课间休息,和老师唠嗑,最后老师说实话了,这个玩意没几个人能讲得清楚,你们能看懂多少是多少,考试不为难你们。

嵌入式实时操作系统μC/OS-II(第2版)
μC/OSII是著名的、源码公开的实时内核,是专为嵌入式应用设计的,可用于各类8位、16位和32位单片机或DSP。从μC/OS算起,该内核已有10余年应用史,在诸多领域得到了广泛应用。

本书是MicroC/OSII The Real Time Kernel一书的第2版本,在第1版本(V2.0)基础上做了重大改进与升级。通过对μC/OSII源代码的分析与描述,讲述了多任务实时的基本概念、竞争与调度算法、任务间同步与通信、存储与定时的管理以及如何处理优先级反转问题;介绍如何将μC/OSII移植到不同CPU上,如何调试移植代码。在所附光盘中,给出已通过FAA安全认证的μC/OSII V2.52的全部源码以及可在PC机上运行的移植范例。

本书可用做高等院校嵌入式实时系统课程教材或工程师培训教材,也可供嵌入式应用开发人员研究与使用。

μC/OS-II最后没用到实际项目中,所以还是没真正搞懂,印象深的是其书中的例子,可在PC机上跑,用的老掉牙的BC 3.1编译器,哪也找不着,曾经想把它移植用VC来编译,有个保存任务上下文的函数要改造,没搞定,后来就放弃了。现在才明白,这个没搞定,其实就是μC/OS-II没真正入门。好比要把μC/OS-II移植到开发板上,不搞懂那几个涉及汇编的核心函数,就不能真正掌握μC/OS-II。

对μC/OS-II的热情消退,是后来参加一个啥讲座,介绍嵌入式Linux的,主讲人很牛叉,介绍了具体产品,看了实物,大概就像现在平板电脑的样子,能上网,当然不是触摸屏。我印象最深的是他说的一句话:“μC/OS-II不能算是真正意义上的操作系统”,他说的理由当时我也无法完全理解,但觉得他说的有道理,因为从没见μC/OS-II能做出类似的产品效果来。从此觉得嵌入式Linux是前沿的操作系统。

Linux内核源代码情景分析

此时,嵌入式Linux很火,但这个玩意实在是太高深了,入门门槛太高,没有高人指点,靠自学是很难搞定的。在书店看那些满书架的嵌入式Linux书籍,什么ARM嵌入式Linux开发详解,Power PC嵌入式Linux开发指南,嵌入式Linux设备驱动程序,这些书都是偏重应用开发,但最开始的操作系统怎么跑起来呢?还是无法搞懂,所以看这些书总是会有外行看热闹的感觉。但是看Linux内核,又不得门而入。记得有次在书店,看到2本大开本(16开)的书《Linux内核源代码情景分析》上下册,毛德操/胡希明,浙江大学出版社。的确是分析到内核源码了,可是当时看不懂,翻翻就放下了,唉,为啥当时不配套出个入门点的书呢,这个对初学者,完全找不着北啊。后来我才知道要看于渊的《Orange’S:一个操作系统的实现》来入门。

再后来,工作中就接触到VxWorks,终于学以致用了,会attach,ts,tr,d,m了。VxWorks的光环早有耳闻,火星探测器上都用了啊(后来火星车出故障据说也是VxWorks的Bug导致,好像是任务优先级翻转,成也萧何,败也萧何),它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中。可惜,好景不长,随着多核处理器的迅速普及,嵌入式Linux由于开源的成本优势,实时性的提高,以及在多核处理器上的性能优势,使得VxWorks市场份额迅速萎缩,现在基本是嵌入式Linux的天下了。

VxWorks
VxWorks 操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。在美国的 F-16、FA-18战斗机、B-2 隐形轰炸机和爱国者导弹上,甚至连1997年4月在火星表面登陆的火星探测器、2008年5月登陆的凤凰号,和2012年8月登陆的好奇号也都使用到了VxWorks上。

随着工作经验的积累,以及阅读水平的提升,排除多本垃圾书的干扰后,看了2本比较好的OS方面的书籍,感觉才有点入门。

一本是:(美)戴特尔(Deitel,H.M.)等著,施平安,江永忠,瞿中译,操作系统(第三版)。

操作系统(第三版)

此书页数:1330,很厚,比较合我胃口。写得比较通俗易懂,比较系统全面的介绍的OS的发展史和关键技术,可读性好。内容包括:操作系统导论,硬件和软件概念,进程和线程,异步并发执行,并发编程,死锁和无限延期,处理器调度,物理内存组织和管理,虚拟内存组织,虚拟内存管理,磁衙性能优化(及RAID),文件和数据库系统,性能及处理器设计,多处理器管理,网络、分布式系统及Web服务,安全性,案例分析:Linux和案例分析:Windows XP。

另一本是:于渊的《Orange S:一个操作系统的实现》。

Orange'S:一个操作系统的实现

此书从只有二十行的引导扇区代码出发,一步一步地向读者呈现一个操作系统框架的完成过程。书中不仅关注代码本身,同时关注完成这些代码的思路和过程。本书不同于其他的理论型书籍,而是提供给读者一个动手实践的路线图。读者可以根据路线图逐步完成各部分的功能,从而避免了一开始就面对整个操作系统数万行代码时的迷茫和挫败感(这个直击我的疼点啊,看了这句话,我就决定此书要买了,呵呵)。书中讲解了大量在开发操作系统中需注意的细节问题,这些细节不仅能使读者更深刻地认识操作系统的核心原理,而且使整个开发过程少走弯路。本书分上下两篇,共11章。其中每一章都以前一章的工作成果为基础,实现一项新的功能。而在章的内部,一项大的功能被分解成许多小的步骤,通过完成每个小的步骤,读者可以不断获得阶段性的成果,从而让整个开发过程变得轻松并且有趣。

通过这本书,我总算是明白点操作系统从实模式切换到保护模式,代码是咋写的了,以前看的书主要讲概念上的,代码层面没有讲得如此好懂的。帖几个推荐:

万春 读《Orange’S 一个操作系统的实现》有感
我经常遇到一些朋友,他们熟悉8086汇编语言,并且喜欢汇编语言.(很多这样的朋友)他们在日常使用汇编语言上,一般是反汇编研究别人的二进制代码进行逆向工程,或者动态跟踪破解软件,脱壳或者外挂反外挂等。这样使用汇编当然没有错,但是这些在日常工作或者爱好中,很多是熟能生巧的,当玩到一定的程度,就会感觉其实技术也差不多就这样,再就是有些机械性重复的感觉,技术上进入了一个平台期。

前不久有朋友就给我说,他要学习win32 API 的汇编编程,来提高自己的汇编修养。我当时就建议他说如果汇编反汇编能玩到比较熟练再去学习win32 API汇编有些不值得,我建议他这时候不如去加深以下我们对处理器及操作系统的了解,毕竟win32 API用汇编来操刀感觉有点费时费力,用VC win32 api能够更容易实现同样的工作,而且理解也比较容易。(顺手.)所以我就建议他去学习以下保护模式相关的东西,这也是现代x86 CPU和操作系统的核心基础架构.因为我觉得学习保护模式可以很好的了解现代CPU与操作系统的核心细节.

我们都知道windows 上有相对于DOS神奇分段分页内存管理,可以管理大于1M的内存,可能我们在学校的时候老师也有讲述,但我估计如果不用很多人都记不得它.不知道如何用它了。像多任务,多线程,内核ring 0, ring 3等东西我想很多朋友都有兴趣,但是觉得这些东西学起来太难,不知道如何入手学习,就算了。其实学习汇编到一个层次后,转向学习这些知识从而了解操作系统的运作方式可能是提高自己的认识和技术的一个好的途径。因为保护模式相关的东西技术相当的连贯与系统化,你如果从GDT 到LDT ,IDT, TSS ,PTE,PDE,PFN,段,门,陷阱,页,等数据结构及处理器结构走一遭。你会发现,他们实际上就是现代操作系统的砖、瓦、地基。其实不管是windows 还是linux 这样差距巨大的操作系统,在这部分他们都有很多的共同相似的特性。

在windows 的ntldr和ntoskrl.exe内核中,都免不了有这些处理的,以此为基础架构出来的NT内核VMM,FS,内核调度,异常,中断处理,对象管理器等,然后又在这些系统内核的基础上架构成一个成熟的操作系统,当然我们不可能搞windows这样复杂的东西,但是我们可以通过学习保护模式了解其基本原理,这样即使针对windows 中某一个方面的东西研究的时候,也可能让我们认识得比较深刻一点,这就够了。

每当我们说起操作系统,第一个印象就是复杂,博大精深,细节难于掌握.事实也如此,现代操作系统是如此的复杂,很多有意思的东西都被广漠的细节所弥漫,让我们要学习它的难度越来越高,经常是费时间费力,效果不大或者是浅尝即止,这方面长久以来没有一本好的书籍系统介绍.有些汇编类书籍介绍的保护模式都是比较枯燥让人容易瞌睡的内容,也不容易上手学习。

最近我发现一本操作系统实现的书《Orange’S:一个操作系统的实现 》,内容将前面所说的难点解决的蛮好的,作者用实践的引导方式,从NASM,GCC开发工具,虚拟机使用等开始,用最简单只有几十行的汇编代码的方式引导读者进入保护模式的学习,其中充满了探索的好奇.作者每前进一步都加入一些新的代码进原来的代码中,跟作者一起从实模式jmp到保护模式,然后又是call/iret多任务分时切换,这些相关东西都可显示在显示器上给你最直观印象。到最后竟然基本实现了一个带基本进程调度,FS,VMM试验性操作系统,真是相当的神奇,我建议有学习兴趣的朋友,最好先看看作者的书,然后一行一行的敲入代码,即使敲的时候不理解,也没有多大关系,建议一定要自己敲,切忌拷贝图快。

在作者的带领下接触一个可能在其他地方无法体验的技术冲浪。经过这样的一个历程后,读者汇编语言的功底及炒作系统原理绝对将有一个质的提高,多年后即使其中的某些细节忘记了,但其中的方法和思路必定将长留在你的记忆中,并对你的开发编程产生相当积极的影响。

我推荐大家阅读《Orange’S:一个操作系统的实现 》!

蒋涛:《Orange’S:一个操作系统的实现》属于真正Hacker的
2004 年我听编辑说有个年轻人写了本《自己动手写操作系统》,第一反应是不可能,恐怕是翻译稿,写这种书籍是要考作者硬功夫的,不但需要深入掌握操作系统的原理,还需要实际动手写出原型。

历史上的Linux 就是这么产生的,Linus Torvalds 当时是一名赫尔辛基大学计算机科学系的二年级学生,经常要用自己的电脑去访问大学主机上的新闻组和邮件,为了方便读写和下载文件,他自己编写了磁盘驱动程序和文件系统,这成为了Linux 第一个内核的雏形。

我想中国有能力写出内核原型的程序员应该也有,但把这个题目写成一本书,感觉上不会有人愿意做这件事情,作者要花很多时间,加上主题比较硬,销售量不会太高,经济上回报有限。

但拿来文稿一看,整个编辑部大为惊艳,内容文笔俱佳,而且绝对原创,马上决定在《程序员》连载。2005 年博文视点出版的第一版也广受好评。不过有很多读者还是质疑:现在软件编程主要领域是框架和应用,还需要了解操作系统底层吗?

经过四年的磨练成长,于渊又拿出第二版的书稿《Orange’S:一个操作系统的实现》,这本书是属于真正Hacker 的。我虽然已经有多年不写代码了,但看这本书的时候,让我又重新感受到做程序员的乐趣:用代码建设属于自己的系统,让电脑听从自己的指令,对系统的每个部分都了如指掌。

黑客(hacker)实际是褒义词,维基百科的解释是喜欢用智力通过创造性方法来挑战脑力极限的人,特别是他们所感兴趣的领域,例如软件编程或电气工程。个人电脑、软件和互联网等划时代的产品都是黑客创造出来的,如苹果的Apple 电脑、微软的Basic 解释器、互联网的Mosaic 浏览器。

回答前面读者的质疑,学软件编程并不需要看这本书,想成为优秀程序员和黑客的朋友,我强烈建议你花时间来阅读这本书,并亲自动手实践。正如于渊在本书结尾中所说“我们写自己的操作系统是出于一种好奇,或者说一种求知欲。我希望这样不停地‘过把瘾’能让这种好奇不停地延续”。好奇心是动力的源泉,追究问题的本质是优秀黑客的必备素质,只有充分 掌握了系统原理,才能在技术上游刃有余,才能有真正的创新和发展。中国需要更多真正的黑客,也希望更多的程序员能享受属于黑客的创造乐趣。

蒋涛
2009 年4 月

博文视点,解密《一个操作系统的实现》这本书

5 月 18 日见到了《 Orange’S :一个操作系统的实现》的样书,多少有些激动。想一想前一版本《自己动手写操作系统》是那么畅销,这一本一定不能含糊。整个出版过程我能看到作者于渊为此付出的努力,还在自己排版的过程有深入体会,通过于渊的讲座也让博文视点的员工分享到他在排版过程中的很多心得。

应该有几万个朋友读过《自己动手写操作系统》了,本书的第 2 版《 Orange’S :一个操作系统的实现》出来肯定有非常多的朋友想问,这两本书到底有何区别呢?就此博文视点对本书作者于渊进行了简单的采访。

提问:《 Orange’S :一个操作系统的实现》与《自己动手写操作系统》明显区别在哪些方面?

于渊:作为《自己动手写操作系统》(以下简称《自》)的第二版,《 Orange’S :一个操作系统的实现》(以下简称“新版”)主要有以下变化:

1. 书中示例操作系统的名字改为 Orange’S

2. 书名改为《 Orange’S :一个操作系统的实现》

3. 增加了有关 IPC 、 FS 、 MM 等内容

4. 将默认开发平台改为 GNU/Linux ,同时兼顾 Windows

5. 更改了排版工具,并使用技术手段增加书的可读性,比如代码行号的运用

6. 建立专门网站以服务读者

7. 建立专门讨论区供读者交流

读过《自己动手写操作系统》的读者一定知道,其中默认使用 Windows 作为开发平台,同时使用虚拟机来编译及运行自己的 OS ,在新版中这一点发生了变化(如上述第 4 条所述),具体的变化原因在书中第二章有详细的叙述。虽然开发平台是第二位的事情,但书中的默认平台却不免影响到叙述细节,所以,如果读者基于自己的原因坚持在 Windows

上开发(可能的原因或许有对 Linux 不熟悉、需要边开发操作系统边登录某些网上银行等等),则可能对读到的内容进行一点点额外加工。当然,所需的额外加工是少量的,而且在第二章中也有专门的文字介绍如何在两种平台下搭建工作环境。此外,如果读者不介意花钱,还可以同时购买《自己动手写操作系统》和新版,相互参照阅读。

提问:《 Orange’S :一个操作系统的实现》与《自己动手写操作系统》相比是否有所增加吗?增加了多少内容量呢?

于渊:新版的内容是有增加的,新增文字约占整本书的三分之一,《 Orange’S :一个操作系统的实现》新增代码则是《自己动手写操作系统》中代码的数倍。这些新增的内容,读者只能从新版中获得。目前并未有将新增内容单独成书的打算,所以读者即便仅想阅读第八章以后的内容,也需要购买整本《 Orange’S :一个操作系统的实现》。已经购买了《自己动手写操作系统》的读者可能觉得有点浪费,但事实并不如此,因为《自己动手写操作系统》的内容经过了重新排版、修订和编辑(比如代码格式进行了重排,更方便与光盘中的文件对照阅读,以及其中所有的矢量图都用 pgf/TikZ

重新绘制等)笔者倾注的心血使得新版的感官已经大为不同,读者一看便知。

提问:在《自己动手写操作系统》大卖的时候,您是否想过会有第二版出版呢? *

于渊:坦白讲,我在写作《自》的时候,并没有想过今天会有一个第二版。原因在于,我希望这本书是用来填补空白的,而不是重复去做别人已经做得很好的事情。所谓填补空白,具体说就是让像我一样的操作系统爱好者在读完本书之后,能够有信心去读其他比较流行的开源的操作系统代码,有能力从零开始自己动手写操作系统,而这个任务第一版已经完成了。

提问:那么为什么又写作了第二版呢? *

于渊:原因有几个方面。第一,虽然第一版未曾涉及的进程间通信、文件系统等内容在许多书中都有讲解,但阅读的时候还是感觉有语焉不详的通病,作者本人可能很清楚原委,但写得太简略,以至于读者看来未必清晰。第二,我自己想把这个圈画圆。第一版的书虽然完成了它的使命,但毕竟到书的结尾,读者看到的不是一个真正的操作系统,它没有文件系统,没有内存管理,什么也干不了。在第二版中,你将会看到,你已经可以通过交叉编译的方式为我们的实验性 OS 编写应用程序了,也就是说,它已经具备操作系统的基本功能,虽然仍然极其简陋,但第一个圈,毕竟是已经圆起来了。第三,实践类的操作系统书籍还是太少了,以至于你要想看看别人是怎么做的,除了读以《操作系统:设计与实现》为代表的极少数书籍之外,就是一头扎进源代码中,而结果有时相当令人气馁。我自己也气馁过,所以我在第二版中,仍然试图把话说细一点,把自己的经验拿出来分享。而且我选择我能想到的最精简的设计,以便让读者不至于陷入太多细节而无法看到全貌。我想这是本书可能具有的价值所在──简化的易懂的设计,还有尽量详细的文字。

提问:这本书为何不考虑用 WORD 排版? *

于渊:新版的排版是我用 LaTeX 自己完成的。在排版中我花了一些工夫,因为我希望读者购买的首先是一本易于阅读且赏心悦目的书,其次才是编写操作系统的方法。另外,书中列出的代码均由我自己编写的程序自动嵌入 LaTeX 源文件,从而严格保证书和光盘的一致性,读者可以根据文件名和行号方便地找到光盘中代码的准确位置。

提问:第二版还有哪些区别呢? Orange’S 这个名字很特别,有什么寓意吗? *

于渊:新版中还有一些小的变化。首先是操作系统的名字改变了,原因在于虽然我们的试验性 OS 从前辈们那里借鉴了很多东西,但其各个部分的设计(比如文件系统和内存管理)往往有其独特之处,所以我将原先的 Tinix (本意为 TryMinix )改成了新名字 Orange’S (这个名字来自于我的妻子),以表示它们的不同。另外,书中的代码风格,有些地方也做了调整。

新版中,原先的叙述风格都尽量地得以贯彻,而在表现形式上,新版用了更多心思,我相信读者能在其中发现这些特点:关注动手细节,探寻代码背后的故事,结果与过程兼顾,内容与形式并重。加上专门为本书建立的网站和讨论区,我相信读者能更容易地阅读,更轻松地学习。

更多详情请登录 http://osfromscratch.org/ 。

《深入理解Linux内核,第三版》还有一本书也比较流行,《深入理解Linux内核,第三版》(Understanding the Linux Kernel), 作者: (美)博韦,西斯特,译者: 陈莉君 张琼声 张宏伟。如果先看《 Orange’S :一个操作系统的实现》再看这本书,估计收获大一点,要不然很难真正看明白。

网上有人如此评价此书:

“这本书太经典了,言语精炼废话不多,信息量大,细节较多。 但不适合做为学习linux内核的第一本书,最好是手头还有一本介绍内核原理的概括一点的书,先看原理,再对照看这本。一章一章对照看。不要希望第一遍就完全看懂并记住,个人觉得最好的方法是首先粗略过一遍(前9章,到进程地址空间),然后再细点看一遍,然后更细点。。。也就是说要一遍一遍的看。

这本书还需要点汇编,内嵌汇编的知识。 碰到读不下去不是很懂的地方,努力一番,但不要跟它死磕,有可能是翻译不是很到位,或是作者没有从最基本的开始讲起。要么先放过,回头再来啃它;要么勤动手,上网查一查,说不定有意外收获。  linux内核对普通学习者而言不亚于90度的悬崖,无路可循,这本书虽然没有让它变成一马坦途,但至少变成一个30度的斜坡,付出努力我们也能慢慢登堂入室。”

《深入理解Linux内核,第三版》内容简介
为了彻底理解是什么使得Linux能正常运行以及其为何能在各种不同的系统中运行良好,你需要深入研究内核最本质的部分。内核处理CPU与外界间的所有交互,并且决定哪些程序将以什么顺序共享处理器时间。它如此有效地管理有限的内存,以至成百上千的进程能高效地共享系统。它熟练地统筹数据传输,这样CPU 不用为等待速度相对较慢的硬盘而消耗比正常耗时更长的时间。

《深入理解Linux内核,第三版》指导你对内核中使用的最重要的数据结构、算法和程序设计诀窍进行一次遍历。通过对表面特性的探究,作者给那些想知道自己机器工作原理的人提供了颇有价值的见解。书中讨论了Intel特有的重要性质。相关的代码片段被逐行剖析。然而,本书涵盖的不仅仅是代码的功能,它解释了Linux以自己的方式工作的理论基础。

本书新版涵盖2.6版本,其在内核的几乎每个子系统中都有重要的变化,尤其是在内存管理和块设备领域。本书侧重于以下主题:

●内存管理,包括文件缓存、进程交换和直接内存存取(DMA)

●虚拟文件系统层和第二、第三扩展文件系统

●进程创建和调度

●信号、中断和设备驱动程序的主要接口

●定时

●内核中的同步

●进程间通信(IPC)

●程序的执行

《深入理解Linux内核》将使你了解Linux的所有内部工作,它不仅仅是一个理论上的练习。你将学习到哪些情况下Linux性能最佳,并且你将看到,在大量的不同环境里进行进程调度、文件存取和内存管理时它如何满足提供良好的系统响应的需要。这本书将帮助你充分利用Linux系统。

还有就是这些书的参考资料,可以按图索骥去阅读,一般都是很有价值的。还有就是这些书的作者在书中常常会提及一些他认为很经典的书籍,这个也有许多,这里就不一一列出了。

这个世界太复杂了,有时候貌似知道得很多,实际中却不会使用。就像我们的大学教育一样,教了很多基础知识,但到实际工作中时常感觉用不上。操作系统的学习一样,就算对这些OS的实现细节有所理解了,但实际产品中如何使用直接打交道的往往不是这些,这令人感觉非常沮丧,因为学的东西如果老是用不上,为什么还是要去学呢。这个是个几乎说不清的话题,所以这里无法进一步讨论,只能对自己说总有一天,学的东西会派上用场,坚信这个就行了,至少比时间白白浪费强。发这么多感概,是因为有好多人都碰到这样的问题,下面也可看到一个HW的兄弟发的关于DOPRA的牢骚。

学习C++,光看语法书似乎困难还可克服,但用VC++开发实际项目就不是那么容易了;学习Java,最后还是得用MVC框架,自己开发一个,疯了;学习PHP,还是逃不开框架;学习JavaScript,最后发觉还得用JQuery…学习OS,同样如此,最后发觉用的是一个底层OS的包装。在通信设备商华为和中兴通讯的设备中,主要用的是VxWorks和Linux操作系统,但业务软件开发人员写代码却发现,看不到一点原来学的操作系统的东西,接触到的只是DOPRA(华为)和TULIP(中兴通讯),这个东西是啥,看看以前网上有HW的兄弟发的关于DOPRA的牢骚(摘自网易科技论坛),这个需要大家正面解读,HW现在发展得不错,是中国科技企业的骄傲。

H3C员工揭秘华为:其实技术很烂
原贴:

华三当初是华为的人和技术,加上3COM的资金,这么合作的,可以说华三的技术、流程和华为的一样,我评论华为的技术应该还有点说服力。

首先声明我是做软件的,不清楚华为的硬件实力怎么样,华为成立了一家芯片公司,叫海思,好像可以做ASIC,但肯定做不了CPU,也就是说不算第一流的技术。

H3C的COMWARE就是从华为的VRP平台发展来的,最初源自开源的BSD,华为最大的失误(或者说没有这个能力)是没有自己的操作系统,反而弄了一个VOS(操作系统适配层),后来叫DOPRA,就像CPU是硬件上的核心一样,操作系统是软件的核心,如果当初发展LINUX当自己的操作系统,现在软件水平肯定会高很多。

其实说华为软件烂也不是埋汰它,应该说国内的软件水平普遍烂,怎么说华为还有自己的技术,从软到硬都能搞,不像联想丫的一个卖机壳子的。我更想抨击的不是华为的技术烂,而是烂的原因,这个原因就是它的企业文化,什么烧不死的鸟是凤凰,烧死的是北京烤鸭,十年坐得板凳冷,一堆的废话,当初我们这批H3C员工入职也是在华为百草园培训的。这种企业文化适合于制造业,不适合于软件行业,华为的软件靠什么,靠的是人多和加班,拼的是体力而不是技术,华为现在5万多号人,做研发的不一定比思科人少,为什么还是不如思科,技术和效率不行。很多人不明白这一点,包括管理层也这么认为:“做软件靠的是人力”,其实他们不懂,核心的开发需要的不是人力,而是技术,有了核心技术才能在外围堆人力。

论坛上有些人说,华为的人3年后收入30万,我感到怀疑,H3C有到华为北研面试的,月薪1.2万,年终奖大概还没H3C高,现在哪还有股票了,最后平均每月大概1.5万(税前)吧,在民企中还是不错的,但怎么可能会比思科、微软高呢,而且工作压力大就不用说了。就像有些人说的,在华为干久了人就夜郎自大,数通这个行业太封闭了,开发就是C语言,不是说C语言不好,操作系统内核都是C写的,但问题是有几个员工真的懂内核,各组分工特别细,每个人就懂自己负责的那几个模块几个协议,公司内的信息安全特别严,各组之间看不到代码,说什么第一年学习,2、3年后就成高手了,纯属是放屁,一般头半年收获会很大,1年后就没太多学的了,想提高要靠自己的自学,而最可恨的一点是工作压力大,加班回家后基本也就睡觉了,没太多业余时间给你自学,据我所知H3C跳槽也就是去那几个地方,华为、华赛、中兴(好像没人爱去),汤姆逊、诺西这几个地方,大部分人只能做协议,少数的水平高的能做LINUX驱动,我这么说大家别误解我说H3C和华为员工水平不够,将来我肯定也是要跳槽的,应该这么说,员工如果有1分的技术,那么他就有10分的自学能力和100分的毅力,在这种环境中能成长起来的高手,比微软、GOOGLE里的高手要艰难百倍!

随便聊聊,发一点牢骚,不了解情况的不要骂人。

回复:

你提到的这个问题。我已经明白了。发展过程中。特别是初期。确实是这样。也是中国软件业普遍的问题。希望不止是华为意识到这个问题。任何一个中国软件企业都要意识到这个问题。要意识到核心技术的研发。再就是结做技术人员更多的学习的机会。

各个模块和系统代码全被你拿到,你丫的还不拿去卖给中兴还钱了?

我想楼主是刚来华为不久的吧??? 华为的核心技术是分级别的,你刚来就想共享公司的核心可能不太现实哦,而且公司对新人的培养采取的是主动学习,而非被动接受,明白吗???千万不要因为你觉得在华为短时间内没有学到东西而自暴自弃,那就是你心态的问题了。多给自已一点时间吧,企业机制你是没办法改变的,但是华为绝对会给你一个QS建义的权力。

华为最擅长的是硬件和嵌入式软件。而不是通用软件及DRIVE这一类东西。因为华为的软件基本都是服务于他的硬件的。就算是BOSS等系统也是专用软件。所以,楼主不要认为华为的软件水平就差了。毕竟华为的主业是通信,而不是企业网。不然,也不会把H3C卖了换钱了。

好像大公司都是这德行,分工太细了,只能负责自己的东西,其他的东西什么都不知道。。。。。。唉!

分工细你们还加班成这样呢 让你一个人负责一个项目 你还不直接跳楼去!这叫专业化模块分工 懂不懂啊!只能说是 中国的软件人才太烂 几乎没有 全是培训速成出来的 不具备自主研发的能力 创造力更近于0 天天在那较尽脑汁 结果毫无效率可言 还加班 加一辈子你也没戏啊!人家国外 鄙视加班 在咱这 怎么都是 加班最光荣了呢!可悲 可怜 可叹啊!

确实是这样的,我看过VOS的代码,但没全部看明白,但话说回来,给点时间傻子也能看懂,不给时间叫C语言的作者也不知道再写什么。华为累确实是累一点,而且也确实是信息安全特别封闭,可想而知,它当年做出来的东西里面的技术是怎么来的,呵呵。但也有它的优点,华为有些团队还是满好,满团结的,中国人差的之一就是团结。

还有一个军事论坛谈游戏服务器,最后扯到DOPRA的(摘自超级大本营军事论坛),也很好玩,玩笑之中总能见到一些事实真相,呵呵

VRP和DOPRA的源代码你看过?
暗夜流星:

如果你知道我以前是鼓捣啥的,和我现在在鼓捣啥,你就不会这么狂妄了。VRP和DOPRA的源代码你看过?一个破游戏服务器也敢叫复杂,那3G系统岂不就是天顶星技术了。狂妄是因为你自己知道得少,如此而已。

超大123:

我说老兄你原来是干这个起家啊。你能不能不要在自我陶醉,别在给华为丢脸了。DOPRA这个烂东东就是一个中间件系统,是华为的印度研究所开发并在全司推广使用,为了降低开发难度,提高开发效率,屏蔽个操作系统的差异而诞生。结果是bug无数,效率低下。从纯技术角度来说,是一个失败的战略举动。是因为当年华为无力研发自己的专用操作系统的一种权衡的策略。DOPRA这个烂东西在无线,固定网等等部门推广的时候,以至于每个开发小组都要配备一名DOPRA的技术支持人员,你就是干这个的吧。多少次因为这个烂东东而引起的问题延误应用系统的开发,到最后都是不得不邮件印度所来解决。这个低效的中间件平台不知捆绑了华为多少产品线。看看硬件和中试的兄弟们用着Psos,Vxworks,构建可裁剪的嵌入linux的时候,多少纯粹的技术开发人员在哀叹。在这个烂平台上干的越久,就越无法脱身,最后不得不耗死在DOPRA这个烂动中间件平台上。你老兄别拿DOPRA源码来显摆了,DOPRA是华为在没有能力开发自己的操作系统的一种无奈的失败的战略转向。对企业来说,是个应急之作,对个人而言,尤其对一线开发人员而言,是个噩梦,除了业务就是DOPRA了。受不了这个破烂玩意,不愿意浪费自己的技术生命只能远离DOPRA,远离HW,您老大还是别在吹通晓bug满天飞DOPRA源代码了,别在给华为丢人了。:( :( :(

暗夜流星:

你的资历还浅吧,关于D的说法,你肯定是偏颇的。既然很烂,为什么还要用呢?是,你比公司高明?

作为底层的技术人员,怨恨DOPRA是必然的,因为屏蔽了底层细节,让他们的价值越来越小了。DOPRA也并非是来源于印度所,其体系结构和大量的代码来自于以前系统的裁减。并非是全新开发。

我也并非是搞这个的,研究过底层代码而已。

如果说HW没有研制过操作系统,或者没有能力研制操作系统的话。那就很可笑了。B型机的操作系统是谁开发的阿?你知道DOPRA从中吸取了多少?我担保你不知道。

超大123:

我不在HW了,那受了DOPRA这个东东。要在DOPRA上搞技术,还不如转行呢。回到话题上,我以为提到的电信系统,可以硬件加速,扩展内存,改善硬件系统架构,实现更高的带宽吞吐,这些都不是问题,问题是这你不是还得在电信系统跑专用的操作系统。就算裁剪到只有非常精简高效的内核,只提供需要的必须的TCP/IP服务。可是你如何在这个系统上支持超过100万乃至1000万的并发连接任务,如果如同楼主所言搞单一的服务器的话,那不是必须实现的吗?也许可以通过几百块CPU构建多任务并发的超级服务器,可是你这设计硬件,从新设计专用OS,还得还了个破网游做优化,这个费用起码也得千万级别了吧,还得考虑他的研发经费,那的多少啊。所以,这一切都是理论上存在,而实际上根本不可能有人会为了网游而专门实现的吧。

暗夜流星:

我从网上不止看到过一次技术人员对于DOPRA或者IPOS的抱怨,在这个系统下,程序员就写写标C的业务代码就好了,在这种情况下,如果在HW混久了,人就废了。但是这不关这个平台什么事情。

超大123:

是不关平台的事情,只是关系到个人的发展前途而已。路是个人选择的嘛。

关于DOPRA的细节,HW的信息安全实施得很好,外人很难知道。但有一篇硕士论文,居然写了一些,真奇怪。有兴趣的可以看看这篇论文。

DOPRA的OSAL中Linux相关模块的设计与实现
【题目】DOPRA的OSAL中Linux相关模块的设计与实现

【作者】焉德广

【摘要】:在嵌入式软件开发中,操作系统起了越来越来重要的作用,现在商用的操作系统很多,如VxWorks,QNX,WinCE等。但是这些商用操作系统都价格不菲,这就增加了嵌入式产品的成本。Linux作为开源软件,可以免费获得,而且它具有功能很强大、广泛的平台支持的特点,在嵌入式开发中具有广阔的前景。 本文《DOPRA的OSAL中Linux相关模块的设计与实现》是项目《将IAD132从VxWorks移植到Linux》的一部分,这个项目是为了研究Linux作为嵌入式操作系统的可行性。IAD132一种窄带盒式接入设备,DOPRA(Distributed Objected Programming Real-time Architecture,分布式面向对象可编程实时架构)是IAD132使用的软件平台,它是一个操作系统性质、中间件级别的软件平台,它屏蔽了操作系统的差异,向上提供了统一的接口。OSAL(Operating System Adapter Level,操作系统适配层)是DOPRA中与操作系统直接相关的一部分,目的是实现与操作系统相关的各种模块并封装起来,为上层模块提供统一的接口。 本文主要涉及OSAL中Linux相关模块的设计与实现,通过封装Linux提供的API(Application Programming Interface,应用编程接口)实现信号量模块、读写锁模块、IO管理模块、系统时间管理模块、任务管理模块、内存管理模块,并针对用户态和内核态分别实现。文中详细描述了嵌入式Linux环境的搭建,包括:库函数的选用、交叉编译器的制作、内核的裁减和修改、文件系统的选择等。 通过对IAD132的移植研究,可以发现:Linux内核态的性能和VxWorks相当;Linux用户态的性能会有大幅度下降,主要受进程间切换和系统调用的影响,但是如果将丰要业务放在同一个进程,并且通过内核态和用户态共享内存的方法回避系统调用,就可以在用户态实现接近内核态的性能。只要使用合适的产品模型,IAD132使用Linux作为嵌入式操作系统时的性能与使用VxWorks时不相上下。可以说,Linux作为嵌入式操作系统是完全可行的。

【关键词】:DOPRA OSAL 内核态 用户态 交叉编译器

【学位授予单位】:大连海事大学

【学位级别】:硕士

【学位授予年份】:2006

【分类号】:TP31.52

VRP体系结构

关于VRP(体系结构可参考右边的图,摘自网上传播HW的资料《通用路由平台VRP介绍》,有点老,但基本框架估计差不多,底层应该就是DOPRA),最新的VRP 8可参考下面的软文(摘自C114(中国通信网):三大网络操作系统对比:华为VRP超过思科IOS),主要内容是:华为的VRP操作系统,从1998年的VRP1.0(集中式)开始,经历了VRP3.0(分布式),VRP5.0(分布式),一直到今天的VRP8.0(多框,多核,多进程),成为当前第3代IP设备操作系统的典型代表。它在高性能、虚拟化、特性丰富度、电信级可靠性等方面都进行了深度的考虑和设计。首先,VRP8作为多业务分布式系统, 充分利用并行计算和多核CPU的性能优势,将单个和多个协议/业务部署到多个CPU或者多个核上进行分布式并行处理,最大限度提升了性能。其次,它是独立进程,进程A不影响进程B,组件设计,内存空间隔离,提高了可靠性。VRPV8提供全生命周期的无缝恢复技术,即NSA,确保切换过程中,所有业务保持不中断。第三,基于数据库的配置机制.可以支持配置回滚,预提交,配置验证等,并且支持Netconf。VRP平台也成为华为Cloud Fabric 弹性,易用和开放性的重要支撑。

三大网络操作系统对比:华为VRP超过思科IOS
我想网络操作系统很少被受到关注,是因为一提起网络设备制造商,大家的印象就是类似PC这样的硬件设备制造商。对于SOHO级网络设备制造商,这种看法也许没错。但对真正的企业级/运营商级高端网络设备制造商而言,这样简单的概括显然是不准确的。

和iPhone的iOS,PC的windows一样,网络操作系统就是网络设备的“大脑”,它直接关乎用户的使用体验。一台网络设备能实现哪些特性,很大程度都取决于网络操作系统的创新,网络操作系统成为IP设备厂商的核心竞争力所在。因此,我们看到在高端网络设备制造商研发团队里面软件开发人员的比例是非常高的。

在网络应用的直接推动下,网络操作系统自诞生以来就时刻不停的在完善与发展中,尤其互联网的变化与变革更是其发展的催化剂。纵览其二十多年的发展历程,已经发生了三次大的革新。

第一代IP设备操作系统,是为早期的IP设备设计。由于当时受硬件条件限制,此类操作系统的典型特征是基于单进程的系统,提供比较有限的系统可靠性。第二代IP设备操作系统随着业务发展需求和实时业务要求,采用了多进程、有限的分布式架构,实现了更好的可靠性。第三代操作系统采用了多进程、分布式和虚拟化以及系统开放性的架构。它顺应了CPU的发展趋势,即从单核到多核的发展方向。采用了完全的模块化结构,各模块运行空间隔离,单个模块的异常不会影响系统其他部分,提高了系统的可靠性。并提供了在无需其它设备协助的情况下,做到不间断服务的能力。

以华为的VRP操作系统为例,从1998年的VRP1.0(集中式)开始,经历了VRP3.0(分布式),VRP5.0(分布式),一直到今天的VRP8.0(多框,多核,多进程),成为当前第3代IP设备操作系统的典型代表。它在高性能、虚拟化、特性丰富度、电信级可靠性等方面都进行了深度的考虑和设计。首先,VRP8作为多业务分布式系统, 充分利用并行计算和多核CPU的性能优势,将单个和多个协议/业务部署到多个CPU或者多个核上进行分布式并行处理,最大限度提升了性能。其次,它是独立进程,进程A不影响进程B,组件设计,内存空间隔离,提高了可靠性。VRPV8提供全生命周期的无缝恢复技术,即NSA,确保切换过程中,所有业务保持不中断。第三,基于数据库的配置机制.可以支持配置回滚,预提交,配置验证等,并且支持Netconf。VRP平台也成为华为Cloud Fabric 弹性,易用和开放性的重要支撑。

对于操作系统的版本发行,各厂商主要采用了两种不同的方式:单一版本和多版本方式。单一版本是指针对不同的网络设备采用单一的网络操作系统,多版本是指针对不同的网络设备发布多个不同的网络操作系统。对用户而言,单一的网络操作系统在使用上更加方便:一方面多个发布版本使得使用的复杂度增加,网络工程师们必须学习多种不同的操作系统的使用;另一方面,单一的版本由于功能的一致,还可以简化网络运营与管理。

正因为单一版本的优势,华为的VRP在版本发展过程中,注重网上运行版本的一致性,它为多种硬件平台提供一致的网络界面、用户界面和管理界面。Juniper的JUNOS也是尽力按照单一版本方式发行,虽然版本间或多或少还是存在一些差异。而CISCO有IOS、IOS XE、IOS XR、NX-OS等多个发行版本,虽然也会在不同版本的界面风格上尽量保持一致,多少减少一些用户使用上的困难,但其功能实质性的差异,仅仅依靠形式上的相似,无法做到使用上的一致,还是会对用户的使用造成影响。

正是因为CISCO的IOS背负了太多的历史负担,涉及到厂商的并购行为时,让原属于多个厂家的产品纳入Cisco IOS的旗下,每个版本都需要考虑兼容性,打了太多的补丁,造成系统中垃圾代码极多,成为网络运行中的隐患。

新一代操作系统在性能,扩展性,可靠性,虚拟化及维运管理等多纬度展示出巨大进步与优势。

还有一篇软文,可供参考:ZDNET至顶网网络频道:厚积薄发 新一代网络操作系统VRP V8

作为排名第5的通信厂商,中兴通讯自然也有类似的东东,叫TULIP和RosNG,但ZTE比较保守,不会宣传,网上都搜不到软文。但估计今后会有的,一贯的跟随战略。

最后,推荐一篇文章《从X86指令RET和CALL的意义看进程的自由切换》,这篇文章描述了结合SAVE_CONTEXT和LOAD_CONTEXT的C嵌入汇编代码来解释自由的进程间切换的过程,可以参照这个来实现自己的进程(在底层操作系统调度任务/线程之上构建自己的调度进程,实际这也是DOPRA的基础,毕竟华为并没有实现自己的底层操作系统)切换程序,主要涉及2个宏,SAVE_CONTEXT和LOAD_CONTEXT。

#define SAVE_CONTEXT(Stack)                             /
{                                                        /
  __asm push eax    /*****************************/     /
  __asm push ebx    /*                             */     /
  __asm push ecx    /*                             */     /
  __asm push edx    /*        保存通用寄存器          */     /
  __asm push esi    /*                             */     /
  __asm push edi    /*                             */     /
  __asm push ebp    /*****************************/     /
  __asm lea  eax, SUFFIX_ADDR                            /
  __asm push eax              /*保存返回地址    */        /
  __asm mov  Stack, esp       /*保存进程栈*/            /
}

#define LOAD_CONTEXT(Stack)                             /
{                                                        /
    __asm mov  esp, Stack                               /
    __asm ret                                           /
    __asm SUFFIX_ADDR:                                  /
    __asm pop  ebp    /*****************************/        /
    __asm pop  edi    /*                             */        /
    __asm pop  esi    /*                             */        /
    __asm pop  edx    /*        恢复通用寄存器         */     /
    __asm pop  ecx    /*                             */        /
    __asm pop  ebx    /*                             */        /
    __asm pop  eax    /*****************************/        /
}

64位的X86的进程切换可参照这篇文章:《64位x86体系Linux内核进程切换》

全文完。

  打分:5.0/5 (共3人投票)

给我留言