购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

2.3 x64架构的工作模式

2.3.1 x86处理器的工作模式

在《x86汇编语言:从实模式到保护模式》这本书中,我们学的是IA-32架构,IA-32架构的处理器支持三种工作模式,分别是实地址模式(也叫8086模式)、保护模式和系统管理模式。实地址模式和保护模式我们已经讲过了,你应该比较熟悉,这里不多说。

系统管理模式我们没有讲过,但是也不准备多讲。不讲的原因是,对于我写这两本书的目的来说,大家并不需要了解它。在这里我们可以简单地介绍一下:处理器有一个引脚叫作SMI#,用来接收一个低电平有效的系统管理模式中断信号。通过给这个引脚发送一个低电平,不管处理器当前位于什么工作模式,在执行什么代码,都会保存当前的执行状态并进入一个分离的、独立的地址空间执行。典型地,它用来执行一个特殊的操作系统或者特殊的代码,以实现特殊的目的,比如电源管理和系统安全管理。从系统管理模式退出之后,处理器恢复之前被中断的状态并继续执行原来的程序和任务,这一切都是透明的,甚至不会感知到这个过程的存在。

再来看x64架构,x64架构的处理器兼容IA-32架构,所以支持实地址模式,可以运行很早以前的16位操作系统和应用程序,此时它就是一个非常快速的8086处理器。

x64架构的处理器也支持保护模式,可以运行32位的操作系统和应用程序。比如说,可以运行32位的Windows或者Linux操作系统,并在这些操作系统上运行32位的应用程序。此时,它就是一个非常快速的32位处理器。

当然,x64架构的处理器还支持系统管理模式。

对于x64架构来说,实地址模式和保护模式统称为传统模式。

既然是新的架构,x64引入了自己独有的工作模式,AMD公司称之为长模式(Long Mode),INTEL公司称之为IA-32e模式(即IA-32增强模式)。在这种工作模式下,可以发挥64位处理器的优势,比如可以使用64位的线性地址,可以使用64位的寄存器,以及其他一些新增的强大功能。现在市面上那些基于x86处理器的64位操作系统,比如64位的Windows和Linux,都工作在这种模式下。

在x64架构的处理器上,可以安装并运行传统的16位操作系统,并在这些操作系统上运行传统的16位应用程序。对于这些老的16位操作系统来说,它们以为处理器还是16位处理器,比如8686和80286。为了支持传统的16位操作系统和应用程序,64位处理器必须依然支持实地址模式和16位保护模式,以及16位的寄存器等基础硬件。

在x64架构的处理器上,还可以安装并运行传统的32位操作系统,比如32位的Windows和Linux,并在这些操作系统上运行传统的16位或者32位应用程序。对于这些老的32位操作系统来说,它们以为处理器还是32位处理器。为了支持传统的32位操作系统和16位、32位应用程序,64位处理器必须依然支持32位时代的保护模式,以及32位处理器的段寄存器、通用寄存器、描述符等基础硬件和基础数据结构。

2.3.2 IA-32e模式及其子模式

x64架构的处理器毕竟是64位的处理器,所以还可以安装并运行64位的操作系统,比如时下流行的最新版Windows和Linux,而这些操作系统可以执行64位的应用程序。但是,如果64位的新操作系统不能运行传统的保护模式程序,就不那么完美了。

请想象一下,如果你安装了一个新版的Windows,它是64位的,只能运行新推出的64位应用程序而不能运行以前的老程序,要运行这些老程序,你还得重新安装一个32位的操作系统,你会有多愤怒、多失望。这个问题很重要,我们前面所说的INTEL安腾架构就是缺乏这种兼容性而导致了失败。

好在x64架构的处理器解决了这个问题。如果安装了64位的操作系统,则我们既可以在这个操作系统上运行64位的应用程序,也可以运行传统的16或者32位应用程序。那么,这是怎么办到的呢?这并不完全是操作系统的功劳,处理器的支持尤为重要。

当初开发x64架构就是为了能够兼容以前的IA-32架构。所以IA-32e模式包含了两种子模式,它们是兼容模式和64位模式。

兼容模式类似于32位保护模式,允许多数16位或者32位程序不用重新修改和编译就可以直接运行在64位操作系统上,除了那些使用硬件任务切换的程序和工作在虚拟8086模式的程序。在IA-32e模式下,不支持硬件任务切换,也不支持虚拟8086模式。

一句话:传统模式相互之间不能共存,也不能和IA-32e模式共存,而IA-32e模式可以让保护模式和64位模式共存,并且无缝切换。

64位模式用来运行64位的操作系统和应用程序。相对于传统的保护模式,这种模式有很多新特点,而且这种模式也是我们这本书的重点。

那么,作为IA-32e模式的两个子模式,它们是如何并存的呢?如图2-2所示,计算机启动后,处理器需要从实地址模式进入保护模式,再从保护模式进入并激活IA-32e模式。我们知道,无论什么时候处理器总是在一个代码段内执行。所以,激活之后,它当前正在执行的那个代码段的描述符决定了它可能位于哪个子模式。

图2-2 IA-32e模式下的子模式切换

如果代码段描述符的L位是0,则按兼容模式执行,典型地,执行的是16位或者32位的保护模式代码;如果代码段描述符的L位是1,则按64位模式执行,典型地,执行的是64位代码。

无论是执行保护模式程序,还是执行64位程序,如果因任务切换等原因,导致处理器转到新的代码段执行,则继续根据代码段描述符的L位来决定是按哪种模式执行。

从本章一开始到现在,你也学了不少知识,掌握了不少概念。下面的是非判断题用来检验你是否真的搞清了我讲的内容(答案去www.lizhongc.com中寻):

(1)未开启分页时,线性地址就是物理地址。( )

(2)如果段的基地址为0,则有效地址等于线性地址。( )

(3)开启分页后,线性地址是虚拟地址,对应于虚拟内存空间里的某个位置。( )

(4)实地址模式属于传统模式。( )

(5)保护模式只能在IA-32架构的处理器上执行。( )

(6)x64架构也支持保护模式。( )

(7)保护模式是IA-32e模式的子模式。( )

(8)传统模式不包括64位模式。( )

(9)IA-32e模式包括保护模式和64位模式。( )

(10)IA-32e模式和Long mode在本质上是同一种模式。( )

(11)当我们说“兼容模式”时,也意味着处于IA-32e模式。( )

(12)x64架构的保护模式相当于将处理器看成是传统的32位处理器;兼容模式相当于是将处理器看成是64位处理器,但是按照保护模式来执行(但不支持硬件任务切换和虚拟8086模式)。( ) fuZewRIgyrzdP/XFepYvavaAAeeUOHXR8tGiDfgNFqW8odh+mRdAnpGvaEjZa+XQ

点击中间区域
呼出菜单
上一章
目录
下一章
×