您好,欢迎来到叨叨游戏网。
搜索
您的当前位置:首页游戏和普通程序都有基址

游戏和普通程序都有基址

来源:叨叨游戏网
游戏基址问题

1、程序的基址既然不会变,那在运行这个程序之前这个地址如果给别的程序霸占了不就冲突了吗

2、程序的基址是不是不变的。

3、但在Windows中,每个程序的地址空间是不是都是相互的虚拟地址。

比如进程A的数据段中的某个地址看起来和B的数据段某个地址相同,这仅仅是看起来。其实它们是虚拟地址,是相对于装入地址而言的。在物理上在计算机中存放的是不同的位置。 具体的您可以研究一下PE文件格式。

下面介绍一下相关虚拟地址(Relative Virtual Addresses)

PE格式文件中经常用到RVA,即相关虚拟地址,用在不知道基地址的情况下表示一个内存

地址。它需要加上基地址才能得到线性地址(Linear address)。

例如:假设一个可执行程序调入内存0x400000处并且程序从RVA 0x1560处开始执行。那

么正确的开始地址是0x401560。如果可执行程序调入0x100000处,则开始地址为0x101560。 因为PE文件的每一个段不必按同样的边界对齐方式调入,因此RVA地址的计算变得比较复

杂。例如,在文件中每一个段往往按512个字节的方式对齐,而在内存中可能以4096字节的方

式对齐。这方面的介绍可见下面的“SectionAlignment”、“FileAlignment”。举个例子,

假设你知道一个程序从RVA 0x1560开始执行,你想从那儿反汇编它。你发现内存中的段对齐方

式为4096并且.code段开始于内存RVA 0x1560并且有16384字节长;那么你可以知道RVA 0x156

0在这个段的0x560处。你又发现这个段在文件中以512字节方式对齐并且.code开始于文件0x8

00处,那现在你知道了可执行程序开始于0x800+0x560 = 0xd60处。 0x234 。 。 0x98871 。 。 0x102打开三个同样的程序窗口A、B、C…..则Windows会相对应地开辟三个空间A、B、C。。。但所开辟空间是相互的,编码也是从0x000000开始进行,所以程序入口或数据段的基址是不变以 0x00121d 0x00121d 0x00121d 都是0x00121d。 C B A 但A、B、C三个 程序是相互, 互不干扰的。。。

因为A、B、C程序的载入时的地址分别是0x234、0x98871、0x102。

这好像是页式管理内存的方法。。。。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- gamedaodao.net 版权所有 湘ICP备2024080961号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务