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感谢这些要点,但我不知道