PE文件结构(六)
 
[译后记]:
由于时间等因素,遗漏、重复、不准确甚至错误等情况在所难免,敬请各位批评、指正!另外,由于我保留了所有的英文术语(译文就在后面),所以译文看起来有点乱,请大家见谅!
本文的原文写于1999年,由于时间关系,文中所说的有关公司、某某项目应用的操作系统范围等等介绍可能已经不对或不准确了,请大家自己分析、鉴别。
最后再谈点个人感想:
1)个人觉得本文的难点在于输入符号(表)部分,而其精华乃在附录之中。在学习前面的各种项目成员名称、说明等的同时,如能对照后面的附录来学习,将会起到事半功倍的效果。另外,文中所说的什么结构体、共用体之类术语都是针对编程而言,如果你并不想或不会编程的话,可以将其理解为一个将其它东西集合在一起的一个容器就行了。
2)原文发表于1998-1999年之间,而相应的中文译文至今也难在网上搜寻得到,这对中国的破界来说不能说不是一个很大的遗憾!本文仅起抛砖引玉之用,希望能有更多、更好、更及时的国外类似资料出现在我们的网络之上,以造福于我们这些广大的菜鸟。
                                                                       沈忠平     2006.02 于和州




===========================
|“PE文件格式”1.9版注释:|
===========================
①Win32s和Win32
Win32s是“WIN32 subset”的缩写,它是一个可被加入到Windows 3.1和Windows for Workgroups系统中以使它们能够运行32位应用程序的软件包。正如它的名字所暗示的那样,Win32s只是Windows 95和Windows NT系统中使用的Win32 API的一个子集。Win32s的主要功能就是在32位和16位内存地址间相互转换,也就是一种被称为换长的操作。

Win32是32位Windows(包括Windows NT,95, 98 和2000等)操作系统的编程接口(API)。当应用程序是按Win32 API编写时,它们就具有16位API(Win16)所不具备的一些高级性能。一个按Win32编写的程序能运行在所有的操作系统之上,除非这个程序要求特定的操作系统特性,而这些特性别的操作系统又没有时。例如,Windows NT提供的安全特性Windows 95/98就没有。一个为NT系统的这些特性编写的程序就不能运行在其它的Windows系统之上。

    使用此API的程序                         能运行在...上
      Win32                                   95, 98, NT, 2000, XP
      Win32s                             3.1, 95, 98, NT, 2000, XP
      Win32c                                  95   
      Win16                         3.0, 3.1, 95, 98, NT, 2000, XP


②目标文件(Object file   )和映象文件(Image file)
目标文件(Object file)指的是链接程序(链接器)的输入文件。链接器输出的是映象文件,映象文件反过来又是加载器的输入文件。“object file”一词未必含有任何和面向对象的编程有关的联系。

映象文件(Image file)指的就是可执行文件:或者是.EXE,或者是.DLL。一个映象文件可被想象为“内存映象”。“映象文件”一词常被用来代替“可执行文件”,因为后者有时被用来专指.EXE文件。


③UNIX
是一个很流行的多用户、多任务的操作系统,由贝尔实验室于上世纪70年代早期开发出来的。只有很少的程序员建立的UNIX系统本来是设计给他们这些程序员专用的、小巧的、灵活的系统。UNIX是用高级编程语言,就是C语言,编写的第一批操作系统之一。这就意味着只要电脑上有C语言编译器,UNIX就可以被虚拟地安装到任何电脑上。天生的可移植性加上低廉的价格使得UNIX成为各大学的流行选择。(因为反信用条款禁止贝尔实验室将UNIX作为它的全权产品推向市场,所以UNIX的价格不贵。)
贝尔实验室只发布它自己源语言形式的UNIX操作系统,所以任何获得一份拷贝的人都可以按照自己的意愿来修改和定制它。到上世纪70年代末时,有好几十种不同版本的UNIX运行在世界各地。(更多信息请参阅别的资料。)


④VMS
“Open Virtual Memory System”或仅VMS,是运行于VAX和Alpha系列电脑之上的高端电脑服务器操作系统的名字,现在用于使用英特尔Itanium CPU的Hewlett-Packard(惠普)系统之上。VAX和Alpha系列电脑由美国马萨诸塞州Maynard市的数据设备(DEC)公司(现在由HP拥有)生产的。OpenVMS 是一个基于多用户、多处理虚拟存储的操作系统,设计用于时间共享、批处理和事项处理等。


⑤SDK
是“software development kit”(软件开发工具箱)的缩写,它是一个供程序员为特定平台开发应用程序的编程包。典型的,一个SDK包含一个或多个API库、各种编程工具和相关文档等。


⑥Ne Format(New-style EXE Format的缩写)
是一个早期Windows操作系统的可执行文件(.EXE),包含一个代码和数据的集合或者一个代码、数据和资源的集合。这种可执行文件也包括两个头:一个MS-DOS头和一个Windows头,和一些节。(具体参看其他资料)


⑦OS/2(IBM Operating System/2,IBM 操作系统/2)
  操作系统/2(OS/2)最初是由 Microsoft 和 IBM 共同合作开发的一种应用于 PC 机的操作系统。现在只由 IBM 销售、支持和管理。其设计目标是替换传统的 DOS 操作系统。OS/2 与 DOS、Windows 都相兼容。换句话说,OS/2 操作系统可运行所有的 DOS 和 Windows 程序,但在 OS/2 下运行的某些特殊写程序却不能在 DOS 或 Windows 下运行。
  OS/2 是一个32位的、为个人计算机而设计的、支持保护模式和多任务的操作系统。OS/2 系统中的图形表示管理器(Presentation Manager)作为其图形系统,主要负责管理窗口、字体及控件等。OS/2 系统顶部是 Workplace 命令解释程序(WPS - 该内容在 OS/2 2.0中有具体介绍),WPS 以文档为中心,允许用户访问文件和打印机,并可以启动程序。WPS 遵循 IBM 的用户界面标准,即“通用用户访问”。
  OS/2 操作系统中包含一种系统对象模型(SOM),包括磁盘、文件夹、文件、程序对象及打印机等对象。SOM 允许应用程序间代码共享,但这与编程语言无关。一种称为 DSOM 的分布式版本支持不同计算机上对象间的相互通信。DSOM 建立在 CORBA 基础上。SOM 类似于微软的组件对象模型(Component Object Model),同时两者相互竞争。目前人们对 SOM 和 DSOM 已停止深度开发。
  OS/2 操作系统也包括一种叫做 OpenDoc 的混合文档技术,它由 Apple 开发而成。但目前人们对 OpenDoc 也已停止深度开发。
  由于 OS/2 存在市场局限性,IBM 公司已于2003年3月12日按照电子商务计划停止了 OS/2 的发展市场。



⑧MIPS
MIPS是世界上很流行的一种RISC处理器。MIPS的意思是“无内部互锁流水级的微处理器”(Microprocessor without interlocked piped stages),其机制是尽量利用软件办法避免流水线中的数据相关问题。它最早是在80年代初期由斯坦福(Stanford)大学Hennessy教授领导的研究小组研制出来的。MIPS公司的R系列就是在此基础上开发的RISC工业产品的微处理器。这些系列产品为很多计算机公司采用构成各种工作站和计算机系统。如R3000、R4000、R10000等都是其生产的处理器。

MIPS技术公司是美国著名的芯片设计公司,它采用精简指令系统计算结构(RISC)来设计芯片。和英特尔采用的复杂指令系统计算结构(CISC)相比,RISC具有设计更简单、设计周期更短等优点,并可以应用更多先进的技术,开发更快的下一代处理器。MIPS是出现最早的商业RISC架构芯片之一,新的架构集成了所有原来MIPS指令集,并增加了许多更强大的功能。

⑨big-endian、Little-endian和endian  
Big-endian和Little-endian是用来表述一组有序的字节数存放在计算机内存中时的顺序的术语。Big-endian(即“大端结束”或者“大尾”)是将高位字节(序列中最重要的值)先存放在低地址处的顺序,而Little-endian(即“小端结束”或者“小尾”)是将低位字节(序列中最不重要的值)先存放在低地址处的顺序。举例来说,在使用Big-endian顺序的计算机中,要存储一个十六进制数4F52所需要的字节将会以4F52的形式存储(比如4F存放在内存的1000位置,而52将会被存储在1001位置)。而在使用Little-endian顺序的系统中,存储的形式将会是524F(52在地址1000处,4F在地址1001处)。IBM的370种大型机、大多数基于RISC的计算机以及Motorola的微处理器使用的是Big-endian顺序,TCP/IP协议也是。而Intel的处理器和DEC公司的一些程序则使用的Little-endian方式。
“endian”这个词出自《格列佛游记》。小人国的内战就源于吃鸡蛋时是究竟从大头(Big-Endian)敲开还是从小头(Little-Endian)敲开,由此曾发生过六次叛乱,其中一个皇帝送了命,另一个丢了王位。
我们一般将endian翻译成“字节序”,将big endian和little endian称作“大尾”和“小尾”。


⑩Alpha AXP
“DEC Alpha”,也被称作“Alpha AXP”,是一个原来由美国数据设备公司(DEC)开发和制造的64位RISC微处理器(例如:DEC Alpha AXP 21064 微处理器),他们将它用在自己的工作站和服务器系列上。被设计作为VAX系列计算机的继承者,Alpha AXP不但支持VMS操作系统,同时也支持Digital UNIX操作系统。后来的一些开放源码操作系统也能运行于Alpha之上,著名的Linux和BSD UNIX操作系统特别支持。微软直到Windows NT 4.0 SP6才支持这种处理器,但Windows 2000第2版之后就又不支持了。


?UTC
是“Coordinated Universal Time”的缩写,意为“协调通用时间”,它是综合了只以地球的不停旋转速率为基准的格林威治标准时间(Greenwich Mean Time)和高度精确的原子时间的一种时标。当原子时间和地球时间达到一秒的时差时,一个闰秒就被算进UTC时间中。UTC设计于1972年1月1日,并被国际度量衡局(International Bureau of Weights and Measures)于巴黎协调通过。跟格林威治标准时间一样,UTC也被设定于0经度的本初子午线。


?BSS
是“Block Started by Symbol”的缩写,意为“以符号开始的块”。BSS是Unix链接器产生的未初始化数据段。其他的段分别是包含程序代码的“text”段和包含已初始化数据的“data”段。BSS段的变量只有名称和大小却没有值。此名后来被许多文件格式使用,包括PE。
“以符号开始的块”指的是编译器处理未初始化数据的地方。BSS节不包含任何数据,只是简单的维护开始和结束的地址,以便内存区能在运行时被有效地清零。BSS节在应用程序的二进制映象文件中并不存在,例如:
unsigned char var;     // 分配到.bss节的8位未初始化变量
unsigned char var2 = 25;    // 分配到.data节的8位已初始化变量


?BSOD(blue screen of death,蓝屏死机)
是运行在Windows环境下的计算机上出现的一个错误,甚至包括最早版本的Windows,比如Windows 3.0和3.1,在后来的Windows版本比如Microsoft Windows 95, Windows 98, Windows NT,和Windows 2000上仍能出现。它被开玩笑地称为蓝屏之死是因为错误发生时,屏幕变成蓝色,电脑总是不能正常运转并需要重新启动。


?POSIX
是“Portable Operating System Interface for UNIX”(UNIX可移植操作系统接口)的首字母缩写,它是定义程序和操作系统之间的接口的一套IEEE和ISO标准。通过将他们的程序设计为符合POSIX标准,开发者就能获得一些让他们的程序可以容易地被移植到其他POSIX兼容的操作系统上的保证,主要包括大多数UNIX操作系统。POSIX标准目前由IEEE下叫做“Portable Applications Standards Committee”(PASC)(可移植的应用程序标准委员会)维护。


?thunk
(动词) 换长,变长;已经想到的,预先想到的
(指在个人电脑中,将一个16位内存地址转换为一个32位的地址,或者相反。换长是必须的,因为英特尔的老16位微处理器使用一种叫分段内存的定址方式,而它的32位微处理器使用的却是一个统一的地址空间。Window 95支持一种允许32位程序调用16位DLL的换长机制,叫统一换长。而另一方面,运行在Windows 3.x和Windows for Workgroup下的16位应用程序不能使用32位DLL,除非32位地址被转换为16位地址。这就是Win32的功能,并被称为通用换长。
根据民间传说,thunk一词是由一位Algol-60编程语言的开发者编出的,他在一天深夜意识到参数的数据类型是可以被编译器稍先一点知道的。也就是说,到了编译器处理参数的时候,它就已经想到了(thunked)数据类型了。该词的含义近年来已变化很大了。)
(名词)换长,变长(在一个分段内存地址空间和一个统一地址空间之间互相转换的操作)
(我查遍书店中所有的大大小小的英汉和英英词典,都没有找到thunk这个词的含义。后在网上找到了它的英语解释,却找不到它对应的汉语译法,现根据它的意思,姑且译之。各位勿笑,还请高手指点。)
(英文参见:
[url]http://www.webopedia.com/TERM/T/thunk.html[/url])
转自:[url]http://bbs.cmbfree.com/read.php?tid-34274.html[/url]