如果有一天: 你不再寻找爱情,只是去爱;你不再渴望成功,只是去做;你不再追求成长,只是去修;一切才真正开始! —— 纪伯伦

时间:2024-11-07 07:56:14
[汇编语言]编译后的段地址是什么性质的地址?内存地址吗?

shaohui973: 我的理解:编出来的二进制文件中显式的指令地址是属于段内偏移地址,当被加载到内存后,cpu根据设置的GDTR,LDTR寄存器,拿到配置好的段基地址(linux下所有段的基地址都是0),然后取二进制中的偏移地址,合成线性地址,最后进行页映射,转换为物理地址。 对于不同的bin文件,虽然有相同的"偏移地址",但是,他们是被不同的进程装载和使用的,所以载页地址映射到物理地址时是不同的(取决于程序被加载到的物理内存的地址)。 比如,在偏移地址0xa处有指令mov,在偏移地址0xa处有指令add。当运行时,其被加载到物理内存0x9999, 而运行时被加载到物理内存0x8888。对于运行时,mov指令对应的段地址为0x0:0xa,这个就被当作线性地址0xa,然后页映射时,这个地址被映射到内存0x9999+0xa;而同样的,运行时add指令对应的段地址为0x0:0xa,这个就是它的线性地址0xa,虽然这个线性地址和的mov指令的线性地址一样,但是由于他们属不同的进程,被加载到不同的物理内存位置,故页映射是不同的,这里的add指令被映射到0x8888+0xa地址处。