Compilation 何时创建逻辑地址?

Compilation 何时创建逻辑地址?,compilation,x86,operating-system,virtual-memory,Compilation,X86,Operating System,Virtual Memory,我总是提到x86(Linux) 在生成二进制文件的过程中是否创建了逻辑地址 如果是,它们是否在二进制文件中 感谢x86中的逻辑地址(也称为远指针)由16位段选择器和16/32/64位偏移量(也称为近指针)组成。偏移量的大小取决于操作模式、代码段描述符和地址大小前缀。然后,段选择器用于获取要添加到偏移量以形成虚拟地址的段基址(或从段描述符缓存中获取,除非在64位模式下运行,在该模式下,除FS和GS外,所有段的基址均视为零)。x86 ISA无法完全跳过这一过程。因此,任何x86指令都必须分别指定

我总是提到x86(Linux)

  • 在生成二进制文件的过程中是否创建了逻辑地址
  • 如果是,它们是否在二进制文件中
感谢x86中的逻辑地址(也称为远指针)由16位段选择器和16/32/64位偏移量(也称为近指针)组成。偏移量的大小取决于操作模式、代码段描述符和地址大小前缀。然后,段选择器用于获取要添加到偏移量以形成虚拟地址的段基址(或从段描述符缓存中获取,除非在64位模式下运行,在该模式下,除FS和GS外,所有段的基址均视为零)。x86 ISA无法完全跳过这一过程。因此,任何x86指令都必须分别指定构成逻辑地址的两部分(隐式或显式)

在生成二进制文件的过程中是否创建了逻辑地址

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

如果是,它们是否在二进制文件中

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

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

在生成二进制文件的过程中是否创建了逻辑地址

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

如果是,它们是否在二进制文件中


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

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

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

你问题的答案是什么

在生成二进制文件的过程中是否创建了逻辑地址


然后取决于您是指在定义逻辑地址空间(链接器)时“创建”还是指在设置逻辑地址空间时(程序加载器)。

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

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

你问题的答案是什么

在生成二进制文件的过程中是否创建了逻辑地址


然后取决于您是指在定义逻辑地址空间(链接器)时“创建”还是指在设置逻辑地址空间时(程序加载器)。

我认为OP只是指虚拟地址,而不是x86线性地址。此外,他们还询问了Linux,它使用的是base=0的平面内存模型。无需使用x86分段将事情过度复杂化。因此,任何x86指令都必须分别指定构成逻辑地址的两部分。这有点误导,因为段部分通常是隐式的,与ARM或指令格式中的任何内容相比基本上没有开销。此外,段寄存器中的段选择器值仅在首次写入时用于更新缓存的描述符信息。更新所选的GDT/LDT条目后,您必须重新加载
ds
。@PeterCordes我基本同意。我已经逐字逐句地解释了这个问题。除了用于线程本地存储的FS和GS之外,内存模型是扁平的。当我说“x86指令m