X86 内存地址转换如何涉及段寄存器?

X86 内存地址转换如何涉及段寄存器?,x86,x86-64,intel,cpu-registers,memory-segmentation,X86,X86 64,Intel,Cpu Registers,Memory Segmentation,到目前为止,我所学到的关于细分的知识: 虚拟地址包含段选择器和偏移量 段选择器与GDTR一起用于查找段描述符的线性地址 段描述符包含有关所选段的信息,包括其线性地址 因此,我的问题是: 根据我读到的内容,虚拟地址被加载到段寄存器中,然后不知何故,从那里继续翻译。虚拟地址加载到段寄存器中以获取描述符后,段寄存器会发生什么情况 据我所知,段寄存器还保存描述符的缓存值。这是如何在翻译过程中发挥作用的 如果一个段选择器最多可以有2^13个不同的值,并且只有六个主寄存器,那么系统如何确定加载哪个段寄

到目前为止,我所学到的关于细分的知识:

  • 虚拟地址包含段选择器和偏移量
  • 段选择器与GDTR一起用于查找段描述符的线性地址
  • 段描述符包含有关所选段的信息,包括其线性地址
因此,我的问题是:

  • 根据我读到的内容,虚拟地址被加载到段寄存器中,然后不知何故,从那里继续翻译。虚拟地址加载到段寄存器中以获取描述符后,段寄存器会发生什么情况

  • 据我所知,段寄存器还保存描述符的缓存值。这是如何在翻译过程中发挥作用的

  • 如果一个段选择器最多可以有2^13个不同的值,并且只有六个主寄存器,那么系统如何确定加载哪个段寄存器


    • 通常的翻译如下:

       Logical address   -->   GDT -->  Linear address          --> Page tables --> Physical Address
      (segment:offset)                 (segment base + offset)         
      
      \______________________________________________________/ 
                        Virtual address                                     
                   (can be either logical or linear)
      
      如果在VMX非根模式下运行(即在VM中),并且启用了EPT,则:

       Logical address   -->   GDT -->  Linear address          --> Page tables --> Guest Physical Address --> EPT --> (System) Physical Address
      (segment:offset)                 (segment base + offset)         
      
      \______________________________________________________/                      \__________________________________________________________/
                        Virtual address                                                        Physical address
                   (can be either logical or linear)
      
      如果存在IOMMU(如伞形技术VT-d):

      MMIO甚至可以执行来宾虚拟地址或来宾物理地址的转换(其目的之一是将应用程序的虚拟地址具体化为硬件,并简化转换过程中遇到的大量地址空间的管理)

      注意如前所述,术语“虚拟地址”在英特尔和AMD手册中仅表示线性地址。
      我发现将逻辑地址和线性地址都标记为虚拟地址更有用,因为它们在页面转换步骤之前


      段寄存器包含一个段选择器,该段选择器对用于执行安全检查的段描述符进行索引,并获取与逻辑地址偏移部分相加的段基址。
      在那之后,一切都结束了

      在指令级指定的每个地址都是逻辑地址-需要查找段描述符。
      为了避免每次指令访问内存时都从内存中读取它,CPU会缓存它——否则这将是性能杀手

      操作系统根据需要设置段寄存器,但它很少需要超过四个段

      分段(PM)的主要目的是通过为每个程序定义非重叠段来实现过程隔离。
      一个程序通常只需要一个堆栈段、一个数据段和一个代码段——另外三个用于避免在段最大大小为64KiB时保存/恢复数据段(读取:实模式。
      fs
      gs
      后来添加)

      如今,操作系统使用平面模型,其中只有两个段(代码和数据/堆栈-这是一种简化,需要其他段)包含整个地址空间,以及操作系统特定的段,如TLS或PEB/TEB。

      因此,六段寄存器甚至比需要的还要多,GDT的8192个条目在需要的情况下(如果是偶数)就在那里。

      通常的翻译如下:

       Logical address   -->   GDT -->  Linear address          --> Page tables --> Physical Address
      (segment:offset)                 (segment base + offset)         
      
      \______________________________________________________/ 
                        Virtual address                                     
                   (can be either logical or linear)
      
      如果在VMX非根模式下运行(即在VM中),并且启用了EPT,则:

       Logical address   -->   GDT -->  Linear address          --> Page tables --> Guest Physical Address --> EPT --> (System) Physical Address
      (segment:offset)                 (segment base + offset)         
      
      \______________________________________________________/                      \__________________________________________________________/
                        Virtual address                                                        Physical address
                   (can be either logical or linear)
      
      如果存在IOMMU(如伞形技术VT-d):

      MMIO甚至可以执行来宾虚拟地址或来宾物理地址的转换(其目的之一是将应用程序的虚拟地址具体化为硬件,并简化转换过程中遇到的大量地址空间的管理)

      注意如前所述,术语“虚拟地址”在英特尔和AMD手册中仅表示线性地址。
      我发现将逻辑地址和线性地址都标记为虚拟地址更有用,因为它们在页面转换步骤之前


      段寄存器包含一个段选择器,该段选择器对用于执行安全检查的段描述符进行索引,并获取与逻辑地址偏移部分相加的段基址。
      在那之后,一切都结束了

      在指令级指定的每个地址都是逻辑地址-需要查找段描述符。
      为了避免每次指令访问内存时都从内存中读取它,CPU会缓存它——否则这将是性能杀手

      操作系统根据需要设置段寄存器,但它很少需要超过四个段

      分段(PM)的主要目的是通过为每个程序定义非重叠段来实现过程隔离。
      一个程序通常只需要一个堆栈段、一个数据段和一个代码段——另外三个用于避免在段最大大小为64KiB时保存/恢复数据段(读取:实模式。
      fs
      gs
      后来添加)

      如今,操作系统使用平面模型,其中只有两个段(代码和数据/堆栈-这是一种简化,需要其他段)包含整个地址空间,以及操作系统特定的段,如TLS或PEB/TEB。

      因此,六段寄存器甚至比需要的还要多,GDT的8192个条目在需要时(如果是偶数)就在那里。

      地址转换过程取决于所需的寄存器。访问段描述符缓存而不是GDT。分段单元是MMU的一部分。我想你指的是寻呼装置。英特尔在其手册中没有使用“虚拟地址”一词,但AMD将其用作线性地址的同义词。进程隔离不一定是通过使段不重叠来实现的,而是通过每个段描述符具有保护属性来实现的。@HadiBrais感谢这些要点,但我不知道