物理地址.内存地址和RVA地址有什么区别???
答案:2 悬赏:80 手机版
解决时间 2021-12-25 20:26
- 提问者网友:我没有何以琛的痴心不悔
- 2021-12-25 01:02
如题...改输入表时不清楚这些概念..没法进行
最佳答案
- 五星知识达人网友:往事隔山水
- 2021-12-25 02:22
打个比喻:内存,段号,偏移量,存储单元的内容-》学校,班级,学号,具体的学生。通过班级和学号就可以找到对应的学生,内存的访问也类似,通过段号和段内偏移量访问对应的存储单元。
段可以理解为一片连续的内存空间块,开始处指的是这片空间的第一个字节。
对于一个16位的偏移量,它的取值范围是0--65535(2的16次方减去1),所以偏移量可以是1。
你可能混淆了概念,仔细的想一下学校,班级,学号,学生;这种关系就跟内存,段号,偏移量,存储单元的内容一样。 下面介绍一下相关虚拟地址(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处。
段可以理解为一片连续的内存空间块,开始处指的是这片空间的第一个字节。
对于一个16位的偏移量,它的取值范围是0--65535(2的16次方减去1),所以偏移量可以是1。
你可能混淆了概念,仔细的想一下学校,班级,学号,学生;这种关系就跟内存,段号,偏移量,存储单元的内容一样。 下面介绍一下相关虚拟地址(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处。
全部回答
- 1楼网友:雾月
- 2021-12-25 03:36
以下纯属个人理解,可能有误
内存有物理内存和虚拟内存,
物理地址就是在现实中存储的地址,
rva是一种算法,就是逻辑上的分区定位,
举个例子,有1号2号两个杯子,往一杯里倒水,物理地址指向的就是倒了水的那个杯子,rva指得就是杯子的编号,杯子的编号可以改变,但是杯子本身不会改变
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯