x86基本运行模式和内存模型

个人理解所谓的Intel x86架构其实就是Intel 64和IA-32架构的总称。

IA-32架构支持三种基本的运行模式,每种模式下可执行的指令和可用的功能可能不一样:

  1. 保护模式(Protected Mode)。这是最常见的模式,这是一个受保护的并且支持多任务的环境。之所以受保护是因为在这个模式下,能够对内存及一些外围设备提供硬件级别的保护设置,如分段机制,分页机制。大部分OS都运行在这个模式下。

  2. 实地址模式(Read-address mode)。这个运行模式是为了兼容8086处理器,通常处理器上电后会处于这个模式,在实地址模式中,寻址空间只有1MB,CS、DS等称作Segment register,即段的基地址直接是Segment register的值向左移4位。在保护模式下,CS、DS等称作Segment selector,用于从GDT(Global Descriptor Table)或LDT(Local Descriptor Table)表中选择一个段描述符,基地址在段描述符内,两种情况下用法不一样,所以两者的寻址空间页差别很大。

  3. 系统管理模式(System management mode ,SMM)。这个模式提供一个跟平台相关的管理环境,比如电源管理,RAS(Reliability, Avaliability and Serviceability)功能配置或者系统安全等相关问题。这个模式下的code通常是由UEFI/BIOS提供的,对OS来说是透明的。SMM有自己独立的地址空间,OS是看不到的。处理器接收到SMI pin上的中断信号或者APIC接收到SMI中断信号的时候才会进入到SMM模式。

Intel 64结构添加了IA-32e模式,并且IA-32e模式中又有两种子模式:

  1. 兼容模式(Compatibility mode)。兼容模式顾名思义,就是向前兼容IA-32的模式,该模式允许传统的16-bit和32-bit的程序不需要重新编译就可以跑在64-bit的 OS下。

  2. 64位模式(64-bit mode)。这个模式让应用程序能够访问64位的地址,并且该模式扩展了通用处理器的宽度和数量。

为了简单起见,Intel 64的兼容模式和64位模式也可以叫做IA-32的兼容模式和64位模式。

IA-32架构的内存模型主要包括以下三种(跟分页机制没有关系):

  1. 平坦内存模型(Flat memory model)。该模型下所有的段基址都是0,相当于没有使用到分段机制。

  2. 分段内存模型(Segmented memory mode)。内存的线性地址由段选择寄存器(CS、DS、ES或SS等所包含的内容是Segment Selector而不是Segment register)所指向的段描述符提供的段基地址加上偏移量计算得出。这个过程就是logic address到linear address的转换。采用分段机制的目的就是为了将不同的数据隔离开来,防止数据混到一起从而提高系统的可靠性

  3. 实地址模式内存模型(Read-address mode memory model)。这个模式是为了兼容8086处理器,从而能否跑那些为8086处理器写的程序。CS,DS等寄存器称作Segment register,而不是Segment Selector,该寄存器的值本身就包含段的基地址。在这个模式下,每个段的大小只有64KB,并且地址空间只有1MB。

不同的运行模式和内存模式的关系如下:

  1. 保护模式。以上三种内存模型都可以使用,实模式内存模型通常是用在virtual-8086模式。当运行多任务的时候,每种任务可以采用不同的内存模型。

  2. 实地址模式。该模式下只能采用实地址模式内存模型。

  3. 系统管理模式。该模式会切换到SMRAM中,所采用的内存模型类似于实地址模式内存模型。

  4. 兼容模式。该模式采用的内存模型应该跟32-bit的保护模式一样。

  5. 64-bit模式。该模式下分段机制通常不使用,通常采用平坦内存模型,即所有的段基地址都为0,并且段的上限都为最大值。

没想到Intel 64架构竟然还兼容8086处理器,可见Intel x86 CPU为了兼容性背负了多大的历史包袱,这也导致Intel x86 CPU的复杂度大大提升。

同时也欢迎关注同名微信公众号“河马虚拟化”第一时间获取最新文章

猜你喜欢

转载自blog.csdn.net/lindahui2008/article/details/81323587