【发布时间】:2018-10-02 21:04:19
【问题描述】:
我总是指 x86 (Linux)
- 在生成二进制文件期间是否创建了逻辑地址?
- 如果是,它们是否在二进制文件中?
谢谢
【问题讨论】:
标签: compilation x86 operating-system virtual-memory
我总是指 x86 (Linux)
谢谢
【问题讨论】:
标签: compilation x86 operating-system virtual-memory
在 x86 中,逻辑地址(也称为远指针)由 16 位段选择器和 16/32/64 位偏移量(也称为近指针)组成。偏移量的大小取决于操作模式、代码段描述符和地址大小前缀。然后段选择器用于获取段基地址(或者它是从段描述符缓存中获得的,除非在 64 位模式下运行,其中除了 FS 和 GS 之外的所有段的基地址都被认为为零)为添加到偏移量以形成虚拟地址。 x86 ISA 无法完全跳过该过程。所以任何 x86 指令都必须分别(隐式或显式)指定构成逻辑地址的两部分。
在生成二进制文件期间是否创建了逻辑地址?
x86 二进制文件包含 x86 指令。每条指令都指定使用哪个段寄存器以及如何计算偏移量(使用诸如基数、索引、比例和位移之类的东西)。在运行时,当一条指令正在执行时,会计算偏移量并确定段选择器值。因此,从技术上讲,x86 指令只告诉 CPU 从哪里获取段选择器以及如何计算偏移量,但生成逻辑地址的是 CPU。通常,编译器和操作系统确定偏移量的值,但只有操作系统控制段选择器的值。
如果是,它们是否在二进制文件中?
x86 指令可以将偏移量指定为立即值(常量)。段部分可以指定为立即值(远调用或 var 跳转),从段寄存器中获取,或从内存中获取(远返回)。所以偏移量的值可能是使用它的指令编码的二进制,但是段选择器的值可能不是。
【讨论】:
ds。
LINKER 定义进程用户地址空间的初始布局。然后链接器定义逻辑地址的范围和它们的页面属性(读或读/写,执行或不执行)。
逻辑地址空间的用户区在可执行文件运行时由程序加载器设置。
你的问题的答案
在生成二进制文件期间是否创建了逻辑地址?
然后取决于您的意思是“创建”是在定义逻辑地址空间时(链接器)还是您的意思是在设置时(程序加载器)。
【讨论】: