IMAGE_SECTION_HEADER中PhysicalAddress字段的用途及历史使用疑问
IMAGE_SECTION_HEADER 中 PhysicalAddress 字段的用途与历史
typedef struct _IMAGE_SECTION_HEADER { BYTE Name[IMAGE_SIZEOF_SHORT_NAME]; union { DWORD PhysicalAddress; DWORD VirtualSize; } Misc; DWORD VirtualAddress; DWORD SizeOfRawData; DWORD PointerToRawData; DWORD PointerToRelocations; DWORD PointerToLinenumbers; WORD NumberOfRelocations; WORD NumberOfLinenumbers; DWORD Characteristics; } IMAGE_SECTION_HEADER, *PIMAGE_SECTION_HEADER;
实际用途
- PhysicalAddress 是PE格式设计初期的遗留字段,原本用于指定节在物理内存中的起始地址/偏移,针对的是实模式或早期保护模式下直接访问物理内存的场景。
- 随着虚拟内存机制成为主流,这个字段的功能完全被联合体中的
VirtualSize替代——VirtualSize用来表示节在虚拟内存中的实际大小(包含未初始化的.bss类数据),是现代系统加载器唯一会读取的联合体成员。
历史使用情况
- 该字段仅在早期的DOS扩展程序(比如依赖DOS Extender的16/32位混合程序)中被实际使用,当时系统尚未完全普及虚拟内存,程序需要直接管理物理内存布局,PhysicalAddress会被用来告知加载器节在物理内存中的位置。
- 从Windows NT及后续的现代Windows系统开始,虚拟内存模型完全取代了物理内存直接访问的方式,系统PE加载器彻底忽略PhysicalAddress字段,它仅作为PE格式的兼容性保留项存在,没有实际作用。
相关示例
- 早期的DOS扩展程序编译时,链接器会将PhysicalAddress设置为节在物理内存中的起始偏移,比如一个数据节的PhysicalAddress可能被设为
0x1000,表示该节加载到物理内存的0x1000位置。 - 现代编译工具(如MSVC的link.exe)默认只会赋值
VirtualSize,PhysicalAddress会被留空或设为与VirtualSize相同的值;如果用PE编辑工具(如LordPE)手动修改PhysicalAddress,现代系统加载器也不会读取这个值,对程序运行没有任何影响。
内容的提问来源于stack exchange,提问作者Jet Tang
相关产品推荐
相关产品推荐

