读书笔记重定位 转载

读书笔记重定位 转载

ID:12500571

大小:40.17 KB

页数:9页

时间:2018-07-17

读书笔记重定位 转载_第1页
读书笔记重定位 转载_第2页
读书笔记重定位 转载_第3页
读书笔记重定位 转载_第4页
读书笔记重定位 转载_第5页
资源描述:

《读书笔记重定位 转载》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、读书笔记重定位转载读书笔记--重定位(转载)2010/10/1915:50【原创】读书笔记--重定位haoxf时间:2008-11-22,09:33:03在学习重定位之前,有必要知道重定位的用途。在实模式下,内存使用二维的编址方式。即地址的形式为"段基址:段内偏移"。这是一个逻辑地址,必须经过逻辑地址到绝对地址的转换后才能访问到所需的数据。那为什么要采用这种二维地址呢,为什么不直接用绝对地址,用二维地址又有什么好处?原因很简单,现在的操作系统是一个多任务的环境。即使在DOS的单用户单任务环境下,任何时刻内存中也不只存在一个程序。意思就是,不可能使每个程序都

2、加载到它们希望的地址上(在Windows下,每个应用程序都有自己的4G地址空间。其自身当然能加载到其希望的地址上,但对于其加载的DLL,除第一个外剩余的往往都需要重定位)。如果使用绝对地址,则未加载到希望位置的程序将不能正确执行。对于使用二维地址编址,这个问题将大大简化。对于一个同段内的代码,其相对于段基地址的偏移是固定的,只需根据加载的实际地址修改段基址便可使程序正确运行。而段基址一般由相应的段寄存器给出,则只需修改段寄存器即可完成重定位。使用二维地址方式,大大减化了重定位问题。即使程序没有被加载到希望的位置也能得到正确地执行。二维地址xxxx:yyyy

3、与绝对地址的转换关系如下:绝对地址=xxxx0+yyyy;即绝对地址等于段值左移四位与段内偏移相加。对于80x86来说,实模式下处理器使用20位地址线,寻址空间为1M。其段值理应为20位,但Intel作了一个规定:程序段段基址的低4位必须为0,即分段时段基址必须是定于16字边界。有了这个规定,段基址只需16位即可表示。如一个二维地址为1000:1000,则其对应的绝对地址为10000+1000,即11000。实模式下最大物理地址为FFFF:FFFFh,即10FFEFh。从地址000000h到10FFFFh则是实模式下的地址空间,包含10FFF0h个字节。所

4、以准备地说,实模式下的寻址范围不是1M,而是1114095字节,近似等于1088KB(比1088KB少16字节)。对于8086/8088而言,由于没有A20地址线,最大物理地址限定在FFFFFh。即上面提到的最大物理地址对于只有20位地址的8086/8088而言是不可送到的。如二维地址FFFF:FFFFh,只能转换成0FFEFh(最高位的1因为没有多余的地址线来表示它而丢失)。其相应的最大物理地址的逻辑地址是F000:FFFFh或FFFF:000Fh(注意,此处的多个二维地址映射到相同的物理地址,意为着段是可以重叠的)。当二维地址转换为绝对地址的过程中,出

5、现地址过大而使高位地址丢失的现象,就是我们平时常听到的"内存环绕"(大于FFFFFh的绝对地址只能映射到1M内存范围内)。由于1M地址空间中有一部分用作它用,如BIOS区,显示缓冲区,各种接口卡区等,再加上DOS的驻留,应用程序真正能使用的只有640KB左右的内存。通常称为常规内存。以下介绍程序是如何装入内存,从而变成在计算机内可执行的形式的。在用汇编语言或高级语言编写的程序中,是通过符号名来访问子程序和数据的,我们把程序中符号名的集合叫做"名字空间"。汇编语言源程序经过汇编,或者高级语言源程序经过编译,得到的目标程序是以"0"作为参考地址的模块,然后多个

6、目标模块由连接程序连接成一个具有统一地址的装配模块,以便最后装入内存中执行。我们把目标模块中的地址称为相对地址(或逻辑地址),而把相对地址的集合叫做"相对地址空间"或简单地叫做"地址空间"。装配模块虽然具有统一的地址空间,但它仍是以"0"作为参考地址,即是浮动的。要把它装入内存执行,就要确定装入内存的实际物理地址,并修改程序中与地址有关的代码,这一过程叫做地址重定位。地址空间的程序和数据经过地址重定位处理后,就变成了可由CPU直接执行的绝对地址程序。我们把这一地址集合称为"绝对地址空间"或"存储空间"。地址重定位完成的相对地址转换成内存的绝对地址工作又称为

7、地址映射(map)、按照重定位的时机,可分为静态重定位和动态重定位。一、静态重定位DOS采用的是静态定位。静态重定位是在程序执行之前进行重定位,它根据装配模块将要装入的内存起始位置,直接修改装配模块中的有关使用地址的指令。例如,一个以"0"作为参考地址的装配模块,要装入以0100H为起始段基值的存储空间。显然,在装入之前要做某些修改,程序才能正确执行。例如,JMP0500:0100h这条指令的意义,是跳转到绝对地址6000H处。现在跳转的实际地址为6100h,即在地址6000h(0500:0100h)的基础上加上装入的地址(1000),因此,JMP0500

8、:0100h这条指令中的直接地址码也要相应地加上起始地址,而成为J

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。