当前位置:首页 » 编程博文
开发技术指南» 文章正文
    引言: 连接器和加载器::第2章 架构问题 原著:John R. Levine 原文:收藏 翻译:lover_P 连接器和加载器,连同编译器和汇编器,都能够敏锐地感觉到架构的细节,既包括硬件架构也包括其目标计算机上的操作系统的架构转换需求。
 

 

 ·浅谈c语言的可变参数    »显示摘要«
    摘要: c语言中有些函数使用可变参数,比如常见的int printf( const char* format, ...),第一个参数format是固定的,其余的参数的个数和类型都不固定。 c语言用va_start等宏来处理这些可变参数。这些宏看起来很复杂,其实原理挺简单,就是根据参数入栈的特点从最靠近第一个可变参数的固定参数开始,依次获取每个可变参数的地址。下面我们来分析这些宏。 在stdarg......
    摘要:mysql数据库表生成hibernate配置文件及java类文件具体如下: 1. 需要的包: a. hibernate-2.1.6.zip b. hibernate-extensions-2.1.2.zip c. mysql-connector.jar 2. 具体配置: a. setenv.bat配置如下: @echo off rem ---------......


[翻译]连接器和加载器::第2章 架构问题
连接器与加载器::第2章 架构问题

【程序编程相关:如何实现开关CD-ROM

原著:john r. levine 【推荐阅读:Allegro 库的使用日志 2004-

【扩展信息:读取英文单词,按顺序排列(C++学习题目

原文:收藏

翻译:lover_p

    连接器与加载器,连同编译器与汇编器,都能够敏锐地感觉到架构的细节,既包括硬件架构也包括其目标计算机上的操作系统的架构转换需求.在这一章中我们涵盖了足够多的计算机架构以理解连接器所必须完成的工作.这里所有对于计算机 架构的描述都故意作得不完整,而且省略了并不影响连接器的部分,如浮点运算与i/o.

    硬件架构的两个方面影响着连接器:程序地址与指令格式.连接器要做的一件事是修改数据存储器与指令中的地址与偏移量.无论是修改数据还是指令,连接器都必须确保它的修正能够匹配计算机所使用的地址方案;在修正指令时它还必须进一步确保其修正不会导致无效指令.

    在这一章的结束,我们还关注了地址空间架构,也就是说,一个程序必须工作在哪些地址的集合上.

[内容]

2.1 应用程序二进制接口 2.2 存储器地址 2.2.1 字节顺序与对齐 2.3 地址格式 2.4 指令格式 2.5 程序调用与可定址性 2.5.1 程序调用 2.6 数据与指令引用 2.6.1 ibm 370 2.6.2 sparc 2.6.2.1 sparc v8 2.6.2.2 sparc v9 2.6.3 intel x86 2.7 分页与虚拟存储 2.7.1 程序地址空间 2.7.2 映射文件 2.7.3 共享库与程序 2.7.4 位置无关的代码 2.8 intel 386 中的分段 2.9 嵌入式架构 2.9.1 地址空间槽 2.9.2 非一致地址 2.9.3 存储对齐 2.10 练习

 

2.1 应用程序二进制接口

    每个操作系统都为运行在它上面的程序提供了一个应用程序二进制接口(abi, application binary interface).abi由应用程序在操作系统上必须遵守的编程约定(programming convertion)构成.abi总是包含一组系统调用(system call)与调用(invoke)系统调用的技巧,以及一些关于程序能够使用哪些存储器的规则与使用机器寄存器的规则.从应用程序的观点看,abi与部分的系统架构以及底层的硬件架构同样重要,因为一个程序无论违反哪一方的约束都会同样引起失败.

    在很多情况下,连接器都要完成有关遵从abi的工作中的重要部分.例如,如果abi要求每个程序都包含一个罗列了程序中所有例程所用到的静态数据的地址的表,连接器通常就要通过收集连接到程序中的所有例程中的地址信息来建立这个表.abi最能影响连接器的方面就是对标准程序调用的定义,我们将在这一章稍后的部分回到这一主题.

2.2 存储器地址

    每台计算机都包含一个主存储器.主存储器总是以一个存储位置的排列出现,其中每个存储位置都有一个数值地址. 这个地址从零开始,增长到由一个地址中的位数所决定的一个较大的数值.

2.2.1 字节顺序与对齐

    每个存储位置都由数量固定的位(bit)所构成.在过去的50年里,计算机被设计为每个存储位置由多至64位少至1位构成,但是现在几乎所有的计算机成品每个地址字节都有8位.由于很多计算机要处理的很多数据,尤其是程序地址,都比8位要多,因此计算机还可以通过将邻近的字节分组来处理16.32甚至64或128位的数据.在一些计算机上,特别是来自ibm与motorola的计算机,其多字节数据中的第一个(地址数值较小的)字节是最重要的字节;而其他的,特别是dec与intel,这一位是最不重要的,如图1所示.«gulliver´s travels»中将ibm/motorola字节顺序称为大尾数的(big-endian),而将dec/intel架构称为小尾数的(little-endian).

图2-1:字节可寻址存储器

通常的存储地址描述

    多年以来对这两种架构的优点的比较引起了激烈的争论.实际上,如何选择字节顺序最大的问题在于与旧系统的兼容性,因为在字节顺序相同的机器之间移植程序与数据要比在字节顺序不同的机器之间容易得多.目前很多芯片的设计都能够支持各种数据,可以通过芯片 跳线.系统启动程序,或者少部分情况下甚至可以由每个应用程序来作出选择.(在这些双掷开关芯片上,字节顺序是通过加载与存储指令的变化来处理的,但字节顺序具有固定编码的指令却不能.这种细节使得连接器作者的生活丰富多彩.)

    多字节数据通常必须被对齐(align)到自然的边界 (boundary)上.也就是说,四字节数据应该被对齐到一个四字节的边界,双字节应该对齐到双字节,以此类推.还可以这样想:一个n字节的数据应该至少有log2n个为零的低位.在一些系统(intel x86.dec vax.ibm370/390)上,未对齐的数据引用会导致工作效率降低的代价,而在其他一些系统(很多risc芯片)上,未对齐的数据会导致一个程序的失败.即使在未对齐数据不会导致程序失败的系统上,性能的损失也通常足够值得我们在可能的时候去努力管理对齐.

    很多处理器还对程序指令有对齐要求.大部分risc芯片要求指令必须被对齐到四字节边界.

    每个架构还都定义了寄存器(register)——一小组长度固定的高速存储器,其地址可以由程序指令直接引用.一种架构与另一种架构的寄存器数量是不同的,从intel架构(ia, intel architecture)中的至少8个到一些risc设计中的32个不等.寄存器通常总是与程序地址具有相同的大小,也就是说,在一个32位地址的系统上,寄存器是32位的,而在64位地址的系统上,寄存器是64位的.

2.3 地址格式

    当程序运行的时候,它从存储器中读取或向存储器写入数据,这些存储器由程序中的指令来检测.指令自身也存放在存储器中,通常是放在一个与程序数据不同的部分中.指令理论上是按照 它们所存储的顺序执行,除了跳转(jump)指令指定一个的新的地址并开始执行(那里的)指令.(一些架构使用术语分支(branch)来表示部分或所有的跳转,但我们在这里将它们全部 称为跳转.)每条指令都引用了数据存储器,而且每个跳转都或者指定了数据加载或存储的地址.或者指定了指令要跳转的位置.所有的计算机都有很多指令格式与地址格式规则,连接器必须能够像在指令中处理重定位地址那样处理这些规则.

    尽管在过去的数年中计算机设计者们提出了很多不同的复杂的地址架构,但目前的成品计算机都有一个相对简单的地址架构.
...   下一页

 ·eclipse3.0开发系列之vss版    »显示摘要«
    摘要:使用eclipse3.0开发时,如果想与vss相结合,首先需要下载支持eclipse3.0的vss的插件,下载网站为http://www.eclipse-plugins.info/eclipse/rating_details_plugin.jsp;jsessionid=8ab256b4b53bcb19160c2b35b8187096?plugin_id=78 解压此文件到\plugins目录......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE