首页>参考读物>计算机科学与技术>软件与程序设计

虚拟机的设计与实现:C/C++
作者 : (美)Bill Blunden
译者 : 杨涛 杨晓云 高文雅 张玉亭
出版日期 : 2003-01-01
ISBN : 7-111-11111-7
定价 : 76.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 676
开本 : 16开
原书名 : Virtual Machine Design and Implementation in C/C++
原出版社:
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书的作者曾经是一位物理学家,所以在计算机领域有着坚实、严谨的理论基础,他从自己的实践出发,采用了数学中的SOP方法(命题-证明-示例),深入浅出地论述了本书的三大部分:概述、HEC虚拟机、HEC汇编语言,对虚拟机的设计目标、HEC虚拟机、HEC汇编器、HEC调试器、HEC中断、HEC汇编语言的使用方法依次进行了描述,对HEC虚拟机在Windows和UNIX上的实现进行了比较。
本书是第一本对虚拟机及其全套开发工具做出完整细致介绍的工具书。它能帮助系统工程师摆脱对计算机硬件制造商的依赖,也适用于学习计算机工作原理的学生,是虚拟机方面不可多得的一本好书。

图书特色

自从在1983年第一次接触到DOS的调试工具开始,Bill Blunden就一直沉迷于系统软件之中。他不满足于仅仅知道事物的表面现象,而是一门心思地去探求它们的本质。凭着初生牛犊的勇气,他开始尝试编写8259中断控制器程序,结果是把他自己的电脑弄得一团糟。直到获得计算物理(mathematical physics)学士学位和操作研究(operation research)硕士学位之后,Bill的才华才逐渐显露出来。在美丽的Cleveland市的一家保险公司里担任保险统计师期间,Bill平生第一次与一台工作异常的IBM大型机进行了面对面的“搏斗”—那台机器里有一个COBOL程序编写得不正确。虽然“战斗”十分“惨烈”,但Bill最终胜利了,而他的兴趣也由此从钻研数字转移到了软件研发方面。随着时间的推移,Bill逐渐成为美国中西部地区一位知名的ERP专家—他用Java语言开发了一个CASE工具,进行了大量的技术研究,并与Control Data Corporation(控制数据公司,CDC)的许多专家进行了切磋。Bill有权随意支配一台配备有4块处理器和2GB RAM的机器,这使他能够在自己的象牙塔里开展各种研究。因为拥有如此之多的内存,所以曾经有一个时期,Bill习惯于关掉操作系统的内存分页(paging)功能,让程序直接运行在SDRAM上。但他小侄子的出生使Bill不得不从中西部迁居到西部的硅谷。Bill现居住在经常发生停电和地震的硅谷地区,并逐渐从自己与COBOL当初的“战斗”中恢复过来。

图书前言

原来作为物理学家的时候,我痛苦地发现:几乎一切现有领域—如粒子物理方面—的突破性研究和实验都离不开联邦预算的支持,没有大笔的预算,你就什么工作也开展不了。但计算机科学方面的研究工作却不是这样。你只需破费一两百美元就能买到一台二手电脑,再多花50美元就能买到一套开发工具并投入工作。一台廉价的机器再加上现有的各种工具就足以让你开展重要的研究工作。正是这一点使我在1994年末从计算物理领域跳槽到了计算机科学领域里来。有一天,我从公寓大楼外的垃圾堆里刚捡回来一台废弃的80386电脑,当时的我正忙于填写各种物理方面的研究生课程申请表。在更换了硬盘之后,我让那台废电脑又焕发了青春。接下来,我决定撕掉那些申请表去学习计算机科学。我认为自己用来买那块硬盘的200美元是我这一生中最好的投资之一。
从根本上讲,计算机科学直到现在还是一门很容易进入的领域—坐在电脑前摆弄各种想法和方法是一件非常容易的事情。只要拥有了一台个人电脑,你就等于拥有了一座超一流的实验室。当然,我也不是一点儿后悔都没有,毕竟我一生中已经有7年光阴花在了物理学方面—这个领域里的顶级实验设备动辄就是数百万美元。这本书基本上是对我两年来的研究工作的一个总结,其内容主要与HEC运行时系统(run-time system)的设计和实现有关。
“HEC”这个名字是从喜剧连环漫画《CPU Wars》(CPU战争)借用来的,这部漫画虚构了一个Human Engineered Computer Company(人力计算机公司,HEC公司)的员工与来自Impossible to Purchase Machines(买不到机器公司,IPM公司)的极权主义刺客进行斗争的故事。那是在里根(Reagan)担任美国总统的20世纪80年代,当时的我还是一名中学生。我错过了计算机软件发展史上最具承前启后意义的二十年。我本人从没使用穿孔卡片编写过程序,也从没使用电传打字机输入过程序命令。我也没听说过我们那一代人里的任何一位软件工程师曾经使用过小型计算机(minicomputer)。事实上,在1984年,我能够接触到的真正的商用电脑是一台采用8088芯片的IBM PC。我给自己的运行时系统起名为“HEC”是想让那些年轻的工程师能够回想起他们的前辈,也是想对那些使用16进制代码编写程序并开创了90年代因特网繁荣局面的老一辈软件大师致以崇高的敬意。
任何一个在60年代和70年代编写过程序的人都知道,喜剧漫画《CPU Wars》里虚构出来的两个公司名称“HEC”和“IPM”实际上暗指着Digital Equipment Corporation(数字设备公司,DEC)和International Business Machines(国际商用机器公司,IBM)。DEC公司在1961年推出的PDP-1开创了小型计算机的先河。此前的计算机都是些庞大而又昂贵的大型设备,它们通常都安装在一个独立的建筑物,并且往往会有一队武装人员来守护着它们。向这类大型机(mainframe)提交作业就像是去梵帝冈面见教皇。不止一位老工程师给我讲过诸如不得不在凌晨三点签字进入机房去使用计算机之类的“恐怖”故事。
小型计算机把一切都改变了。体积更小、价格更低的小型计算机提供了一个方便的时间共享环境。程序员们再也用不着把他们的穿孔卡片交给不可一世的大型机操作人员了。通过小型计算机,软件开发人员不再需要看别人的脸色,也不再有浪费生命的等待。与大型机相比,小型计算机对广大的软件开发人员更友善,而且也更容易使用。小型计算机的迅速流行可能给IBM的销售人员带来了很大的压力。
注意  让IBM公司感到头疼不已的公司并不仅仅是DEC公司一家。早在1964年,Control Data Corporation(控制数据公司,CDC)就已经向世界推出了CDC 6600计算机。CDC 6600是当时世界上速度最快、功能最强大的计算机,它使IBM产品线的顶级产品相形见绌。但这并不会令人感到惊讶—因为开发这一产品的带头人就是大名鼎鼎的Seymour Cray(塞缪尔·克雷)。CDC 6600最初的售价是7 000 000美元,CDC公司总共卖出了大约50台。据说,IBM公司的高层领导对CDC公司推出的这种掩盖了IBM光芒的产品大为紧张,于是想出了一个纸老虎的把戏—对外宣传说IBM很快会推出它自己的超级计算机。可6个月后的事实却证明了那只不过是IBM公司为了阻挠CDC 6600的流行而虚张的声势。
DEC首创的小型计算机也是催生出UNIX操作系统的重要因素之一。在1968年,贝尔实验室(Bell Labs)的一位研究员Ken Thompson刚接手了一台DEC PDP-7计算机,他认为那台机器是开发一个名为“Space Travel”(星际旅行)游戏的绝佳平台。Ken是MULTICS项目的一位参加者。MULTICS(MULTIplexed Information and Computing Service,多重信息与计算服务)是一个由贝尔实验室、通用电气(General Electric)和麻省理工学院(MIT)联合发起的计算机项目。但MULTICS项目却不得不面对这样一个问题,即当时的硬件水平无法真正支持该项目预计提供的操作系统级功能。贝尔实验室放弃了这个项目,给可怜的Ken留下了大把的“业余”时间。Ken最初只是想利用PDP-7来实现“Space Travel”(星际旅行)游戏,可他的开发工作却不断地因操作系统内部的bug而受到影响。随着bug数量的增加,开发工作受到的影响越来越严重,Ken建立一种新操作系统的想法也越来越强烈和成熟。Ken决定根据MULTICS的要求写一个规模略小的版本供自己使用。不久之后,UNIX操作系统就诞生了。UNIX这个名字原来叫做UNICS(UNIplexed Information and Computing Service,单一信息与计算服务)。Windows群体半开玩笑地把它称为“eunuchs”(中文的意思是“太监”),这可能是因为UNIX操作系统的用户界面很差劲。
现在是2002年了,DEC公司已经成为了一种记忆。在90年代末被Compaq公司兼并之后,DEC这个品牌逐渐退出了人们的视线。
本书采用的论述方法
本书将要介绍的HEC运行时系统由一个执行引擎(execution engine)、一个机器级调试器(machine-level debugger)、一个汇编器(assembler)以及一整套相关的开发工具组成。我从最基本的零件开始建立HEC运行时系统。在开发过程中,我遇到了几个体系结构方面的问题。对这些问题的思考最终形成了关于我所构造的程序的定义。我认为,先给出一堆理由再把源代码摆到你面前并不是一个好的方法,为了让大家更好地理解我的成果,我决定采用一种与众不同的思路。
专业数学家遵循的标准操作流程(standard operation procedure,SOP)是给出命题、做出证明、然后给出一个示例。大多数数学系的研究生甚至从没考虑过这个问题—他们对“命题-证明-示例”这种操作流程见得太多了,所以只要是写论文,他们就会不假思索地采用这个流程。为了能以统一的严谨和格式去解释我所遇到的体系结构方面的问题,我决定采用一种类似的方法。我采用的SOP包括三个基本步骤:
1) 给出一个设计问题以及必要的背景知识。
2) 提出一个解决方案。
3) 对其他替换方案进行讨论,比较它们之间的利弊。
第2章里的大部分内容都是按此流程论述的。我将以概述有关基本概念和理论来开始各论题的讨论。也就是说,我会先搭建一个舞台,然后再在这个舞台上对我做出的决定进行解释。我认为这个方法能够让大家更好地理解我在解决具体问题时的具体思路。事实上,我的设计目标会给我的工作加上一些基础性的限制条件,如果读者不熟悉这些限制条件,就可能会嘲笑我的某些决定—对这一点我是相当肯定的。
最后,每个决定都有它不利的方面。例如,如果某个列表数据结构是用一个数组(array)来实现的,你就可以获得很高的访问速度,但要以降低其灵活性为代价。如果某个列表数据结构是用一个链表(linked list)来实现的,你就可以方便地增减该列表的长度,但这将以牺牲访问速度为代价。很难找到一种能够在各种条件下都达到最优效果的解决方案。这种两难局面在计算机科学里十分常见,大家在这本书里也会经常遇到。因此,我在每项设计决定的后面会立刻对该决定的利弊做出分析,让大家既能随时了解该项决定的好处,也能随时明白我牺牲了些什么。
注意  这种两难局面并不仅仅局限于计算机科学的各个领域。除非你拥有无限的资源,否则,加在其上的限制条件和要求就会不可避免地导致一些不利因素。
因为一个运行时系统必须具备一些通常需要由操作系统和硬件平台来负责实现的功能,所以我所涉及的背景资料的来源很广、很杂。我已经尽力使这本书做到尽可能的全面和自成体系。有兴趣做进一步钻研的读者可以去阅读我在各章结尾处列出的参考资料。
本书的适用读者
这本书主要供两类读者参考:
系统工程师。
计算机科学系的学生。
之所以说这本书对系统工程师很有用,是因为它能帮助他们摆脱对独断的计算机硬件制造商的依赖。如今,计算机硬件的体系结构越来越复杂,要想跟上摩尔定律(即一块芯片所能容纳的晶体管数量每隔18到24个月就会翻一番),工程师就不得不面对更大的挑战。例如,对负责开发编译器(compiler)的系统程序员们来说,与80年代的处理器相比,如今的EPIC(Explicitly Parallel Instruction Computing,并行指令计算)处理器架构绝对是一个严峻得多的挑战。为了支持诸如指令级并行处理(instruction-level parallelism)之类的功能,提高执行效率的大部分责任都已经从处理器芯片转移到了系统工程师(他们可真了不起)肩上。要想提高执行效率,就必须预测计算机指令的执行情况并尽可能地让它们并行执行。这类预测必须满足两项要求:一要尽量避免因预测错误而降低执行效率,二要生成能够通过预测而提高执行效率的代码。因此,实现这类预测功能的工作量是非常大的。不夸张地说,这足以把任何一位工程师逼得跳楼。
更糟糕的是,计算机的处理器芯片和这些芯片的指令集总是处于变化和发展当中。当一个稳定、高效的编译器被推向市场并被接纳为一种标准化工具的时候,计算机硬件肯定又有了新的进展,这就迫使设计该编译器的工程师们不得不埋头于改进该编译器的后端(back end)。为了跟上硬件开发人员的步伐,像我这样的系统软件开发人员就不得不一刻不停地跑下去,根本没有喘息的机会—这是一种永远的痛。
在不断改进开发工具后端的办法之外并不是没有其他的道路。具体地说,你可以选择一台虚拟机(virtual machine)为目标。一台虚拟机与一台真实存在的计算机的不同之处在于前者只是一个技术规范。这类技术规范由一系列规则构成,而软件工程师可以采用任何他自己认为适当的手段来实现这些规则。这就使虚拟机能够做到与具体的计算机平台无关。对一台虚拟机来说,只要它能够遵从其技术规范里的各项规则,就可以存在于任何一种计算机平台上,就可以用任何一种计算机语言来编写。我就是受到了这种思路的启发才开始构造HEC执行引擎的。我的主要目标是建立一个稳定的目标机器,让系统工程师不必再每隔两年就不得不去重新编写他们的开发工具。我的另一个目标是想为中级水平的系统工程师提供一个既容易掌握又容易应用的运行时系统,就像70年代里DEC公司的PDP-11对广大程序员们的意义那样。
这本书对那些希望进一步了解计算机工作原理却又不打算钻研直接内存访问(direct memory access)或各种计时器(interval timer)繁复细节的学生们也很有用。不管某个系统基于哪一种硬件平台,程序在其上执行的基本机制都是完全一样的:指令从二级存储器被加载到内存并由处理器来执行它们。本书用了很多篇幅来解释这种机制。我希望这本书能够使学生们对程序执行机制有一个基本的了解,这样,当他们在今后遇到某个新系统时,就能够以此为框架来分析新系统。
此外,这本书对利用汇编语言进行的程序设计也做了大量坚实的论述。完全采用汇编语言来开发程序当然不是什么明智之举,但对汇编语言的深入了解能够帮助我们对问题的本质有一个更清晰的认识,这是其他程序设计方法做不到的。例如,有时候要想彻底弄清楚编译器(compiler)中的优化器(optimizer)的细节,惟一的办法就是对处理器执行机器编码指令的有关情况做细致的研究和分析。
“不要去管那个躲在窗帘后面的人……”—童话《Oz》里的巫师
在刚接触到Borland公司Turbo C编译器的时候,我对其底层工作情况的了解是十分差劲的。因此,我通常会在写好代码并运行编译器后闭上双眼并默默祈祷。等我觉得安全了,我才会睁开双眼查看其结果。后来,我看到了Turbo C的汇编代码清单,从那以后,我才对发生在幕后的事情有了一个更好的把握—有几次,我编写出来的代码甚至比编译器的优化器做得还好。
需要的预备知识
本书假设读者都能熟练使用C和C++编程语言。如果你不熟悉C和C++语言,但又希望向系统工程师方向发展,我建议你尽快开始学习这两种程序设计语言。C语言是实现系统软件的首选语言。在各种程序设计语言里,C语言可以说是一个轻量级选手,但它的功能却十分强大,在提供了许多计算机底层操作访问手段的同时,又具备足够的抽象性,非常适用于软件移植工作。
C++是C语言的一个扩展,它的面向对象(object-oriented)技术使它能够对更复杂的问题进行描述和处理。C++是三种最优秀的面向对象的程序设计语言(Smalltalk、C++、Java)之一。我在本前言的末尾列出了几本参考书,希望它们对不甚了解C或C++语言的读者有所帮助。
对任何一位打算从事系统程序设计的人来说,掌握C语言将是一项必不可少的工作。这是因为UNIX操作系统从传统上讲都是用C语言实现的。UNIX的第一个版本是由Ken Thompson用汇编语言在一台PDP-7机器上实现的。当语句规模超过几千行之后,任何一个汇编程序都会变得难以维护。Ken能够坚持完成第一版UNIX操作系统体现了他做为一名程序员的毅力。但一个用汇编语言编写出来的操作系统难于移植,在认识到这一点之后,Ken与Dennis Ritchie和Brian Kernighan合作创造出了C语言。在1973年,UNIX内核在DEC公司新推出的PDP-11机器上重新用C语言写了一遍。如果你认为C语言是一种已经被比较现代的程序设计语言所超越了的“古董”,请再好好想想。看看Linux操作系统内核的源代码吧,它是免费的,在因特网上随处可见,但几乎全是用C语言写出来的。
本书的布局
本书对HEC的体系结构及其具体实现两方面的哲学动机都进行了论述。为此,我对它的设计问题进行了分解和分析。我相信,一幅图画抵得过千言万语;所以我会在我认为适当的地方给出一份图表或一张示意图。相关的源代码段落在书中也随处可见。
本书分为三大部分。
第一部分—概述  本书开始的两章内容是全书的基础。第1章对计算技术的发展史进行了回顾。在第1章里,我还给出了HEC虚拟机的设计目标,这些目标对HEC虚拟机本身做出了定义。在第2章里,我对HEC虚拟机的基本功能以及促使我做出各项具体决定的各种限制条件进行了简要的分析。
第二部分—HEC虚拟机  在第3和第4章里,我对HEC虚拟机及其调试器(debugger)的操作情况分别进行了解释。HEC虚拟机其实要比HEC汇编器(assembler)简单得多,所以这两章对后续的学习来说是一个很好的热身。第3章介绍的是HEC虚拟机的操作情况。第4章则对调试器进行了细致的分析。因为调试器是内嵌在虚拟机里的,所以这两章在内容上结合得非常紧密。
第三部分—HEC汇编语言  在本书最后的四章内容里,我对与HEC汇编器进行了介绍和讨论。第5章是对HEC汇编器本身的研究和分析。HEC到宿主操作系统的接口是用一组中断来提供的。第6章对这些中断依次进行了描述。HEC虚拟机汇编语言的使用方法在第7章里进行了介绍。第8章对如何使用HEC汇编语言来实现各种面向对象的结构提出了一些看法。
本书附带的光盘
软件工程可不是一项旁观者的运动,你必须亲自动手才能真正有所收获—至于下海之后要游多远倒完全取决于你个人。如果你只想拥有并使用HEC虚拟机,本书附带的光盘里的二进制文件可以让你立刻开始工作。如果你想研究HEC虚拟机的源代码,本书附带的光盘里也包含所有二进制代码的源代码。
我现在居住于加利福尼亚州,只能利用紧缺的私人预算(即我的工资)开展工作。因此,我最初的虚拟机实现是在Windows上完成的。有些读者可能会对我的这一做法感到失望,我也很能理解他们的心情。我之所以会选择Windows,是因为我认为它比KDE或GNOME更容易使用。另一条路是购买Sun公司的硬件—可惜我又拿不出那么多钱来。但这并不意味着HEC只能老老实实地待在Windows上。要想移植这个运行时系统并不困难,我在第8章对此也进行了讨论。
反馈
金无足赤,人无完人。但这并不意味着我们不必去追求完美。对很多事情来说,从实践中学习是获得知识的最佳道路。事后诸葛最容易做,所以我的目标是准备好足够的代码让大家来做我的事后诸葛。
有一种古老的东方游戏叫做“围棋”,这种游戏非常复杂,必须经过多年的认真学习才能登堂入室。“先学输,再学赢”是人们告诫围棋初学者的一句基本格言,而这也将是我告诫软件工程师们的一句格言。当你还是一个新手时,也许会犯大量的错误。大多数经理都希望年轻的软件工程师能够在错误中进步。
我在构造HEC虚拟机的时候也遵循了这条忠告。从几年前开始,我就埋头于我的代码,力争把我能找到的缺陷都纠正过来。可如果你现在让我再来一次,我知道自己肯定还能在里面再找出一些缺陷来。但是,丑媳妇总要见公婆,你编写的代码迟早要拿出来给别人看。
如果你在这本书里发现了一个错误,请来封信告诉我。如果我有钱的话,我也很愿意学学Don Knuth的做法—他为自己书里的每一个错误设立了2.56美元的奖金(一条有用的建议可以得到32美分的奖励),他甚至建议读者可以通过查找书中错误的办法把买书的钱挣回来。可惜,加利福尼亚州高昂的生活费用使我一直处于一种捉襟见肘的境地(我不知道Don的日子是怎样过的)。我能给予大家最好的奖励是献上我的感谢,或者在本书的下一版里提到你的名字。请把你的修正、建议或者批评按下面的地址寄给我:
Bull Blunden
c/o Wordware Publishing, Inc.
2320 Los Rios Blvd., Suite 200
Plano, Texas 75074
参考资料
Charles Andres。《CPU Wars》(CPU战争),1980年。http://e-pix.com/ CPUWARS/ cpuwars.html
这部喜剧连载对20世纪60年代的软件文化进行了有趣的描写。任何一位出生在1969年以后的人都应该看看这个连载,好了解一下自己在婴儿时期都错过了哪些东西。
Intel公司。《IA-64 Architecture Software Developer's Manual, Volume 1: IA-64 Application Architecture》(IA-64体系结构软件开发手册,第一卷:IA-64应用体系结构)。定购代码:245317-001,2000年1月。http://www.intel.com。
这是Intel公司论述其即将推出的64位处理器的4卷/套丛书中的第1卷。这一卷的讨论重点是编译器设计方面的问题。在看完这一卷之后,你就会明白人们为什么会说为IA-64处理器设计编译器是一项极其复杂的工作了。
Scott Maxwell。《Linux Kernel Commentary》(Linux内核分析)。The Coriolis Group出版,1999年。ISBN:1576104699。
这本书对Linux操作系统中使用的进程管理基本机制进行了深入的分析。书中用大量的图表论述了怎样才能利用C语言来构造出质量达到实际应用标准的操作系统。这可不是一本你一坐下就能看完的书。
Dennis M. Ritchie。《The Development of the C Language》(C语言的开发历史)。Association for Computing Machinery(计算机器联合会),Second History of Programming Languages Conference(第二届程序设计语言历史大会),1993年4月。
______。《The Evolution of Unix Time-sharing System》(Unix分时系统的演变)。AT&T Bell Laboratories Technical Journal 63 No. 6 Part 2(AT&T贝尔实验室技术论文集,63类,第6卷,第2部分),1984年。第1577-1593页。
Herbert Schildt。《C: The Complete Reference》(C语言参考大全)。Osborne McGraw-Hill出版,2000年。ISBN:0072121246。
这本书很适合那些想学习C语言却又没有多少编程经验的人们阅读。这是一本由一位善于解释复杂概念的作者写出的入门级读物。
______。《C++ from the Ground Up》(C++入门)。Osborne McGraw-Hill出版,1994年。ISBN:0078819695。
在读完Herbert关于C语言的书之后,你应该再继续学习一下这本书。
Peter van de Linden。《Expert C Programming: Deep C Secrets》(C语言专家程序设计技术:C语言的秘密)。Prentice Hall出版,1994年。ISBN:0131774298。
这是一本非常有价值的书。Peter论述了许多相当深奥的问题,这些东西是大师和初学者的分水岭。

作者简介

(美)Bill Blunden:暂无简介

译者简介

杨涛 杨晓云 高文雅 张玉亭:暂无简介

图书目录

第一部分  概   述
第1章  历史与目标 1
1.1  历史回顾 1
1.2  为什么要设计虚拟机 7
1.3  贬值的财富 8
1.4  微妙的平衡 9
1.5  虚拟机反对派的观点 12
1.6  展望未来 12
1.7  经验和教训 13
1.8  参考资料 16
第2章  基本执行环境 18
2.1  概述 18
2.2  记号方法 18
2.3  运行时系统与虚拟机 19
2.4  内存管理 20
2.4.1  机器级上的内存管理 21
2.4.2  操作系统级上的内存管理 25
2.4.3  应用程序级上的内存管理 28
2.5  动态内存管理 32
2.6  HEC虚拟机的内存管理 38
2.7  机器设计 41
2.8  HEC虚拟机的设计 43
2.9  任务管理 44
2.10  线程 48
2.11  HEC虚拟机的任务管理 50
2.12  输入/输出 51
2.13  HEC虚拟机的输入/输出 53
2.14  参考资料 54
第二部分  HEC虚拟机
第3章  虚拟机的实现 57
3.1  概述 57
3.2  全局性元素 58
3.2.1  common.c 60
3.2.2  win32.c 61
3.2.3  iset.c 69
3.2.4  exenv.c 73
3.2.5  error.c 78
3.3  HEC虚拟机的命令行语法 83
3.4  用来实现调试功能的代码 84
3.5  处理配置选项 85
3.6  设置环境 92
3.7  字节码验证 98
3.8  指令的执行 116
3.8.1  load.c 122
3.8.2  store.c 127
3.8.3  pushpop.c 129
3.8.4  move.c 132
3.8.5  jump.c 133
3.8.6  bitwise.c 135
3.8.7  shift.c 137
3.8.8  intmath.c 138
3.8.9  fltmath.c 139
3.8.10  dblmath.c 140
3.8.11  interupt.c 141
3.8.12  intwin32.c 143
3.9  本章总结 143
3.10  参考资料 144
第4章  HEC调试器 146
4.1  概述 146
4.2  调试技术 147
4.2.1  断点 147
4.2.2  单步执行 147
4.3  Intel平台上的调试技术 148
4.4  Intel平台上的中断 148
4.4.1  实模式下的内存寻址 149
4.4.2  实模式下的寄存器 150
4.4.3  实模式下的中断处理 151
4.5  DOSdbg 152
4.6  用来对付调试器的招数 162
4.6.1  招数之一:破坏堆栈 162
4.6.2  招数之二:增加线程 163
4.6.3  招数之三:自修改程序 164
4.6.4  招数之四:混合内存模型 166
4.6.5  其他招数 167
4.7  HEC文件格式 168
4.7.1  文件头部分 169
4.7.2  符号表 169
4.7.3  字符串表 171
4.7.4  字节码部分 171
4.8  操作模式 171
4.9  HEC调试器实现 172
4.10  命令行的处理 173
4.11  保存调试元数据 173
4.12  处理调试命令 186
4.12.1  - 帮助 187
4.12.2  Q - 退出 188
4.12.3  F - 可执行文件信息 188
4.12.4  D start stop -转储内存 189
4.12.5  S start stop string - 搜索字符串 191
4.12.6  L string - 符号查询 193
4.12.7  P - 函数显示 197
4.12.8  RX- 显示寄存器内容(Ri、Rf、
Rd) 198
4.12.9  T - 单步执行 199
4.13  未来设想 212
4.13.1  更快的算法 212
4.13.2  O(n)记号 213
4.13.3  动态补丁 214
4.13.4  动态断点 214
4.13.5  会话日志 215
4.13.6  程序频率计数 215
4.13.7  符号化调试器 215
4.14  试用HEC虚拟机 216
4.15  参考资料 223
第三部分  HEC汇编语言
第5章  汇编器的实现 225
5.1  概述 225
5.2  数据结构简述 227
5.2.1  HSAM汇编器算法 227
5.2.2  抽象数据类型 228
5.2.3  抽象数据类型之一:向量 229
5.2.4  可扩展数组 230
5.2.5  抽象数据类型之二:数据树 233
5.2.6  二元搜索树 234
5.2.7  抽象数据类型之三:字典 242
5.2.8  哈希表 243
5.2.9  HASM数据结构小结 251
5.3  命令行的使用方法 252
5.4  HEC汇编器实现 253
5.5  全局性元素 258
5.6  命令行选项和命令行参数的处理 260
5.7  第1遍—建立符号表 267
5.7.1  概述 267
5.7.2  LineScanner类 268
5.7.3  LineTokenizer类 274
5.7.4  Pass1类 298
5.7.5  StringTable类 317
5.7.6  SymbolTable类 320
5.7.7  HashTable类 332
5.8  第2遍—生成字节码和程序清单 338
5.9  创建编译单位 385
5.10  读取程序清单文件 392
5.11  试用HSAM汇编语言 393
5.12  参考资料 405
第6章  虚拟机的中断 407
6.1  概述 407
6.2  INT 0—文件输入/输出 415
6.3  INT 1—文件管理 428
6.4  INT 2—进程管理 444
6.5  INT 3—断点 452
6.6  INT 4—时间和日期调用 452
6.7  INT 5—处理命令行参数 462
6.8  INT 6—内存诊断 465
6.9  INT 7—动态内存分配 469
6.10  INT 8—数学函数 480
6.11  INT 9—与宿主代码的接口 486
6.12  INT 10—进程间通信(IPC) 498
6.12.1  IPC概述 498
6.12.2  TCP/IP套接字 503
6.12.3  TCP/IP地址 504
6.12.4  实现 506
6.13  参考资料 525
第7章  HEC汇编语言 527
7.1  构成汇编语言程序的元素 527
7.1.1  指令 527
7.1.2  伪指令 529
7.1.3  注释 529
7.2  函数和标号的定义 530
7.3  立即数据的加载和移动 533
7.4  直接内存寻址模式 534
7.5  数据的加载和保存 538
7.6  算术运算 541
7.7  二进制位操作 542
7.8  数据转换 547
7.9  程序流控制 549
7.9.1  跳转 549
7.9.2  选择 552
7.9.3  循环 557
7.10  与堆栈有关的操作 559
7.11  间接内存寻址模式 562
7.12  全局变量存储的定义 563
7.13  构造函数调用记录 567
7.14  数据类型的映射 575
7.15  程序元素的作用范围 579
7.16  指令与伪指令小结 587
7.17  参考资料 590
第8章  高级论题 592
8.1  HEC虚拟机与高级语言:编译器设计 592
8.1.1  复杂性管理 592
8.1.2  方法 595
8.2  支持面向对象功能 598
8.2.1  基本概念 598
8.2.2  封装 600
8.2.3  继承 605
8.2.4  多态 612
8.3  异常 623
8.3.1  Java中的异常 625
8.3.2  异常的实现方法 629
8.3.3  异常的实现示例 631
8.3.4  异常的滥用 641
8.4  移植 641
8.4.1  对Linux的观感 641
8.4.2  linux.c文件 645
8.4.3  intlinux.c文件 654
8.5  建立HEC运行时系统 663
8.6  建造你自己的运行时系统 665
8.6.1  模仿与创造 665
8.6.2  项目管理—关键路径 665
8.6.3  运行时系统的关键路径 666
8.6.4  操作系统的关键路径 667
8.7  参考资料 671
8.7.1  编译器理论 671
8.7.2  密码学 671
8.7.3  异常 672
8.7.4  Java 672
8.7.5  Linux 673
附录 674

教学资源推荐
作者: [美]本贾尼·斯特劳斯特鲁普(Bjarne Stroustrup)著
作者: 郭志强 邱李华 曹青 等编著
作者: 王瑞民 卢红星 主编 姬波 陈静 朱真峰 柳宏川 参编
作者: (美)Y.Daniel Liang 著 阿姆斯特朗亚特兰大州立大学
参考读物推荐
作者: Shelley Powers
作者: 李俊阳 杜承垚 胡雪婷 卢力 编著
作者: 葛红儒 著
作者: 卫军 夏慧军 孟腊春 编著