何时创建逻辑地址?

问题描述 投票:0回答:2

我总是指x86(Linux)

  • 是否在生成二进制文件时创建了逻辑地址?
  • 如果是的话,他们在二进制文件里面吗?

谢谢

compilation x86 operating-system virtual-memory
2个回答
1
投票

LINKER定义了进程用户地址空间的初始布局。然后,链接器定义逻辑地址的范围及其页面属性(读取或读取/写入,执行或不执行)。

运行可执行文件时,程序加载器会设置逻辑地址空间的用户区域。

你的问题的答案

是否在生成二进制文件时创建了逻辑地址?

那么取决于你的意思是“创建”是在定义逻辑地址空间(链接器)时,还是指你何时设置它(程序加载器)。


1
投票

在x86中,逻辑地址(也称为远指针)由16位段选择器和16/32/64位偏移(也称为近指针)组成。偏移的大小取决于操作模式,代码段描述符和地址大小前缀。然后,段选择器用于获取段基址(或者从段描述符高速缓存获得,除非在64位模式下操作,其中基本地址被认为对于除FS和GS之外的所有段都为零)添加到偏移量以形成虚拟地址。 x86 ISA无法完全跳过该过程。因此,任何x86指令都必须分别指定构成逻辑地址的两个部分(隐式或显式)。

是否在生成二进制文件时创建了逻辑地址?

x86二进制文件包含x86指令。每条指令指定使用哪个段寄存器以及如何计算偏移量(使用基数,索引,比例和位移等内容)。在运行时,当正在执行指令时,计算偏移量并确定段选择器值。因此,从技术上讲,x86指令只告诉CPU从哪里获取段选择器以及如何计算偏移量,但是CPU是生成逻辑地址的。通常,编译器和OS确定偏移的值,但只有OS控制段选择器的值。

如果是的话,他们在二进制文件里面吗?

x86指令可以将偏移量指定为立即值(常量)。段部分可以指定为立即值(远程调用或var跳转),从段寄存器中取出,或从内存中取出(远程返回)。因此,偏移量的值可能在使用它的指令编码的二进制文件中,但段选择器的值可能不是。

© www.soinside.com 2019 - 2024. All rights reserved.