虚拟化技术原理与实现(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-09 11:42:02

点击下载

作者:广小明

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

虚拟化技术原理与实现

虚拟化技术原理与实现试读:

前言

随着云计算热潮的兴起,构成其中关键技术之一的虚拟化技术再次成为业内外的焦点。但是与之前有所不同,虚拟化技术不再仅限于计算机从业者范围,而是走向更为广阔的融合宽带网络在内的广义的资源基础设施层面。更为重要的是,受虚拟化概念的影响,正在形成一种新的资源体系,动态组合调整所需的计算、存储和网络资源以适应最终应用的需求。这一变化直接带动创新的服务模式、快速部署和资源弹性扩展等一系列优势。

中国电信作为基础运营商,一直密切关注云计算技术和业务的发展,成立了专业化的研究中心对云计算相关核心技术进行研究,并将研究与中国电信自身业务服务的优势相结合。中国电信拥有世界上最大的宽带网络和国内最丰富的数据中心资源,如何将传统的物理资产转化成逻辑可管理的虚拟资源以提高资源的利用率,降低运营和维护成本,满足国家绿色环保的要求是研究重点之一。

当前基于x86的虚拟化技术已经成熟,但是其核心技术一直掌握在少数虚拟化软件厂家手中,阻碍了虚拟化技术的规模应用。开源技术Xen和KVM的出现以及该类技术在亚马逊成功的商用,给虚拟化技术的应用注入了强心剂,越来越多的企业和个人参与到开源技术的研究和开发过程中。随着开源软件版本的不断升级,其与管理平台的接口也日渐成熟和标准化,一些知名的平台开发厂商也开始支持这些开源技术,为开源技术的商用奠定了良好的基础。

本书作者均来自中国电信云计算研究中心,他们以饱满的工作热情参与到虚拟化开源技术的研发过程中,秉承开源的精神。希望自己的研究成果不再局限于中国电信研究中心内部,而且像云计算资源一样借助图书这个介质为更多的研究人员和开发者服务,让更多的人加入到开源技术的研究和开发过程中。

本书的主要内容包括4个部分。

第一部分为虚拟化技术原理篇。介绍虚拟化技术,包括它的发展历程、基本原理、技术架构和一些主流的虚拟化产品等。

第二部分为Xen虚拟化技术篇。介绍Xen软件模块结构、工作原理及流程,并借助源码分析Xen最核心的软件模块Hypervisor的工作原理、流程及实现。

第三部分为KVM虚拟化技术篇。从KVM的体系结构出发,分别从日常使用、KVM内核代码和qemu-kvm用户态代码三个角度进行分析,情景化地剖析了KVM虚拟化技术的实现方案,包括重要的数据结构、处理流程等。

第四部分为虚拟化软件开放接口篇。从典型Xen管理接口入手,通过源码分析介绍了Xen管理接口的工作原理与实现方式,并推而广之。考虑到未来需要对Xen、KVM等虚拟化技术构建的异构资源池进行统一管理,需要提供统一标准化的管理接口,本书最后对libvirt虚拟化控制中间件进行了介绍。

本书涉及的知识面较广,由于笔者的知识水平和认知的局限,书中难免有纰漏之处,恳请各位专家和读者不吝赐教。

作 者第一篇 云计算与虚拟化技术

继个人计算机变革和互联网变革之后,信息产业正迎来它的第三次重大变革——云计算变革。

云计算(Cloud Computing)是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备。云计算的一个核心思想是在服务器端提供集中的计算资源,同时这些计算资源要独立地服务于不同的用户,也就是在共享计算资源的同时,为每个用户提供隔离、安全、可信的工作环境。

云计算需要支持无数的应用请求,并保证存储和计算的性能。而虚拟化技术可以实现快速存储和计算性能的无缝扩展,是云计算技术的精髓,为云计算提供了很好的底层技术平台。

本篇主要介绍虚拟化技术,包括它的发展历程、基本原理、技术架构和一些主流的虚拟化产品等。第1章 虚拟化技术基本原理

1.1 云计算与虚拟化技术

1.2 x86和非x86体系结构基础

1.3 操作系统与虚拟化

1.4 VMM技术架构分类

1.5 本章小结

了解一些CPU架构和操作系统的知识对读者认识虚拟化技术是必需的。本章对虚拟化技术的基本原理进行阐述,首先介绍CPU架构、操作系统的一些基本知识,然后介绍VMM的功能、组成和分类。1.1 云计算与虚拟化技术

2006年,谷歌推出了“Google 101计划”,并正式提出了“云”的概念和理论。随后,亚马逊、微软、IBM等公司都宣布了自已的“云计划”,在全球各大IT巨头的努力推动下,近年来,云计算在全球获得了飞速发展,并日益成为信息化建设领域的一大热点和未来趋势。

云计算作为发展中的概念,到现在为止还没有一个统一的定义,被称为史上最混淆的概念。从狭义上看,云计算指的是厂商通过分布式计算和虚拟化技术搭建数据中心或超级计算机,以免费或按需租用的方式向技术开发者或者企业用户提供数据存储、分析以及科学计算等服务,如亚马逊的弹性计算服务。从广义上看,是指厂商通过建立网络服务器集群,向各种类型的客户提供在线软件服务、软件租借、数据存储、计算分析等不同类型的服务。

云计算包含了众多的核心技术,如:虚拟化、并行计算、分布式数据库、分布式存储等,其中虚拟化技术是云计算的基石,是云计算服务得以实现的最关键技术,通过虚拟化技术可以将各种硬件、软件、操作系统、存储、网络以及其他IT资源都进行虚拟化,并纳入云计算管理平台的管理。这样一来,IT能力都可以转变成可管理的逻辑资源,通过互联网像水、电和煤气一样提供给最终用户,实现云计算的最终目标。

虚拟化技术本身涉及的范围也很广,包括:服务器虚拟化、网络虚拟化、存储虚拟化、应用程序虚拟化、桌面虚拟化等。本书介绍的虚拟化主要是指服务器虚拟化。1.2 x86和非x86体系结构基础

Intel的x86体系结构是世界上最流行的处理器架构,从1978年8086/8088处理器问世到现在的Core 2 Duo和Core 2 Quad,以及Xeon 5300和7300系列处理器,Intel x86体系结构已经在CPU领域叱咤30多年。

本节将对x86和非x86的体系结构进行简要介绍,由于篇幅所限,无法对所有的知识都深入讲解,但会尽力将它们的思想阐述清楚。1.2.1 x86的发展历程

Intel公司是世界上最大的CPU制造厂商,占据了80%以上的CPU市场份额。本节以Intel公司的处理器为例介绍x86的发展历程,如图1-1所示。图1-1 x86的发展历程

1978年,最早的x86处理器8086初次登场。8086是16位的处理器,这个位数指的是CPU GPR(General-Purpose Register,通用寄存器)的数据宽度为16位。8086处理器拥有16位的寄存器和16位的外部数据总线,使用20位地址寻址(拥有1MB的地址空间)。在20世纪80年代初,IBM选择了8086的衍生产品8088作为IBM PC的处理器。IBM的这一举动给x86带来了巨大的发展机遇,并且帮助它成为行业的标准直到今天。

1982年,Intel公司发布了80286处理器,引入了保护模式的概念。

1985年,Intel公司发布了x86体系结构下的第一款32位处理器80386,并引入了虚拟内存。Intel执行副总裁Patrick Gelsinger认为80386的推出是PC行业的革命性转折点,推动了整个行业的发展。

1989年,80486发布,在80386的基础上,80486采用了5级流水线机制,并且引入了片上一级缓存和能量管理。

由于当时数字不能作为商标,Intel公司改变了产品的命名方法。1993年,第一款奔腾处理器(Pentium)发布,此款处理器在80486的基础上进一步加大一级缓存,并将其分成指令缓存和数据缓存两个部分,进一步加快了处理器对内存的访问速度。同时,奔腾处理器还引入MMX技术,进一步增强了处理器对多媒体处理的支持。

1995年到1999年,Intel公司发布了一系列基于x86体系结构的处理器—奔腾6(简称P6)家族处理器,包括奔腾Pro(Pentium Pro)、奔腾 2(Pentium Ⅱ)、奔腾 2 至强(Pentium Ⅱ Xeon)、赛扬(Celeron)、奔腾 3(Pentium Ⅲ)以及奔腾 3 至强(Pentium Ⅲ Xeon)处理器。P6家族处理器采用了超标量(Superscalar)技术,以乱序执行的方式进一步增强了处理器的处理速度。

2002年到2006年,奔腾 4(Pentium 4)家族处理器占据了主导地位。奔腾 4家族的处理器基于NetBurst微处理器结构,在提升性能的同时,进一步增强了对多媒体处理的支持,并且引入了超线程(Hyper-Threading)的概念,引领单处理器的性能走向巅峰。此外,在奔腾 4的672和662处理器上,Intel还首次加入了虚拟化支持,即Intel VT技术。也是在这段时期,由于AMD发展的64位扩充技术的刺激,Intel公司开始推出64位版x86。

从2006年开始,处理器进入多核时代(Multicore),Intel相继发布了Core Duo和Core 2 Duo系列处理器。1.2.2 x86-64

x86-64是x86架构的延伸产品,是一种64位微处理器架构及其相应的指令集。

在x86-64出现以前,Intel与惠普联合推出IA-64架构,此架构不与x86兼容,且市场反应冷淡。于是,与x86兼容的x86-64架构应运而生。1999年,AMD首次公开64位集为IA-32提供扩展,称为x86-64(后来改名为AMD64)。此架构后来也为Intel所采用,也就是现在的Intel 64。

x86-64能有效地把x86架构移植到64位环境,并且兼容原有的x86应用程序,市场前景广阔。外界使用x84-64或者x64称呼这个64位架构,以保持中立,不偏袒任何一家厂商。

1.AMD 64

AMD 64指令集被应用在Athlon 64、Athlon 64 FX、Athlon 64 X2、Turion 64、Turion 64 X2、Opteron及较新款的Sempron和Phenom处理器上。其主要特点有:支持64位通用寄存器、64位整数及逻辑运算和64位虚拟地址。AMD 64架构相比之前的32位架构有如下重大改进。

●新增寄存器。

●地址宽度加长。

●新增扩充指令集SSE2、SSE3。

●新增“禁止运行”位(No-Execute,NX bit):此位的设置可以防止蠕虫病毒的缓存溢出攻击。

2.Intel 64

Intel 64指令集被应用于Pentium 4、Pentium D、Pentium Extreme Edition、Celeron D、Xeon、Intel Core 2、Intel Core 2 Quad、Intel Core i3、Intel Core i5及Intel Core i7处理器上。Intel 64架构加入了额外的寄存器和其他改良的指令集,可使处理器直接访问超过4GB的存储器,允许运行更大的应用程序。通过64位的存储器地址上限,其理论存储器容量上限达16 000 000TB(16EB),但大多数操作系统和应用程序在可见的未来都用不到如此巨大的地址空间,在初期的应用上并未支持完整的64位地址。Intel 64架构相比之前的32位架构有如下重大改进。

●新增寄存器。

●地址宽度加长。

●新增改良指令集。

●新增“禁止运行”位(eXecute Disable,XD bit):相当于AMD 64的NX bit,通过设置此位可以防止蠕虫病毒的缓存溢出攻击。1.2.3 x86内存架构

硬件架构中最复杂、最核心的部分就是其内存架构。为了使读者理解现代计算机体系架构,本节将对x86的内存架构进行讲解,主要内容包括:x86为操作系统提供了怎样的内存架构,以及操作系统是如何使用它们的。

本节主要以32 位架构为例进行讲解,并在最后添加了一些x86-64架构下的相关内容。

1.地址空间

地址空间是所有可用资源的集合,我们姑且将它看做一个大大的数组,那么地址就是这个数组的索引。地址空间可以划分为物理地址空间和线性地址空间两大类,具体介绍如下。(1)物理地址空间

硬件平台通常划分为CPU、内存和其他硬件设备三个部分。其中,CPU是整个硬件平台的主导者,内存和其他硬件设备都是CPU可以使用的资源。这些资源组合在一起,分布在CPU的物理地址空间内,CPU使用物理地址索引这些资源。

物理地址空间的大小由CPU实现的物理地址位数所决定,物理地址位数由CPU经过MMU(Memory Management Unit,内存管理单元)转换后的外地址总线位数决定。外地址总线位数与CPU处理数据的能力(即CPU位数)没有必然的联系,例如,16位的8086 CPU具有20位地址空间。

一个硬件平台只有一个物理地址空间,但每个程序都认为自己独享整个平台的硬件资源。为了让多个程序能够有效地相互隔离,也为了它们能够有效地使用物理地址空间的资源,引入了线性地址空间的概念。(2)线性地址空间

线性地址空间的大小由CPU实现的线性地址位数所决定,线性地址位数由CPU的内地址总线位数决定。内地址总线与CPU执行单元相连,内地址总线位数往往与CPU位数一致,如果是32位处理器,那么它就实现了32位线性地址,其线性地址空间为4GB。需要注意的是,线性地址空间的大小与物理地址空间的大小没有必然联系,Intel 的PAE平台具有4GB的线性地址空间,而其物理地址空间为64GB。

线性地址空间会被映射到某一部分物理地址空间或整个物理地址空间。一个硬件平台上可以有多个线性地址空间,CPU负责将线性地址空间转换成物理地址空间,保证程序能够正确访问到该线性地址空间所映射到的物理地址空间。在现代操作系统中,每个进程通常都拥有自己的私有线性地址空间。一个典型的线性地址空间构造如图1-2 所示。图1-2 线性地址空间构造

2.地址

地址是访问地址空间的索引。根据访问地址空间的不同,索引可以分为物理地址和线性地址。但由于x86特殊的段机制,还存在一种额外的地址—逻辑地址。(1)逻辑地址

逻辑地址是程序直接使用的地址(x86无法禁用段机制,逻辑地址一直存在)。逻辑地址由一个16位的段选择符和一个32位的偏移量(32位平台)构成。下面以具体程序为例进行解释。

上述语句中的指针变量p存储的就是变量a的逻辑地址。实际上,p中存储的仅是逻辑地址的偏移部分,而偏移对应的段选择符位于段寄存器中,并没有在程序中显示。(2)线性地址

线性地址又称虚拟地址。线性地址是逻辑地址转换后的结果,用于索引线性地址空间。当CPU使用分页机制时,还需要将线性地址转换成物理地址才能访问平台内存或其他硬件设备;当分页机制未启用时,线性地址与物理地址相同。(3)物理地址

物理地址是物理地址空间的索引,是CPU提交到总线用于访问平台内存或其他硬件设备的最终地址,在x86下,物理地址有时也被称为总线地址。

正如(1)、(2)中所阐述的,物理地址与逻辑地址、线性地址的关系总结如下。

●分段机制启用,分页机制未启用:逻辑地址→线性地址=物理地址

●分段机制、分页机制同时启用:逻辑地址→线性地址→物理地址

3.x86内存管理机制

x86架构的内存管理机制分为两部分:分段机制和分页机制。

分段机制为程序提供彼此隔离的代码区域、数据区域、栈区域,从而避免了同一个处理器上运行的多个程序互相影响。

分页机制实现了传统的按需分页、虚拟内存机制,可以将程序的执行环境按需映射到物理内存。此外,分页机制还可以用于提供多任务的隔离。

分段机制和分页机制都可以通过配置支持简单的单任务系统、多任务系统或共享内存的多处理器系统。需要强调的一点是,处理器无论在何种运行模式下都不可以禁止分段机制,但是分页机制却是可选选项。下面分别对这两种机制进行详细介绍。(1)分段机制

分段机制将内存划分成以起始地址(Base)和长度(Limit)描述的块。段可以与程序最基本的元素联系起来,程序可以简单地划分为代码段、数据段和栈,段机制就有相应的代码段、数据段和栈段。

分段机制是x86架构下的朴素内存管理机制,不可以禁用。了解分段机制是了解程序中所使用的逻辑地址转换为CPU内部所使用的线性地址的关键。

分段机制由逻辑地址、段选择符、段描述符和段描述符表4个基本部分构成。当程序使用逻辑地址访问内存的某个部分时,CPU通过逻辑地址中的段选择符索引段描述符表,进而得到该内存对应的段描述符(段描述符描述段的基地址、长度以及读/写、访问权限等属性信息),根据段描述符中的段属性信息检测程序的访问是否合法,如果合法,再根据段描述符中的基地址将逻辑地址转换为线性地址。这个流程可以用图1-3概括。图1-3 分段机制流程分布

1)段选择符(Segment Selector)。

段选择符是逻辑地址的一个组成部分,用于索引段描述符表以获得该段对应的段描述符。段选择符存放于段选择寄存器中,共16位,结构如图1-4所示。图1-4 段选择符的结构

各字段的含义如下。

●索引(Index):段描述符表的索引。

●TI:指明索引哪个段描述符表。当 TI=0 时,表示索引全局段描述符表(Global Descriptor Table,下面简称为GDT);当TI=1时,表示索引本地段描述符表(Local Descriptor Table,下面简称为LDT)。

●RPL:Requested Privilege Level的简称,即所要求的权限级别。RPL存在于段选择寄存器的0、1位,为程序访问段时增加一级检查。

段选择符作为逻辑地址的一部分,对应用程序是可见的。但是,正如前面在逻辑地址中介绍的,应用程序中只存储和使用逻辑地址的偏移部分,段描述符的修改和分配由连接器和加载器完成。

为了使CPU能够快速地获得段选择符,x86架构提供了6个段寄存器存放当前程序中各个段的段选择符。这6个段寄存器分别如下。

●CS(Code-Segment,代码段):存放代码段的段选择符。

●DS(Data-Segment,数据段):存放数据段的段选择符。

●SS(Stack-Segment,栈段):存放栈的段选择符。

●ES、FS、GS:可以存放额外三个数据段的段选择符,由程序自由使用。

由于段选择符是用来索引段描述符表访问段描述符的,为了加速段描述符的访问,x86在段寄存器后增加了一个程序不可见的段描述符寄存器。当段寄存器被加载到一个新的段选择符后,CPU自动将该段选择符索引的段描述符加载到这个不可见的段描述符寄存器中。这6个段寄存器的构造如图1-5所示。图1-5 段寄存器的构造

2)段描述符(Segment Descriptor)。

段描述符描述某个段的基地址、长度以及各种属性(例如,读/写属性、访问权限等)。这是分段机制的核心思想。

段描述符的结构如图1-6所示。图1-6 段描述符的结构

有关段描述符的详细解释,可查阅 Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3A一书中3.4.5节的内容(附下载网址:http://www.intel.com/Assets/PDF/manual/253668.pdf)。在此,我们只详细介绍其中的Base字段、Limit字段和DPL字段。

●Base字段描述了该段的基地址。

●Limit字段描述了该段的长度。

●DPL字段指明描述符权限级别,表示该段所具有的权限。它表示代码访问此段所需要的最低权限。

当CPU通过一个逻辑地址的段选择符获得该段对应的段描述符后,会使用段描述符中各种属性字段对访问进行检查,一旦确认访问合法,CPU将段描述符中的32位基地址和程序中逻辑地址的32位偏移量相加。至此,CPU便获得了逻辑地址所对应的线性地址。

正如前面所讲,x86在段寄存器后增加了一个程序不可见的段描述符寄存器,每当段寄存器被加载入一个新的段选择符后,CPU自动将该段选择符索引的段描述符加载到这个不可见的段描述符寄存器中。也就是说,CPU只有在更新段寄存器时才索引段描述符表。

3)段描述符表。

在前面介绍段选择符的结构时,我们了解到段选择符中的TI字段用于指明索引哪个段描述符表。TI字段的必要性源于x86架构提供了两种段描述符表—GDT和LDT。

系统中至少有一个GDT可以被所有的进程访问。与此同时,系统中可以有一个或多个LDT,可以被某个进程私有,也可以被多个进程共享。

●GDT是内存中的一个数据结构。简单地讲,可以将GDT看成是一个数组,由基地址(Base)和长度(Limit)描述。

●LDT 是一个段,需要用一个段描述符来描述。LDT 的段描述符存放在GDT中,当系统中有多个LDT时,GDT中必须有对应数量的段描述符。

为了加速对GDT和LDT的访问,x86架构提供了GDTR寄存器和LDTR寄存器。关于这两种寄存器的具体描述如下。

●GDTR:包括一个32位的基地址(Base)和一个16位的长度(Limit)。

●LDTR:结构与段寄存器相同(同样包含对程序不可见的段描述符寄存器)。

通过使用LGDT/SGDT指令对GDTR进行读取/存储;通过使用LLDT/SLDT对LDTR进行读取/存储。在进行进程切换时,LDTR的值会被换成新进程对应的LDT的段描述符。

通过段选择符索引GDT/LDT的过程如图1-7所示。图1-7 通过段选择符索引段描述符表

4)分段机制总结。

现在我们已经将分段机制中的关键概念——逻辑地址、段选择符、段描述符和段描述符表全部介绍完毕。下面梳理一下逻辑地址转换为线性地址的过程。

在程序加载阶段,该进程LDT的段选择符索引GDT,获得LDT的段描述符并将其加载到LDTR寄存器中。此外,该进程的CS、DS、SS被加载入相应的段选择符,CPU根据段选择符的TI字段索引相应的段描述符表,获得相应的段描述符,并加载入CS、DS、SS对应的不可见的段描述符寄存器。

程序执行到读/写内存中的数据时,把程序中相应变量的逻辑地址转换为线性地址:①进行必要的属性、访问权限检查;②从DS对应的段描述符寄存器获得该段的基地址;③将变量的32位偏移量和段描述符中的基地址相加,获得该变量的线性地址。(2)分页机制

上面介绍的分段机制将内存划分成以基地址和长度描述的多个段进行管理,对应的逻辑地址以基地址和偏移量来描述。而分页机制是更加粒度化的内存管理机制,使用粒度化的单位“页”来管理线性地址空间和物理地址空间的对应关系。同时,分页机制允许一个页面存放在物理内存中或磁盘的交换区域(如Linux下的Swap分区,Windows下的虚拟内存文件)中,程序可以使用比机器物理内存更大的内存区域,从而使现代操作系统中虚拟内存机制的实现成为可能。

在x86架构下,页的典型大小为4KB,于是一个4GB的虚拟地址空间被划分成1024×1024个页面。物理地址空间的划分与此类似。x86架构允许大于4KB的页面大小(如2MB、4MB)。由于篇幅所限,此处只对最经典的4KB页面管理机制进行介绍。

分页机制的核心思想是通过页表将线性地址转换为物理地址,并配合旁路转换缓冲区(Translation Lookaside Buffer,后面简称为TLB)来加速地址转换的过程。分页机制主要由页表、CR3寄存器和TLB三个部件构成,其流程如图1-8所示。图1-8 分页机制流程分布

1)页表(Page Table)。

页表是用于将线性地址转换成物理地址的主要数据结构。一个地址对齐到页边界后的值称为页帧号(或者页框架),它实际上就是该地址所在页面的基地址。线性地址对应的页帧号叫做虚拟页帧号(Virtual Frame Number,下面简称为VFN),物理地址对应的页帧号叫做物理页帧号(Physical Frame Number,下面简称为PFN)或机器页帧号。页表实际上是存储VFN到PFN映射的数据结构。

在传统的32位的保护模式中,x86处理器使用两级转换方案,在这种方案中,CR3指向一个4KB的页目录,页目录又分为1024个4KB大小的页表,最后页表分为1024个长为4KB的页。未启用PAE的4KB大小的页面如图1-9所示。图1-9 未启用PAE的4KB页——二级页表

●页目录项(Page Directory Entry,下面简称为PDE):包含页表的物理地址。PDE 存放在页目录中,CPU 使用线性地址的 22~31 位索引页目录,以获取该线性地址所对应的PDE。PDE的大小为4B,页目录包含1024个PDE,占用一个4KB的物理页面。

●页表项(Page Table Entry,下面简称为PTE):包含该线性地址对应的 PFN。PTE 存放在页表中,CPU 使用线性地址的 12~21 位索引页表,以获取该线性地址所对应的 PTE。确定 PFN 后,再将线性地址的0~11位偏移量与其相加,就可以确定该线性地址对应的物理地址。PTE 的大小也是 4B,页表包含 1024 个 PTE,占用一个 4KB 的物理页面。

虚拟内存实现的关键在于PDE和PTE都包含一个P(Present)字段(更多详细的内容可参考 Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 3A中的4.3节)。P字段根据其值的不同代表以下两种情况。

当P=1时,物理页面存在于物理内存中,CPU完成地址转换后可以直接访问该页面。

当P=0时,物理页面不在物理内存中,当CPU访问该页面时,会产生一个缺页错误并交给操作系统的缺页处理程序处理,操作系统通常将存放在磁盘上的页面调入物理内存,使访问可以继续。需要注意的是,由于程序的局部性特点,操作系统会将该页面附近的页面一起调入物理内存,方便CPU的访问。P=0时的PDE和PTE的1~31位都将为操作系统提供物理页面在磁盘上的信息。通常情况下,这些位存储着物理页面在磁盘上的位置。

启用物理地址扩展(之后简称为PAE)后,页表结构将发生相应的变化。页表和页目录的总大小仍是4KB,但页表和页目录中的表项都从32位扩为64位,以使用附加的地址位。这样,页表和页目录都只有512个表项,变成了原来方案的一半,所以又加入了一个级:CR3指向页目录指针表,即一个包含4个页目录指针的表。启用PAE的4KB大小的页面使用的三级页表如图1-10所示。

2)CR3寄存器。

CR3寄存器也称为页目录基地址寄存器(Page-Directory Base Register,PDBR),存放着页目录的物理地址。一个进程在运行前,必须将其页目录的基地址存入CR3,而且,页目录的基地址必须对齐到4KB页边界。图1-10 启用PAE的4KB页——三级页表

启用PAE时,CR3指向页目录指针表。

3)TLB。

为了提高地址转换的效率,x86架构使用TLB对最近用到的页面映射进行缓存。TLB中存放着VFN到PFN的转换,当CPU访问某个线性地址时,如果其所在页面的映射存在于TLB中,无须查找页表,即可得到该线性地址对应的PFN,CPU再将它与线性地址的偏移相加,就能得到最后的物理地址。

4)分页机制总结。

将分页机制的三个部件——页表、CR3寄存器和TLB介绍完后,这里再对CPU使用分页机制将线性地址转换成物理地址的过程进行总结。

① CPU访问一个线性地址,在TLB中进行匹配,如果地址转换在TLB中,则跳到步骤⑥。否则,发生了一次TLB Miss(TLB缺失),继续步骤②。

② 查找页表,如果页面在物理内存中,则跳到步骤④。

③ 产生缺页错误,由操作系统的缺页错误处理程序进行以下处理。

●将页面从磁盘复制到物理内存中。

●更改对应的PTE,设置P位为1,并对其他字段进行相应的设置。

●刷新TLB中对应的PTE。

●从缺页错误处理程序中返回。

④ 此时,页面已经存在于物理内存中,并且页表也已经包含了这个映射。重新在TLB中进行匹配,如果地址转换在TLB中,则跳到步骤⑥。否则,发生了一次TLB Miss(TLB缺失),继续步骤⑤。

⑤ CPU重新查页表,把对应的映射插入到TLB中。

⑥ 此时,TLB已经包含了该线性地址对应的PFN。将PFN和线性地址中的偏移量相加,就得到了对应的物理地址。

4.x86-64架构

IA-32e是Intel发布的64位指令集扩展技术,在此以IA-32e为例介绍64位架构下的内存管理机制。

IA-32e模式有如下两个子模式。

●兼容模式。此模式下,只用了32 位的线性地址,将地址的32~47位全部视为0。

●64位模式。这种模式产生64位的线性地址,处理器需要保证地址的47~63位完全相同。实际上只使用了48位的地址。(1)IA-32e的分段机制

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载