系统编程概述:
为系统软件开发程序员编写操作系统,加载器(loaders),连接程序(linkers),设备驱动,或者需要访问系统资源的实用程序。这些系统资源通常只有在软件运行在最高特权级(CPL=0)时才可获取。特权级和他们的交互性在第93页的"Segment-Protection Overview(段保护机制概述)"有详细的描述。
这一章节主要介绍对系统软件开发者有帮助的AMD64体系结构的基本特征和性能。这些概念包括:
1, 所支持的寻址方式和内存是怎么组织的。
2, 内存管理硬件机制怎样以不同的寻址方式访问内存。
3, 处理器的操作模式,还有内存管理硬件怎样才能支持每一个操作模式。
4, 系统控制寄存器用于管理系统资源。
5, 中断与异常机制,还有它们怎样中断程序执行并报告错误。
6, 另外,对于系统软件还有一些附加的扩展,包括基于硬件的多任务的支持,检验机制对于异常的报告,软件问题的调试,和软件性能的优化。
1.1 内存模型
AMD64体系结构内存模型设计用于允许系统软件用可靠的方式管理应用程序软件和相关的数据。内存模型是和传统内存模型提供向后兼容的。硬件转换机制是为了在虚拟内存空间和物理内存空间映射地址,这种转换机制允许系统软件直观的重置应用程序和数据,不论是物理内存空间还是系统设备驱动区域都要通过操作系统来管理。在long mode模式中,AMD64体系结构实现了一个平坦内存模型。在传统模式中,体系结构实现了所有传统的内存模型。
1.1.1 内存寻址
AMD64体系结构支持地址重定位,这样做,需要一些类型的地址来描述内存的组织。明确的,AMD64体系结构定义了4中类型的地址: 1,逻辑地址; 2,实际地址,或段偏移量,是逻辑地址的一部分; 3,线性地址,即虚拟地址;4,物理地址。
逻辑地址: 一个逻辑地址是在一个段地址中间中的一个引用,它包含段选择子和实际地址。重要的,一个逻辑地址用以下公式表达:
逻辑地址 = 段选择子 : 偏移量。
段选择子是指在全局或者局部描述符表中的一个表项。这个指定的描述符表的表项描述了在虚拟地址空间中的段的位置,及它的大小和别的特性。实际地址用作在通过选择子指定的段中的一个偏移量。逻辑地址经常涉及到远指针(far pointers,很久以前的编译器才有,现在很多编译器早已经将它优化没了)。远指针用于在软件寻址时需要明确的引用一个段(也就是从当前的段引用外部的一个段)。
实际地址: 在被引用的内存段里的一个偏移量作为一个实际地址。实际地址由把一个基地址(Base),一个比例索引(Scale x Index),和一个置换值(Displacement)相加起来形成。实际地址通过下面的公式来计算:
实际地址 = 基地址(Base) + 比例索引(Scale x Index) + 置换值(Displacement)。
上面各个形成实际地址的元素如下:
Base是存储在一个任意一般用途寄存器中的值。Scale是1,2,4,或8的一个整数。Index是存储在一个任意一般用途寄存器中的2的补码值。Displacement是一个8位,16位,或32位的2的补码值作为指令的一部分被编码。
实际地址经常涉及到近指针(near pointers,这是现在常用的,实际上除了近指针,远指针,还有巨指针)。一个近指针用于当选择子已经被隐式地指明或者当使用平坦内存模式时。
Long mode模式定义了一个64位的实际地址的长度。如果一个处理器的实现不完全支持64位虚拟地址空间,那么实际地址必须使用典型的形式(参考 典型寻址形式,Canonical Address Form ,在第4页)。
线性(虚拟)地址: 一个逻辑地址的段描述符部分是指在全局或者局部描述符表中的一个段描述符项。指定的段描述符项包含段的基地址,也就是在线性地址空间中段的起始位置。一个线性地址通过段的基地址和实际地址(段偏移量)相加形成,它创建一个到所支持的线性地址空间之内的任何字节的引用。线性地址经常涉及到虚拟地址,这俩个术语通常指的就是同一个意思。它们由下面的公式计算而来:
线性地址(Linear Address) = 段基地址(Segment Base Address) + 实际地址(Effective Address)。
当使用平坦内存模式时--也就是在64位模式中--一个段的基地址被作为0来对待。在这种情况下,线性地址和实际地址是完全相同的。在Long mode模式中,线性地址必须使用典型的寻址形式。
物理地址: 一个物理地址是对物理地址空间中的一个引用,典型的就是主存。物理地址是通过从虚拟地址空间中使用页转换机制来转换的。这本书的第7页讲述分页机制怎么用于虚拟地址向物理地址的转换。如果这个分页机制没有启用时,虚拟(线性)地址就被作为物理地址来使用。
1.1.2 内存组织
AMD64体系结构对于虚拟内存和物理内存组织内存。虚拟内存空间和物理内存空间在大小上可以不相等(这是最常见的)。通常情况下,虚拟地址空间要比物理地址空间大很多。系统软件在系统硬盘和物理内存之间迁移应用程序和数据从而出现的有效内存要比真实存在的多得多。然后系统软件使用硬件上的内存管理机制去把大的虚拟地址空间映射进小的物理地址空间。
虚拟内存: 软件使用虚拟地址访问在虚拟内存空间中的位置。系统软件负责使用段内存管理机制来管理在虚拟内存上的应用程序和数据的迁移。系统软件也负责使用页转换机制来把虚拟内存映射到物理内存地址。AMD64体系结构使用下面的地址转换模式支持不同大小的虚拟内存:
1, 保护模式 -- 这个模式支持4GB的虚拟地址空间使用32位的虚拟地址。
2, Long mode模式 -- 这个模式支持16EB的虚拟地址空间使用64位虚拟地址。
物理内存: 物理地址用于直接访问主存。对于一些特殊的计算机系统,有效的物理地址空间的大小和安装在系统的主存的总量是相等的。物理内存的最大的总量依赖于处理器的实现和地址转换模式。AMD64体系结构支持使用下面的地址转换模式改变物理内存的大小:
实际地址模式: 这个模式也叫做实模式,支持1MB的物理地址空间使用20位的物理地址。地址转换模式在第10页的"实际地址(Real Addressing)"上有描述。实模式只有在传统模式中才有效。
传统保护模式: 这个模式支持一些不同的地址空间大小,依赖于所使用的转换机制和那些机制是否已被启用。传统保护模式支持4GB的物理地址空间使用32位的物理地址。当处理器运行在传统保护模式时,段转换机制和页转换机制都能够被用于访问物理地址空间。
当物理地址大小扩展被启用,页转换机制能够被扩充到支持52位的物理地址。52位物理地址允许达到支持4PB的物理地址空间(当前,在这个模式中AMD64体系结构支持40位的寻址,允许达到支持1TB的物理地址空间。)。
LongMode模式: 这个模式是AMD64所特有的一个模式。这个模式支持最大4PB的物理地址空间使用52位物理地址。Long Mode模式需要使用页转换机制和物理地址大小扩展(PAE)机制。
1.1.3 典型寻址方式 (Canonical Address Form)
Long mode定义了64位的虚拟地址空间,但是处理器的实现能支持的较少。尽管一些处理器的实现不全部使用64位的虚拟地址,它们检查从已经实现的最高有效位到第63位(从0开始),观察是否那些位全部是0或者全部是1。一个遵循这种性质的地址就用了典型寻址方式。在大多数情境下,一个虚拟内存引用没有使用典型寻址方式会导致引发一个普通保护异常(#GP)。然而,栈隐式的引用栈地址时没有用典型的寻址方式会导致引发一个堆栈异常(#SS)。隐式的栈引用包含所有的压栈(push)和弹栈(pop)指令,并且任何指令使用RSP或者RBP作为一个基本寄存器。
通过检验典型寻址方式,AMD64体系结构防止软件开拓利用未实现的指针的高位作为别的目的。软件遵循在在一个特有的处理器的实现上使用典型寻址方式为了不需要做任何的修改就能运行在long-mode模式上实现支持更大的虚拟地址空间。
系统编程概述:
为系统软件开发程序员编写操作系统,加载器(loaders),连接程序(linkers),设备驱动,或者需要访问系统资源的实用程序。这些系统资源通常只有在软件运行在最高特权级(CPL=0)时才可获取。特权级和他们的交互性在第93页的"Segment-Protection Overview(段保护机制概述)"有详细的描述。
这一章节主要介绍对系统软件开发者有帮助的AMD64体系结构的基本特征和性能。这些概念包括:
1, 所支持的寻址方式和内存是怎么组织的。
2, 内存管理硬件机制怎样以不同的寻址方式访问内存。
3, 处理器的操作模式,还有内存管理硬件怎样才能支持每一个操作模式。
4, 系统控制寄存器用于管理系统资源。
5, 中断与异常机制,还有它们怎样中断程序执行并报告错误。
6, 另外,对于系统软件还有一些附加的扩展,包括基于硬件的多任务的支持,检验机制对于异常的报告,软件问题的调试,和软件性能的优化。
1.1 内存模型
AMD64体系结构内存模型设计用于允许系统软件用可靠的方式管理应用程序软件和相关的数据。内存模型是和传统内存模型提供向后兼容的。硬件转换机制是为了在虚拟内存空间和物理内存空间映射地址,这种转换机制允许系统软件直观的重置应用程序和数据,不论是物理内存空间还是系统设备驱动区域都要通过操作系统来管理。在long mode模式中,AMD64体系结构实现了一个平坦内存模型。在传统模式中,体系结构实现了所有传统的内存模型。
1.1.1 内存寻址
AMD64体系结构支持地址重定位,这样做,需要一些类型的地址来描述内存的组织。明确的,AMD64体系结构定义了4中类型的地址: 1,逻辑地址; 2,实际地址,或段偏移量,是逻辑地址的一部分; 3,线性地址,即虚拟地址;4,物理地址。
逻辑地址: 一个逻辑地址是在一个段地址中间中的一个引用,它包含段选择子和实际地址。重要的,一个逻辑地址用以下公式表达:
逻辑地址 = 段选择子 : 偏移量。
段选择子是指在全局或者局部描述符表中的一个表项。这个指定的描述符表的表项描述了在虚拟地址空间中的段的位置,及它的大小和别的特性。实际地址用作在通过选择子指定的段中的一个偏移量。逻辑地址经常涉及到远指针(far pointers,很久以前的编译器才有,现在很多编译器早已经将它优化没了)。远指针用于在软件寻址时需要明确的引用一个段(也就是从当前的段引用外部的一个段)。
实际地址: 在被引用的内存段里的一个偏移量作为一个实际地址。实际地址由把一个基地址(Base),一个比例索引(Scale x Index),和一个置换值(Displacement)相加起来形成。实际地址通过下面的公式来计算:
实际地址 = 基地址(Base) + 比例索引(Scale x Index) + 置换值(Displacement)。
上面各个形成实际地址的元素如下:
Base是存储在一个任意一般用途寄存器中的值。Scale是1,2,4,或8的一个整数。Index是存储在一个任意一般用途寄存器中的2的补码值。Displacement是一个8位,16位,或32位的2的补码值作为指令的一部分被编码。
实际地址经常涉及到近指针(near pointers,这是现在常用的,实际上除了近指针,远指针,还有巨指针)。一个近指针用于当选择子已经被隐式地指明或者当使用平坦内存模式时。
Long mode模式定义了一个64位的实际地址的长度。如果一个处理器的实现不完全支持64位虚拟地址空间,那么实际地址必须使用典型的形式(参考 典型寻址形式,Canonical Address Form ,在第4页)。
线性(虚拟)地址: 一个逻辑地址的段描述符部分是指在全局或者局部描述符表中的一个段描述符项。指定的段描述符项包含段的基地址,也就是在线性地址空间中段的起始位置。一个线性地址通过段的基地址和实际地址(段偏移量)相加形成,它创建一个到所支持的线性地址空间之内的任何字节的引用。线性地址经常涉及到虚拟地址,这俩个术语通常指的就是同一个意思。它们由下面的公式计算而来:
线性地址(Linear Address) = 段基地址(Segment Base Address) + 实际地址(Effective Address)。
当使用平坦内存模式时--也就是在64位模式中--一个段的基地址被作为0来对待。在这种情况下,线性地址和实际地址是完全相同的。在Long mode模式中,线性地址必须使用典型的寻址形式。
物理地址: 一个物理地址是对物理地址空间中的一个引用,典型的就是主存。物理地址是通过从虚拟地址空间中使用页转换机制来转换的。这本书的第7页讲述分页机制怎么用于虚拟地址向物理地址的转换。如果这个分页机制没有启用时,虚拟(线性)地址就被作为物理地址来使用。
1.1.2 内存组织
AMD64体系结构对于虚拟内存和物理内存组织内存。虚拟内存空间和物理内存空间在大小上可以不相等(这是最常见的)。通常情况下,虚拟地址空间要比物理地址空间大很多。系统软件在系统硬盘和物理内存之间迁移应用程序和数据从而出现的有效内存要比真实存在的多得多。然后系统软件使用硬件上的内存管理机制去把大的虚拟地址空间映射进小的物理地址空间。
虚拟内存: 软件使用虚拟地址访问在虚拟内存空间中的位置。系统软件负责使用段内存管理机制来管理在虚拟内存上的应用程序和数据的迁移。系统软件也负责使用页转换机制来把虚拟内存映射到物理内存地址。AMD64体系结构使用下面的地址转换模式支持不同大小的虚拟内存:
1, 保护模式 -- 这个模式支持4GB的虚拟地址空间使用32位的虚拟地址。
2, Long mode模式 -- 这个模式支持16EB的虚拟地址空间使用64位虚拟地址。
物理内存: 物理地址用于直接访问主存。对于一些特殊的计算机系统,有效的物理地址空间的大小和安装在系统的主存的总量是相等的。物理内存的最大的总量依赖于处理器的实现和地址转换模式。AMD64体系结构支持使用下面的地址转换模式改变物理内存的大小:
实际地址模式: 这个模式也叫做实模式,支持1MB的物理地址空间使用20位的物理地址。地址转换模式在第10页的"实际地址(Real Addressing)"上有描述。实模式只有在传统模式中才有效。
传统保护模式: 这个模式支持一些不同的地址空间大小,依赖于所使用的转换机制和那些机制是否已被启用。传统保护模式支持4GB的物理地址空间使用32位的物理地址。当处理器运行在传统保护模式时,段转换机制和页转换机制都能够被用于访问物理地址空间。
当物理地址大小扩展被启用,页转换机制能够被扩充到支持52位的物理地址。52位物理地址允许达到支持4PB的物理地址空间(当前,在这个模式中AMD64体系结构支持40位的寻址,允许达到支持1TB的物理地址空间。)。
LongMode模式: 这个模式是AMD64所特有的一个模式。这个模式支持最大4PB的物理地址空间使用52位物理地址。Long Mode模式需要使用页转换机制和物理地址大小扩展(PAE)机制。
1.1.3 典型寻址方式 (Canonical Address Form)
Long mode定义了64位的虚拟地址空间,但是处理器的实现能支持的较少。尽管一些处理器的实现不全部使用64位的虚拟地址,它们检查从已经实现的最高有效位到第63位(从0开始),观察是否那些位全部是0或者全部是1。一个遵循这种性质的地址就用了典型寻址方式。在大多数情境下,一个虚拟内存引用没有使用典型寻址方式会导致引发一个普通保护异常(#GP)。然而,栈隐式的引用栈地址时没有用典型的寻址方式会导致引发一个堆栈异常(#SS)。隐式的栈引用包含所有的压栈(push)和弹栈(pop)指令,并且任何指令使用RSP或者RBP作为一个基本寄存器。
通过检验典型寻址方式,AMD64体系结构防止软件开拓利用未实现的指针的高位作为别的目的。软件遵循在在一个特有的处理器的实现上使用典型寻址方式为了不需要做任何的修改就能运行在long-mode模式上实现支持更大的虚拟地址空间。
系统编程概述:
为系统软件开发程序员编写操作系统,加载器(loaders),连接程序(linkers),设备驱动,或者需要访问系统资源的实用程序。这些系统资源通常只有在软件运行在最高特权级(CPL=0)时才可获取。特权级和他们的交互性在第93页的"Segment-Protection Overview(段保护机制概述)"有详细的描述。
这一章节主要介绍对系统软件开发者有帮助的AMD64体系结构的基本特征和性能。这些概念包括:
1, 所支持的寻址方式和内存是怎么组织的。
2, 内存管理硬件机制怎样以不同的寻址方式访问内存。
3, 处理器的操作模式,还有内存管理硬件怎样才能支持每一个操作模式。
4, 系统控制寄存器用于管理系统资源。
5, 中断与异常机制,还有它们怎样中断程序执行并报告错误。
6, 另外,对于系统软件还有一些附加的扩展,包括基于硬件的多任务的支持,检验机制对于异常的报告,软件问题的调试,和软件性能的优化。
1.1 内存模型
AMD64体系结构内存模型设计用于允许系统软件用可靠的方式管理应用程序软件和相关的数据。内存模型是和传统内存模型提供向后兼容的。硬件转换机制是为了在虚拟内存空间和物理内存空间映射地址,这种转换机制允许系统软件直观的重置应用程序和数据,不论是物理内存空间还是系统设备驱动区域都要通过操作系统来管理。在long mode模式中,AMD64体系结构实现了一个平坦内存模型。在传统模式中,体系结构实现了所有传统的内存模型。
1.1.1 内存寻址
AMD64体系结构支持地址重定位,这样做,需要一些类型的地址来描述内存的组织。明确的,AMD64体系结构定义了4中类型的地址: 1,逻辑地址; 2,实际地址,或段偏移量,是逻辑地址的一部分; 3,线性地址,即虚拟地址;4,物理地址。
逻辑地址: 一个逻辑地址是在一个段地址中间中的一个引用,它包含段选择子和实际地址。重要的,一个逻辑地址用以下公式表达:
逻辑地址 = 段选择子 : 偏移量。
段选择子是指在全局或者局部描述符表中的一个表项。这个指定的描述符表的表项描述了在虚拟地址空间中的段的位置,及它的大小和别的特性。实际地址用作在通过选择子指定的段中的一个偏移量。逻辑地址经常涉及到远指针(far pointers,很久以前的编译器才有,现在很多编译器早已经将它优化没了)。远指针用于在软件寻址时需要明确的引用一个段(也就是从当前的段引用外部的一个段)。
实际地址: 在被引用的内存段里的一个偏移量作为一个实际地址。实际地址由把一个基地址(Base),一个比例索引(Scale x Index),和一个置换值(Displacement)相加起来形成。实际地址通过下面的公式来计算:
实际地址 = 基地址(Base) + 比例索引(Scale x Index) + 置换值(Displacement)。
上面各个形成实际地址的元素如下:
Base是存储在一个任意一般用途寄存器中的值。Scale是1,2,4,或8的一个整数。Index是存储在一个任意一般用途寄存器中的2的补码值。Displacement是一个8位,16位,或32位的2的补码值作为指令的一部分被编码。
实际地址经常涉及到近指针(near pointers,这是现在常用的,实际上除了近指针,远指针,还有巨指针)。一个近指针用于当选择子已经被隐式地指明或者当使用平坦内存模式时。
Long mode模式定义了一个64位的实际地址的长度。如果一个处理器的实现不完全支持64位虚拟地址空间,那么实际地址必须使用典型的形式(参考 典型寻址形式,Canonical Address Form ,在第4页)。
线性(虚拟)地址: 一个逻辑地址的段描述符部分是指在全局或者局部描述符表中的一个段描述符项。指定的段描述符项包含段的基地址,也就是在线性地址空间中段的起始位置。一个线性地址通过段的基地址和实际地址(段偏移量)相加形成,它创建一个到所支持的线性地址空间之内的任何字节的引用。线性地址经常涉及到虚拟地址,这俩个术语通常指的就是同一个意思。它们由下面的公式计算而来:
线性地址(Linear Address) = 段基地址(Segment Base Address) + 实际地址(Effective Address)。
当使用平坦内存模式时--也就是在64位模式中--一个段的基地址被作为0来对待。在这种情况下,线性地址和实际地址是完全相同的。在Long mode模式中,线性地址必须使用典型的寻址形式。
物理地址: 一个物理地址是对物理地址空间中的一个引用,典型的就是主存。物理地址是通过从虚拟地址空间中使用页转换机制来转换的。这本书的第7页讲述分页机制怎么用于虚拟地址向物理地址的转换。如果这个分页机制没有启用时,虚拟(线性)地址就被作为物理地址来使用。
1.1.2 内存组织
AMD64体系结构对于虚拟内存和物理内存组织内存。虚拟内存空间和物理内存空间在大小上可以不相等(这是最常见的)。通常情况下,虚拟地址空间要比物理地址空间大很多。系统软件在系统硬盘和物理内存之间迁移应用程序和数据从而出现的有效内存要比真实存在的多得多。然后系统软件使用硬件上的内存管理机制去把大的虚拟地址空间映射进小的物理地址空间。
虚拟内存: 软件使用虚拟地址访问在虚拟内存空间中的位置。系统软件负责使用段内存管理机制来管理在虚拟内存上的应用程序和数据的迁移。系统软件也负责使用页转换机制来把虚拟内存映射到物理内存地址。AMD64体系结构使用下面的地址转换模式支持不同大小的虚拟内存:
1, 保护模式 -- 这个模式支持4GB的虚拟地址空间使用32位的虚拟地址。
2, Long mode模式 -- 这个模式支持16EB的虚拟地址空间使用64位虚拟地址。
物理内存: 物理地址用于直接访问主存。对于一些特殊的计算机系统,有效的物理地址空间的大小和安装在系统的主存的总量是相等的。物理内存的最大的总量依赖于处理器的实现和地址转换模式。AMD64体系结构支持使用下面的地址转换模式改变物理内存的大小:
实际地址模式: 这个模式也叫做实模式,支持1MB的物理地址空间使用20位的物理地址。地址转换模式在第10页的"实际地址(Real Addressing)"上有描述。实模式只有在传统模式中才有效。
传统保护模式: 这个模式支持一些不同的地址空间大小,依赖于所使用的转换机制和那些机制是否已被启用。传统保护模式支持4GB的物理地址空间使用32位的物理地址。当处理器运行在传统保护模式时,段转换机制和页转换机制都能够被用于访问物理地址空间。
当物理地址大小扩展被启用,页转换机制能够被扩充到支持52位的物理地址。52位物理地址允许达到支持4PB的物理地址空间(当前,在这个模式中AMD64体系结构支持40位的寻址,允许达到支持1TB的物理地址空间。)。
LongMode模式: 这个模式是AMD64所特有的一个模式。这个模式支持最大4PB的物理地址空间使用52位物理地址。Long Mode模式需要使用页转换机制和物理地址大小扩展(PAE)机制。
1.1.3 典型寻址方式 (Canonical Address Form)
Long mode定义了64位的虚拟地址空间,但是处理器的实现能支持的较少。尽管一些处理器的实现不全部使用64位的虚拟地址,它们检查从已经实现的最高有效位到第63位(从0开始),观察是否那些位全部是0或者全部是1。一个遵循这种性质的地址就用了典型寻址方式。在大多数情境下,一个虚拟内存引用没有使用典型寻址方式会导致引发一个普通保护异常(#GP)。然而,栈隐式的引用栈地址时没有用典型的寻址方式会导致引发一个堆栈异常(#SS)。隐式的栈引用包含所有的压栈(push)和弹栈(pop)指令,并且任何指令使用RSP或者RBP作为一个基本寄存器。
通过检验典型寻址方式,AMD64体系结构防止软件开拓利用未实现的指针的高位作为别的目的。软件遵循在在一个特有的处理器的实现上使用典型寻址方式为了不需要做任何的修改就能运行在long-mode模式上实现支持更大的虚拟地址空间。
系统编程概述:
为系统软件开发程序员编写操作系统,加载器(loaders),连接程序(linkers),设备驱动,或者需要访问系统资源的实用程序。这些系统资源通常只有在软件运行在最高特权级(CPL=0)时才可获取。特权级和他们的交互性在第93页的"Segment-Protection Overview(段保护机制概述)"有详细的描述。
这一章节主要介绍对系统软件开发者有帮助的AMD64体系结构的基本特征和性能。这些概念包括:
1, 所支持的寻址方式和内存是怎么组织的。
2, 内存管理硬件机制怎样以不同的寻址方式访问内存。
3, 处理器的操作模式,还有内存管理硬件怎样才能支持每一个操作模式。
4, 系统控制寄存器用于管理系统资源。
5, 中断与异常机制,还有它们怎样中断程序执行并报告错误。
6, 另外,对于系统软件还有一些附加的扩展,包括基于硬件的多任务的支持,检验机制对于异常的报告,软件问题的调试,和软件性能的优化。
1.1 内存模型
AMD64体系结构内存模型设计用于允许系统软件用可靠的方式管理应用程序软件和相关的数据。内存模型是和传统内存模型提供向后兼容的。硬件转换机制是为了在虚拟内存空间和物理内存空间映射地址,这种转换机制允许系统软件直观的重置应用程序和数据,不论是物理内存空间还是系统设备驱动区域都要通过操作系统来管理。在long mode模式中,AMD64体系结构实现了一个平坦内存模型。在传统模式中,体系结构实现了所有传统的内存模型。
1.1.1 内存寻址
AMD64体系结构支持地址重定位,这样做,需要一些类型的地址来描述内存的组织。明确的,AMD64体系结构定义了4中类型的地址: 1,逻辑地址; 2,实际地址,或段偏移量,是逻辑地址的一部分; 3,线性地址,即虚拟地址;4,物理地址。
逻辑地址: 一个逻辑地址是在一个段地址中间中的一个引用,它包含段选择子和实际地址。重要的,一个逻辑地址用以下公式表达:
逻辑地址 = 段选择子 : 偏移量。
段选择子是指在全局或者局部描述符表中的一个表项。这个指定的描述符表的表项描述了在虚拟地址空间中的段的位置,及它的大小和别的特性。实际地址用作在通过选择子指定的段中的一个偏移量。逻辑地址经常涉及到远指针(far pointers,很久以前的编译器才有,现在很多编译器早已经将它优化没了)。远指针用于在软件寻址时需要明确的引用一个段(也就是从当前的段引用外部的一个段)。
实际地址: 在被引用的内存段里的一个偏移量作为一个实际地址。实际地址由把一个基地址(Base),一个比例索引(Scale x Index),和一个置换值(Displacement)相加起来形成。实际地址通过下面的公式来计算:
实际地址 = 基地址(Base) + 比例索引(Scale x Index) + 置换值(Displacement)。
上面各个形成实际地址的元素如下:
Base是存储在一个任意一般用途寄存器中的值。Scale是1,2,4,或8的一个整数。Index是存储在一个任意一般用途寄存器中的2的补码值。Displacement是一个8位,16位,或32位的2的补码值作为指令的一部分被编码。
实际地址经常涉及到近指针(near pointers,这是现在常用的,实际上除了近指针,远指针,还有巨指针)。一个近指针用于当选择子已经被隐式地指明或者当使用平坦内存模式时。
Long mode模式定义了一个64位的实际地址的长度。如果一个处理器的实现不完全支持64位虚拟地址空间,那么实际地址必须使用典型的形式(参考 典型寻址形式,Canonical Address Form ,在第4页)。
线性(虚拟)地址: 一个逻辑地址的段描述符部分是指在全局或者局部描述符表中的一个段描述符项。指定的段描述符项包含段的基地址,也就是在线性地址空间中段的起始位置。一个线性地址通过段的基地址和实际地址(段偏移量)相加形成,它创建一个到所支持的线性地址空间之内的任何字节的引用。线性地址经常涉及到虚拟地址,这俩个术语通常指的就是同一个意思。它们由下面的公式计算而来:
线性地址(Linear Address) = 段基地址(Segment Base Address) + 实际地址(Effective Address)。
当使用平坦内存模式时--也就是在64位模式中--一个段的基地址被作为0来对待。在这种情况下,线性地址和实际地址是完全相同的。在Long mode模式中,线性地址必须使用典型的寻址形式。
物理地址: 一个物理地址是对物理地址空间中的一个引用,典型的就是主存。物理地址是通过从虚拟地址空间中使用页转换机制来转换的。这本书的第7页讲述分页机制怎么用于虚拟地址向物理地址的转换。如果这个分页机制没有启用时,虚拟(线性)地址就被作为物理地址来使用。
1.1.2 内存组织
AMD64体系结构对于虚拟内存和物理内存组织内存。虚拟内存空间和物理内存空间在大小上可以不相等(这是最常见的)。通常情况下,虚拟地址空间要比物理地址空间大很多。系统软件在系统硬盘和物理内存之间迁移应用程序和数据从而出现的有效内存要比真实存在的多得多。然后系统软件使用硬件上的内存管理机制去把大的虚拟地址空间映射进小的物理地址空间。
虚拟内存: 软件使用虚拟地址访问在虚拟内存空间中的位置。系统软件负责使用段内存管理机制来管理在虚拟内存上的应用程序和数据的迁移。系统软件也负责使用页转换机制来把虚拟内存映射到物理内存地址。AMD64体系结构使用下面的地址转换模式支持不同大小的虚拟内存:
1, 保护模式 -- 这个模式支持4GB的虚拟地址空间使用32位的虚拟地址。
2, Long mode模式 -- 这个模式支持16EB的虚拟地址空间使用64位虚拟地址。
物理内存: 物理地址用于直接访问主存。对于一些特殊的计算机系统,有效的物理地址空间的大小和安装在系统的主存的总量是相等的。物理内存的最大的总量依赖于处理器的实现和地址转换模式。AMD64体系结构支持使用下面的地址转换模式改变物理内存的大小:
实际地址模式: 这个模式也叫做实模式,支持1MB的物理地址空间使用20位的物理地址。地址转换模式在第10页的"实际地址(Real Addressing)"上有描述。实模式只有在传统模式中才有效。
传统保护模式: 这个模式支持一些不同的地址空间大小,依赖于所使用的转换机制和那些机制是否已被启用。传统保护模式支持4GB的物理地址空间使用32位的物理地址。当处理器运行在传统保护模式时,段转换机制和页转换机制都能够被用于访问物理地址空间。
当物理地址大小扩展被启用,页转换机制能够被扩充到支持52位的物理地址。52位物理地址允许达到支持4PB的物理地址空间(当前,在这个模式中AMD64体系结构支持40位的寻址,允许达到支持1TB的物理地址空间。)。
LongMode模式: 这个模式是AMD64所特有的一个模式。这个模式支持最大4PB的物理地址空间使用52位物理地址。Long Mode模式需要使用页转换机制和物理地址大小扩展(PAE)机制。
1.1.3 典型寻址方式 (Canonical Address Form)
Long mode定义了64位的虚拟地址空间,但是处理器的实现能支持的较少。尽管一些处理器的实现不全部使用64位的虚拟地址,它们检查从已经实现的最高有效位到第63位(从0开始),观察是否那些位全部是0或者全部是1。一个遵循这种性质的地址就用了典型寻址方式。在大多数情境下,一个虚拟内存引用没有使用典型寻址方式会导致引发一个普通保护异常(#GP)。然而,栈隐式的引用栈地址时没有用典型的寻址方式会导致引发一个堆栈异常(#SS)。隐式的栈引用包含所有的压栈(push)和弹栈(pop)指令,并且任何指令使用RSP或者RBP作为一个基本寄存器。
通过检验典型寻址方式,AMD64体系结构防止软件开拓利用未实现的指针的高位作为别的目的。软件遵循在在一个特有的处理器的实现上使用典型寻址方式为了不需要做任何的修改就能运行在long-mode模式上实现支持更大的虚拟地址空间。