您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 毕业设计英文翻译111
第2章存储器寻址这一章处理处理技术。幸运的是,一个操作系统不是被迫跟踪物理内存本身;今天的微处理器包括几个硬件电路使内存管理更高效和更健壮的编程错误在这本书的其余部分,我们提供细节在本章关于80x86Intel微处理器地址内存芯片和Linux如何利用可用的解决电路。我们希望你会发现,当你学习Linux的实现细节最受欢迎的平台你会更好地理解分页的一般理论和方式研究在其他平台上实现。这是第一个内存管理相关的三章:第六章,讨论如何内核分配内存,而第七章,考虑如何线性地址分配给进程2.1存储器寻址程序员随意引用一个内存地址的方式访问的内容一个存储单元。但在处理80年英特尔x86微处理器,我们必须区分在三种地址:逻辑地址包含在机器语言指令指定一个操作数的地址一条指令。这种类型的处理体现了著名的英特尔分段架构,部队ms-dos和Windows程序员把他们的程序成段。每个逻辑地址由一个部门和一个偏移量(或位移),表示距离的开始段的实际地址。线性地址一个32位无符号整数,可以用来解决4GB,即到4294967296记忆细胞。线性地址通常用十六进制表示符号,它们的值从0x000000000xffffffff。物理地址用于解决记忆细胞包含在内存芯片。他们对应电信号发送的地址别针的微处理器内存总线。物理地址表示为32位无符号整数。CPU控制单元将逻辑地址转换成一个线性地址的硬件电路称为细分单元;先后,第二个硬件电路称为分页单元将线性地址转换成物理地址(见图2-1)。2.2硬件分割从80386年模型开始,英特尔微处理器执行两个地址转换不同的方式称为实模式和保护模式。实模式的存在主要是为了维护与老款处理器兼容性和允许操作系统引导(见附录A,一个简短的描述的模式)。我们将关注保护模式。2.2.1段寄存器一个逻辑地址由两部分组成:一段标识符和一个指定的偏移量段内的相对地址。段标识符是一个16位的领域称为段选择器,而抵消是一个32位的领域。使它容易快速检索段选择符,处理器提供细分寄存器的唯一目的是持有段选择符;这些寄存器称为cs,党卫军,ds,es、fs和gs。虽然只有六个人,一个程序可以重用相同的分割注册不同的目的在内存中,然后通过保存其内容恢复它。三个六段寄存器有特定的用途:Cs代码段寄存器,它指向包含程序指令的部分Ss堆栈段寄存器,它指向一个包含当前程序段堆栈Ds数据段寄存器,它指向包含静态和外部的部分数据其余三个段寄存器是通用,可能指的是任意的段。cs寄存器还有另一个重要的功能:它包括一个2比特字段,该字段指定当前特权级别(CPL)的CPU。值表示最高的特权级别,而3表示价值最低的一个。Linux和3只使用水平,分别称为内核模式和用户模式。2.2.2段描述符每一部分都由一个8字节段描述符表示(见图2)描述段特征。段描述符存储在全局描述符表(GDT)或在局部描述符表(LDT)。通常只有一个GDT定义,虽然每个进程可能有自己的LDT。的地址GDT在主内存中包含gdtr处理器寄存器的地址目前使用LDT包含ldtr处理器寄存器中。每一段描述符包含以下字段:x一个32位的基本字段包含的线性地址段的第一个字节。xG粒度国旗:如果是清除,表达的片段大小字节;否则,它在4096字节的倍数表示。x20位限制字段表示段长度,以字节为单位。如果设置为0,大小1个字节之间的一个非空段可能不同和1MB;否则,它可能会有所不同4KB和4GB之间。xS系统标志:如果它被清除,段是一个系统段存储内核数据结构;否则,它是一个正常的代码或数据段。x4比特类型字段描述段类型及其访问权限。的后段描述符类型广泛应用:代码段描述符表明段描述符是指一个代码段,它可能包括在内在GDT或LDT。描述符设置年代标志。数据段描述符表明,指的是一个数据段的段描述符,它可能包括在内在GDT或LDT。描述符设置年代标志。堆栈段实现通过通用数据段。任务状态段描述符(TSSD)表明任务状态段的段描述符是指(TSS),也就是说,一段用来节省处理器寄存器的内容(参见3.2.2节第3章);它只会出现在GDT。对应的类型字段的值11、9,这取决于相应的进程当前正在执行的CPU。S标志的描述符设置为0。局部描述符表描述符(LDTD)表明段描述符是指一段包含LDT;它可以只有在GDT出现。对应的类型字段的值2。S的旗帜这样的描述符设置为0。xDPL(描述符特权级)2比特字段用来限制访问的部分。它代表了CPU的最小特权级别请求来访问。因此,一套段DPL的CPL时只能是0,也就是说,在内核模式,而与其DPL段设置为CPL3访问每一个值。xSegment-Present国旗将如果段目前不存储在主内存。Linux总是将这个字段设置为1,因为它从来没有互换整个片段磁盘。x额外国旗称为D或B取决于段包含代码或数据。它的意义略有不同在这两种情况下,但它基本上是如果地址用作部分抵消32位长,如果他们是16位长(见英特尔手册详情)。x保留一点(53)总是设置为0。xAVL国旗由操作系统可以使用,但Linux中被忽略。2.2.3段选择符加快逻辑地址转化为线性地址,英特尔处理器提供了一个额外的nonprogrammable注册该是,不能由一个寄存器程序员的六个可编程分割寄存器。每一个nonprogrammable寄存器包含8字节的段描述符(在前面的描述部分)指定的段选择器中包含相应的分割登记。每次一段选择符是装载在分割登记,从内存加载到相应的段描述符匹配nonprogrammableCPU寄存器。从那时起,指的是译文的逻辑地址这部分可以不执行访问GDT或LDT存储在主存;处理器可以直接提及CPU寄存器包含段描述符。访问GDT或LDT只有当分割的内容是必要的注册改变(见图2-3)。每段选择器包括以下字段:x可索引(进一步在该列表后的文本描述)来标识的相应的段描述符中包含的条目GDT或LDTx一个TI(表指示器)标记,用于指定是否包括段描述符GDT(TI=0)或在LDT(TI=1)x的RPL(请求者的特权级)2比特字段,这正是当前特权级别的CPU当加载到相应的段选择器cs寄存器[1][1]RPL领域还可用于选择性地削弱处理器特权级别的访问数据段时,看到英特尔文档细节。因为一段描述符是8个字节长,它在GDT或LDT相对地址相乘得到的最重要的13位的段选择子8。为实例,如果GDT是0x00020000(值存储在gdtr寄存器)和索引指定的段选择子是2,对应的段描述符的地址是0x00020000+(2x8)或0x00020010。第一项GDT总是设置为0,这可以确保逻辑地址无效段选择子将被认为是无效的,因此导致处理器例外。的最大数量的段描述符可以存储在8191年GDT因此,也就是说,213-1。2.2.4分割单元图2-4显示了详细逻辑地址是如何转化为相应的线性地址。分割单元执行以下操作:x检查TI的段选择器,以确定哪些描述符表存储段描述符。这个字段表示描述符在GDT(在这种情况下,分割单元的基本线性地址GDTgdtr注册)或活动LDT(在这种情况下,分割单位得到了基本的线性地址LDTldtr寄存器)。x计算的地址段的段描述符的索引字段选择器。索引字段是乘以8(大小的段描述符),和结果被添加到gdtr或ldtr寄存器的内容。x增加了基地的段描述符逻辑地址的偏移量,因此得到线性地址注意,由于nonprogrammable寄存器与分割寄存器,第一个需要执行两个操作只有当一个分割登记被改变了。2.3市场细分在Linux中分割已经包含在英特尔微处理器鼓励程序员分裂他们的应用程序在逻辑上相关的实体,如子例程或全球和本地数据区域。然而,Linux使用分割在一个非常有限的方式。事实上,分割和分页都有点冗余自可用于单独的物理地址空间的流程:细分可以分配一个不同的线性地址空间中每一个过程分页可以同一个线性地址空间映射到不同的物理地址空间。Linux喜欢分页细分为以下原因:x内存管理更简单,当所有进程使用相同的段寄存器值,也就是说,当他们分享相同的一组线性地址。x的设计目标之一Linux可移植性最流行的体系结构;然而,几位RISC处理器支持在一个非常有限的方式分割。2.2版本的Linux使用分割只有当所需的80x86Intel体系结构。特别是,所有进程使用相同的逻辑地址,所以的总数段定义是相当有限的,可以存储所有的段描述符全局描述符表(GDT)。此表由gdt_table数组实现提到的gdt变量。如果你在源代码中指数看,你可以看到这些文件中定义的符号是arch/i386/kernel/你们觉得。每一个宏,功能,和其他象征在这本书中附录中列出,这样你就可以很快找到它在源代码中。局部描述符表不使用的内核,尽管存在一个系统调用,它允许流程创建自己的LDTs。这是有用的应用程序,如酒执行segment-orientedMicrosoftWindows应用程序。这里是Linux使用的部分:x内核代码段。中相应的段描述符的字段GDT有以下值:o=0x00000000基地o=0xfffff限制oG(粒度国旗)=1,部分页面大小oS(系统国旗)=1,正常的代码或数据段o=0xa类型,可以读取和执行的代码段oDPL(描述符特权级别)=0,内核模式oD/B(32位地址标志)=1,32位的偏移地址因此,相关的线性地址段开始,到达解决232-1的极限。年代和类型字段指定一个代码段段,可以读取和执行。其DPL值为0,从而可以访问它在内核模式。相应的段选择符是由__KERNEL_CS定义宏观:为了解决部分,内核加载产生的值宏成cs寄存器。x内核数据段。中相应的段描述符的字段GDT有以下值:o=0x00000000基地o=0xfffff限制oG(粒度国旗)=1,部分页面大小oS(系统国旗)=1,正常的代码或数据段o型=2,可以读取和写入的数据段oDPL(描述符特权级别)=0,内核模式oD/B(32位地址标志)=1,32位的偏移地址这部分是与前一个相同(事实上,他们在线性地址重叠空间)除了类型字段的值,它指定一个数据段可以读和写。相应的段选择符被定义为__KERNEL_DS宏。x用户在用户模式下所有进程共享的代码段。的字段相应的段描述符的GDT有以下值:o=0x00000000基地o=0xfffff限制oG(粒度国旗)=1,部分页面大小oS(系统国旗)=1,正常的代码或数据段o=0xa类型,可以读取和执行的代码段oDPL(描述符特权级别)=3,用户模式oD/B(32位地址标志)=1,32位的偏移地址年代和DPL字段指定的段段,它不是一个系统特权级别等于3,因此可以在内核模式和用户访问模式。相应的段选择符是__USER_CS定义的宏。x用户数据段共享的所有进程在用户模式。的字段相应的段描述符的GDT有以下值:o=0x00000000基地o=0xfffff限制oG(粒度国旗)=1,部分页面大小oS(系统国旗)=1,正常的代码或数据段o型=2,可以读取和写入的数据段oDPL(描述符特权级别)=3,用户模式oD/B(32位地址标志)=1,32位的偏移地址这段重复前一个:他们是相同的,除了的价值类型。相应的段选择符是__USER_DS定义的宏。x任务状态段为每个进程(TSS)段。的描述符部分存储在GDT。TSS的基本字段描述符相关每个进程包含tss的地址字段对应的过程描述符。G标志被清除,而限制字段设置为0xeb,因为TSS段是236个字节长。类型字段设置为9或11(32位TSS),和DPL设置为0,因为流程在用户模式下是不允许访问TSS段。x一个默认LDT段通常是由所有进程共享。这段存储在default_ldt变量中。默认LDT包含一个条目组成的空段描述符。每个进程都有自己的LDT段描述符,它通常指向共同违约LDT段。基本字段设置为地址default_ldt和限制字段设置为7。如果一个进程需要一个真实的LDT,创建一个新的4096字节段(它可以包含多达511段描述符),默认LDT段描述符与这一过程相关联在GDT新的描述符换成基础和特定的值限制字段。对于每一个过程,因此,GDT包含两个不同的段描述符:一
本文标题:毕业设计英文翻译111
链接地址:https://www.777doc.com/doc-2274501 .html