AMD简单读书笔记2
目录
操作模式(也就是机器模式)
长模式
64 位模式(长模式的一个子模式)
兼容模式
经典模式(Legacy Mode)
操作模式(也就是机器模式)
我们在上一章节的时候已经一睹芳容,得知到了几个经典的模式。现在,我们就来进一步的学习这些模式。
长模式
这个模式是经典保护模式的一次扩展。长模式由两个子模式组成:64 位模式和兼容模式。64 位模式支持 AMD64 架构的所有功能和寄存器扩展。兼容模式支持与现有 16 位和 32 位应用程序的二进制兼容性。长模式不支持传统实模式或传统虚拟 8086 模式,也不支持硬件任务切换。换而言之,则是舍弃了对几个最经典的模式的兼容性来换取一定的轻便
64 位模式(长模式的一个子模式)
64 位模式(长模式的子模式)支持全部 64 位虚拟寻址和寄存器扩展功能。此模式由操作系统基于单个代码段启用。由于 64 位模式支持 64 位虚拟地址空间,因此它需要 64 位操作系统和工具链。现有应用程序二进制文件可以在兼容模式下运行,无需重新编译,在以 64 位模式运行的操作系统下,或者应用程序也可以重新编译以在 64 位模式下运行。寻址功能包括 64 位指令指针 (RIP) 和 RIP 相对数据寻址模式。此模式通过仅支持平面地址空间(具有单一代码、数据和堆栈空间)来适应现代操作系统。寄存器扩展。64 位模式通过一组指令前缀(称为 REX 前缀)实现寄存器扩展。这些扩展添加了八个 GPR(R8–R15),将所有 GPR 扩展为 64 位,并添加了八个 YMM/XMM 寄存器(YMM/XMM8–15)。REX 指令前缀还提供了字节寄存器功能,使十六个 GPR 中的任何一个的低字节都可用于字节操作。这会产生一组统一的字节、字、双字和四字寄存器,更适合编译器寄存器分配。
64 位地址和操作数。在 64 位模式下,默认虚拟地址大小为 64 位(实现可以更少)。大多数指令的默认操作数大小为 32 位。对于大多数令,可以使用指令前缀逐条覆盖这些默认值。REX 前缀指定 64 位操作数大小和寄存器扩展。RIP 相对数据寻址。64 位模式支持相对于 64 位指令指针 (RIP) 的数据寻址。旧式 x86 架构仅在控制传输指令中支持 IP 相对寻址。RIP 相对寻址提高了位置无关代码和寻址全局数据的代码的效率。
兼容模式
兼容模式(长模式的第二个子模式)允许 64 位操作系统运行现有的 16 位和 32 位 x86 应用程序。这些旧式应用程序在兼容模式下运行,无需重新编译。在兼容模式下运行的应用程序使用 32 位或 16 位寻址,并且可以访问前 4GB 虚拟地址空间。传统 x86 指令前缀在 16 位和 32 位地址和操作数大小之间切换。与 64 位模式一样,兼容模式由操作系统根据单个代码段启用。但是,与 64 位模式不同,x86 分段功能与传统 x86 架构相同,使用 16 位或 32 位保护模式语义。从应用程序的角度来看,兼容模式看起来像传统的 x86 保护模式环境。但是,从操作系统的角度来看,地址转换、中断和异常处理以及系统数据结构使用 64 位长模式机制。
经典模式(Legacy Mode)
经典模式不仅保留了与现有 16 位和 32 位应用程序的二进制兼容性,还保留了与现有 16 位和 32 位操作系统的二进制兼容性。传统模式由以下三种子模式组成:
-
保护模式 - 保护模式支持具有内存分段、可选分页和权限检查的 16 位和 32 位程序。在保护模式下运行的程序可以访问最多 4GB 的内存空间。
-
虚拟 8086 模式 - 虚拟 8086 模式支持在保护模式下作为任务运行的 16 位实模式程序。它使用简单形式的内存分段、可选分页和有限的保护检查。在虚拟 8086 模式下运行的程序可以访问最多 1MB 的内存空间。
-
实模式 - 实模式支持使用简单的基于寄存器的内存分段的 16 位程序。它不支持分页或保护检查。在实模式下运行的程序可以访问最多 1MB 的内存空间。