You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 18:34:55