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