




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 第2章 存储器寻址这一章处理处理技术。幸运的是,一个操作系统不是被迫跟踪物理内存本身;今天的微处理器包括几个硬件电路使内存管理更高效和更健壮的编程错误在这本书的其余部分,我们提供细节在本章关于80 x86 Intel微处理器地址内存芯片和Linux如何利用可用的解决电路。我们希望你会发现,当你学习Linux的实现细节最受欢迎的平台你会更好地理解分页的一般理论和方式研究在其他平台上实现。这是第一个内存管理相关的三章:第六章,讨论如何内核分配内存,而第七章,考虑如何线性地址分配给进程2.1 存储器寻址程序员随意引用一个内存地址的方式访问的内容一个存储单元。但在处理80年英特尔x86微处理器,我们
2、必须区分在三种地址:逻辑地址包含在机器语言指令指定一个操作数的地址一条指令。这种类型的处理体现了著名的英特尔分段架构,部队ms - dos和Windows程序员把他们的程序成段。每个逻辑地址由一个部门和一个偏移量(或位移),表示距离的开始段的实际地址。线性地址一个32位无符号整数,可以用来解决4 GB,即到4294967296记忆细胞。线性地址通常用十六进制表示符号,它们的值从0 x00000000 0 xffffffff。物理地址用于解决记忆细胞包含在内存芯片。他们对应电信号发送的地址别针的微处理器内存总线。物理地址表示为32位无符号整数。CPU控制单元将逻辑地址转换成一个线性地址的硬件电路
3、称为细分单元;先后,第二个硬件电路称为分页单元将线性地址转换成物理地址(见图2 - 1)。2.2硬件分割从80386年模型开始,英特尔微处理器执行两个地址转换不同的方式称为实模式和保护模式。实模式的存在主要是为了维护与老款处理器兼容性和允许操作系统引导(见附录A,一个简短的描述的模式)。我们将关注保护模式。2.2.1段寄存器一个逻辑地址由两部分组成:一段标识符和一个指定的偏移量段内的相对地址。段标识符是一个16位的领域称为段选择器,而抵消是一个32位的领域。使它容易快速检索段选择符,处理器提供细分寄存器的唯一目的是持有段选择符;这些寄存器称为cs,党卫军,ds,es、fs和gs。虽然只有六个人
4、,一个程序可以重用相同的分割注册不同的目的在内存中,然后通过保存其内容恢复它。三个六段寄存器有特定的用途:Cs代码段寄存器,它指向包含程序指令的部分Ss堆栈段寄存器,它指向一个包含当前程序段堆栈Ds数据段寄存器,它指向包含静态和外部的部分数据其余三个段寄存器是通用,可能指的是任意的段。cs寄存器还有另一个重要的功能:它包括一个2比特字段,该字段指定当前特权级别(CPL)的CPU。值表示最高的特权级别,而3表示价值最低的一个。Linux和3只使用水平,分别称为内核模式和用户模式。2.2.2段描述符每一部分都由一个8字节段描述符表示(见图2)描述段特征。段描述符存储在全局描述符表(GDT)或在局部
5、描述符表(LDT)。通常只有一个GDT定义,虽然每个进程可能有自己的LDT。的地址GDT在主内存中包含gdtr处理器寄存器的地址目前使用LDT包含ldtr处理器寄存器中。每一段描述符包含以下字段:x一个32位的基本字段包含的线性地址段的第一个字节。x G粒度国旗:如果是清除,表达的片段大小字节;否则,它在4096字节的倍数表示。x 20位限制字段表示段长度,以字节为单位。如果设置为0,大小1个字节之间的一个非空段可能不同和1 MB;否则,它可能会有所不同4 KB和4 GB之间。x S系统标志:如果它被清除,段是一个系统段存储内核数据结构;否则,它是一个正常的代码或数据段。x 4比特类型字段描述
6、段类型及其访问权限。的后段描述符类型广泛应用:代码段描述符表明段描述符是指一个代码段,它可能包括在内在GDT或LDT。描述符设置年代标志。数据段描述符表明,指的是一个数据段的段描述符,它可能包括在内在GDT或LDT。描述符设置年代标志。堆栈段实现通过通用数据段。任务状态段描述符(TSSD)表明任务状态段的段描述符是指(TSS),也就是说,一段用来节省处理器寄存器的内容(参见3.2.2节第3章);它只会出现在GDT。对应的类型字段的值11、9,这取决于相应的进程当前正在执行的CPU。S标志的描述符设置为0。局部描述符表描述符(LDTD)表明段描述符是指一段包含LDT;它可以只有在GDT出现。对应
7、的类型字段的值2。S的旗帜这样的描述符设置为0。x DPL(描述符特权级)2比特字段用来限制访问的部分。它代表了CPU的最小特权级别请求来访问。因此,一套段DPL的CPL时只能是0,也就是说,在内核模式,而与其DPL段设置为CPL 3访问每一个值。x Segment-Present国旗将如果段目前不存储在主内存。Linux总是将这个字段设置为1,因为它从来没有互换整个片段磁盘。x额外国旗称为D或B取决于段包含代码或数据。它的意义略有不同在这两种情况下,但它基本上是如果地址用作部分抵消32位长,如果他们是16位长(见英特尔手册详情)。x保留一点(53)总是设置为0。x AVL国旗由操作系统可以使
8、用,但Linux中被忽略。2.2.3段选择符加快逻辑地址转化为线性地址,英特尔处理器提供了一个额外的nonprogrammable注册该是,不能由一个寄存器程序员的六个可编程分割寄存器。每一个nonprogrammable寄存器包含8字节的段描述符(在前面的描述部分)指定的段选择器中包含相应的分割登记。每次一段选择符是装载在分割登记,从内存加载到相应的段描述符匹配nonprogrammable CPU寄存器。从那时起,指的是译文的逻辑地址这部分可以不执行访问GDT或LDT存储在主存;处理器可以直接提及CPU寄存器包含段描述符。访问GDT或LDT只有当分割的内容是必要的注册改变(见图2 - 3)
9、。每段选择器包括以下字段:x可索引(进一步在该列表后的文本描述)来标识的相应的段描述符中包含的条目GDT或LDTx一个TI(表指示器)标记,用于指定是否包括段描述符GDT(TI = 0)或在LDT(TI = 1)x的RPL(请求者的特权级)2比特字段,这正是当前特权级别的CPU当加载到相应的段选择器cs寄存器11RPL领域还可用于选择性地削弱处理器特权级别的访问数据段时,看到英特尔文档细节。因为一段描述符是8个字节长,它在GDT或LDT相对地址相乘得到的最重要的13位的段选择子8。为实例,如果GDT是0 x00020000(值存储在gdtr寄存器)和索引指定的段选择子是2,对应的段描述符的地址
10、是0 x00020000 +(2 x 8)或0 x00020010。第一项GDT总是设置为0,这可以确保逻辑地址无效段选择子将被认为是无效的,因此导致处理器例外。的最大数量的段描述符可以存储在8191年GDT因此,也就是说,213 - 1。2.2.4分割单元图2 - 4显示了详细逻辑地址是如何转化为相应的线性地址。分割单元执行以下操作:x检查TI的段选择器,以确定哪些描述符表存储段描述符。这个字段表示描述符在GDT(在这种情况下,分割单元的基本线性地址GDT gdtr注册)或活动LDT(在这种情况下,分割单位得到了基本的线性地址LDT ldtr寄存器)。x计算的地址段的段描述符的索引字段选择器
11、。索引字段是乘以8(大小的段描述符),和结果被添加到gdtr或ldtr寄存器的内容。x增加了基地的段描述符逻辑地址的偏移量,因此得到线性地址注意,由于nonprogrammable寄存器与分割寄存器,第一个需要执行两个操作只有当一个分割登记被改变了。2.3市场细分在Linux中分割已经包含在英特尔微处理器鼓励程序员分裂他们的应用程序在逻辑上相关的实体,如子例程或全球和本地数据区域。然而,Linux使用分割在一个非常有限的方式。事实上,分割和分页都有点冗余自可用于单独的物理地址空间的流程:细分可以分配一个不同的线性地址空间中每一个过程分页可以同一个线性地址空间映射到不同的物理地址空间。Linux
12、喜欢分页细分为以下原因:x内存管理更简单,当所有进程使用相同的段寄存器值,也就是说,当他们分享相同的一组线性地址。x的设计目标之一Linux可移植性最流行的体系结构;然而,几位RISC处理器支持在一个非常有限的方式分割。2.2版本的Linux使用分割只有当所需的80 x86 Intel体系结构。特别是,所有进程使用相同的逻辑地址,所以的总数段定义是相当有限的,可以存储所有的段描述符全局描述符表(GDT)。此表由gdt_table数组实现提到的gdt变量。如果你在源代码中指数看,你可以看到这些文件中定义的符号是arch / i386 / kernel /你们觉得。每一个宏,功能,和其他象征在这本
13、书中附录中列出,这样你就可以很快找到它在源代码中。局部描述符表不使用的内核,尽管存在一个系统调用,它允许流程创建自己的LDTs。这是有用的应用程序,如酒执行segment-oriented Microsoft Windows应用程序。这里是Linux使用的部分:x内核代码段。中相应的段描述符的字段GDT有以下值:o = 0 x00000000基地o = 0 xfffff限制o G(粒度国旗)= 1,部分页面大小o S(系统国旗)= 1,正常的代码或数据段o = 0 xa类型,可以读取和执行的代码段o DPL(描述符特权级别)= 0,内核模式o D / B(32位地址标志)= 1,32位的偏移地
14、址因此,相关的线性地址段开始,到达解决232 - 1的极限。年代和类型字段指定一个代码段段,可以读取和执行。其DPL值为0,从而可以访问它在内核模式。相应的段选择符是由_KERNEL_CS定义宏观:为了解决部分,内核加载产生的值宏成cs寄存器。x内核数据段。中相应的段描述符的字段GDT有以下值:o = 0 x00000000基地o = 0 xfffff限制o G(粒度国旗)= 1,部分页面大小o S(系统国旗)= 1,正常的代码或数据段o型= 2,可以读取和写入的数据段o DPL(描述符特权级别)= 0,内核模式o D / B(32位地址标志)= 1,32位的偏移地址这部分是与前一个相同(事实
15、上,他们在线性地址重叠空间)除了类型字段的值,它指定一个数据段可以读和写。相应的段选择符被定义为_KERNEL_DS宏。x用户在用户模式下所有进程共享的代码段。的字段相应的段描述符的GDT有以下值:o = 0 x00000000基地o = 0 xfffff限制o G(粒度国旗)= 1,部分页面大小o S(系统国旗)= 1,正常的代码或数据段o = 0 xa类型,可以读取和执行的代码段o DPL(描述符特权级别)= 3,用户模式o D / B(32位地址标志)= 1,32位的偏移地址年代和DPL字段指定的段段,它不是一个系统特权级别等于3,因此可以在内核模式和用户访问模式。相应的段选择符是_US
16、ER_CS定义的宏。x用户数据段共享的所有进程在用户模式。的字段相应的段描述符的GDT有以下值:o = 0 x00000000基地o = 0 xfffff限制o G(粒度国旗)= 1,部分页面大小o S(系统国旗)= 1,正常的代码或数据段o型= 2,可以读取和写入的数据段o DPL(描述符特权级别)= 3,用户模式o D / B(32位地址标志)= 1,32位的偏移地址这段重复前一个:他们是相同的,除了的价值类型。相应的段选择符是_USER_DS定义的宏。x任务状态段为每个进程(TSS)段。的描述符部分存储在GDT。TSS的基本字段描述符相关每个进程包含tss的地址字段对应的过程描述符。G标
17、志被清除,而限制字段设置为0 xeb,因为TSS段是236个字节长。类型字段设置为9或11(32位TSS),和DPL设置为0,因为流程在用户模式下是不允许访问TSS段。x一个默认LDT段通常是由所有进程共享。这段存储在default_ldt变量中。默认LDT包含一个条目组成的空段描述符。每个进程都有自己的LDT段描述符,它通常指向共同违约LDT段。基本字段设置为地址default_ldt和限制字段设置为7。如果一个进程需要一个真实的LDT,创建一个新的4096字节段(它可以包含多达511段描述符),默认LDT段描述符与这一过程相关联在GDT新的描述符换成基础和特定的值限制字段。对于每一个过程,
18、因此,GDT包含两个不同的段描述符:一个用于TSS段和LDT一段。中允许的最大条目数GDT是12 + 2 xnr_tasks,反过来,NR_TASKS表示的最大数量流程。我们在前面的列表描述了六个主要的段描述符使用Linux。四个额外的段描述符覆盖高级电源管理(APM)功能,GDT剩下未使用的和四个条目,总共14。正如我们之前提到的,GDT最多可以有213 = 8192项,其中第一个是总是空。自14日未使用或由系统NR_TASKS不能大比8180/2 = 4090。每个过程的TSS和LDT描述符添加到GDT过程创建。3.3.2节中我们将看到在第3章,内核本身产生第一流程:流程init_task
19、运行。内核初始化期间,trap_init()函数将第一个过程的TSS描述符插入到GDT使用声明:set_tss_desc(0,&init_task.tss);第一个进程创造了别人,所以每一个后续的过程是一些现有的孩子的过程。copy_thread()函数,该函数调用的克隆()和fork()系统调用来创建新的流程,执行相同的功能,以设置的TSS新流程:set_tss_desc(nr,&(任务(nr)- > tss);因为每个TSS描述符指的是一个不同的过程,当然,每个领域有一个基地不同的值。也copy_thread()函数调用set_ldt_desc()函数为了插入一段描述
20、符GDT相对的默认LDT新的过程。内核数据段包含一个进程描述符为每一个过程。每一个过程描述符包括自己的TSS LDT段段和一个指针,也是位于内核数据段。如前所述,当前特权级别的CPU处理器是否反映了指定的用户或内核模式和RPL段选择器中存储领域cs寄存器。每当改变当前特权级别时,一些细分寄存器必须相应更新。例如,当CPL = 3(用户模式)ds寄存器必须包含用户数据段的段选择子,但当CPL等于0,ds寄存器必须包含内核数据段的段选择子。党卫军寄存器发生类似的情况:它必须引用用户模式堆栈中用户数据段的测井是3,它必须引用一个内核模式堆栈中内核数据段的测井是0。从用户模式到内核模式的切换时,Lin
21、ux总是确保党卫军寄存器包含内核数据的段选择子段。2.4分页在硬件分页单元线性地址转换为物理的。它检查请求的访问类型的线性地址的访问权限。如果内存访问无效,它将产生一个缺页异常(见第四章和第六章)。为了效率,线性地址分组在固定长度的间隔称为页;连续的线性地址映射到一个页面中的连续的物理地址。在通过这种方式,内核可以指定物理地址和页面的访问权限,而不是这些所有的线性地址。在通常的惯例,我们将使用“页面”的术语来表示一组线性地址和数据包含在这一组的地址。所有内存分区的分页单元认为(它们是固定长度的页帧有时被称为物理页)。每个页面都包含一个页面,也就是说,长度一个页帧的页面。一个页面框架组成的主内存
22、,因此它是一个存储区域。重要的是区分一个页面一个页面框架:前只是一个数据块可能存储在任何页面或磁盘上。线性地址到物理地址的映射的数据结构被称为页表;存储在主存,必须正确地初始化由内核启用之前分页单元。在英特尔处理器,通过设置启用分页PG cr0寄存器的旗帜。PG = 0时,线性地址解释为物理地址。2.4.1定期分页从i80386开始,英特尔处理器的分页单元处理4 KB页。的32位一个线性地址分为三个字段:目录最重要的10位表中间10位抵消最重要的12位线性地址的翻译是在两个步骤完成,每一个基于类型的转换表。第一个翻译表称为页目录,第二个叫做页表。页面的物理地址目录在使用存储在cr3处理器寄存器
23、。的目录字段内的线性地址确定点的页目录中的条目适当的页表。反过来,地址的表字段决定了进入该页面表,包含页面的物理地址包含页面的框架。偏移量字段决定了页面内的相对位置(见图2 - 5)。因为它是12位长,每个页面包含4096字节的数据。目录和表字段是10位长,所以页目录和页表可以包含多达1024个。由此可见,一个页面目录可以解决1024 x 1024x 4096 = 232记忆细胞,你期望在32位地址。页目录和页表的条目有相同的结构。每个条目包括以下字段:现在国旗如果它被设置,称为页面(或页表)包含在主内存;如果国旗0,页面不包含在主内存和剩余的条目可以使用由操作系统的目的。(16章,我们将看到
24、如何Linux利用这一领域)。字段包含20个最重要的页面框架物理地址因为每个页面有一个4 KB的能力,其物理地址必须的倍数4096,所以12的最低有效位物理地址总是等于0。如果这个领域是指一个页面目录,页面框架包含了一个页表;如果它是指页表,页面框架包含一个页面的数据。访问标志每次设置分页单元地址对应的页框。这个标志可以使用的操作系统在选择页面被换出。分页单位没有重置这个标志,这必须由操作系统完成。脏国旗仅适用于页表条目。设置每一次写操作在页面上执行框架。这面旗帜在前面的情况下,可以使用的操作系统在选择页面被换出。分页单元不重置这个标志,这必须由操作系统完成。读/写信号包含正确的访问(读/写或
25、读)的页面或页面(见表在本章后面部分的2.4.3)。用户/主管国旗包含的权限访问该页面或页表(见部分2.4.3)两个国旗称为PCD和佩恩表的编制者控制页面或页表的方式是由硬件缓存(参见章节2.4.6在本章后面)。页面大小的旗帜仅适用于页目录条目。如果它被设置,入口是指4 MB页长框架(参见下一节)。如果条目页表或页目录需要进行地址转换现在的国旗了,分页单元线性地址存储在cr2处理器注册并生成异常14日,也就是“页面错误”例外。2.4.2扩展分页与奔腾模型开始,英特尔80 x86微处理器引入扩展分页,这允许或4 KB页帧4 MB的大小(见图2 - 6)。正如我们所看到的在前一节中,通过设置启用分
26、页扩展页面大小国旗的页目录条目。在这种情况下,分页单元划分一个线性的32位地址为两个字段:目录最重要的10位抵消剩下的22位目录条目页扩展分页一样正常的分页,除了:x必须设置页面大小的旗帜。x只有前10的20位最重要的物理地址字段有很重要的意义。这是因为每个物理地址是4 MB边界对齐,所以22日最低有效位的地址都是0。启用扩展分页与常规分页共存;它通过设置PSE cr4的旗帜处理器寄存器。扩展使用分页翻译大间隔的连续线性的地址到相应物理的;在这种情况下,内核可以没有中间页表,从而节省内存。2.4.3硬件保护计划分页单元分割单元使用不同的保护计划。虽然英特尔处理器允许四种可能的特权级别的一段,只
27、有两个特权级别相关页面和页表,因为权限的控制用户/主管国旗2.4.1节所述。这个标志是0时,页面可以解决CPL只有当小于3(这意味着,对于Linux,当处理器内核模式)。国旗是1时,页面总是可以解决的。此外,而不是三种类型的访问权限(读、写、执行)联系在一起段,只有两种类型的访问权限(读、写)与页面相关联。如果读/写国旗的页目录或页表条目= 0,相应的页表或页面只能读,否则它可以读取和写入。2.4.4分页的一个例子一个简单的例子将有助于澄清分页是如何工作的。让我们假设内核分配0 x20000000和之间的线性地址空间0 x2003ffff运行的进程。这个空间是由64页。我们不关心的物理地址页帧包含页;事实上,他们中的一些人甚至可能不主内存。我们只剩下的页面的字段表条目。我们从10开始最重要的线性地址分配给这个过程,解释为目录字段的分页单元。地址从2开始其次是0,10位都有相同的值,即0 x080或128十进制。因此目录字段在所有进程的地址指的是第
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年执业医师结合理论与实践试题及答案
- 主管护师考试复习计划试题及答案
- 2025年学生需掌握的语文试题与答案
- 护理技能评定试题及答案总结
- 低抖动宽频带时钟源的研究
- 执业护士考试时资料复习建议试题及答案
- 非线性超声无损检测技术信号处理方法研究
- 从疏离到重聚-阿莉·史密斯《纵横交错的世界》中的空间叙事和记忆研究
- 健康评估方法的试题及答案联系
- Co3O4基催化材料结构调控与增效PMS活化机理研究
- 2025年云计算与大数据技术考试试题及答案
- 纳西族文化课件
- 水利水电工程技术术语全
- 2024-2025教科版科学一年级下册第二单元测试卷及答案
- 中国共产主义青年团纪律处分条例试行解读学习
- 医疗器械研究报告医疗器械产业现状及未来发展趋势分析报告(2025年)
- 数字孪生技术在智慧能源系统中的挑战与机遇
- 抛石专项施工方案
- 电力增材再造技术的创新与发展
- 话剧导演合同协议
- 客服代理合同协议
评论
0/150
提交评论