第1章基础知识(5)-80X86的工作方式与存储器物理地址的生成

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

11.580X86的工作方式与存储器物理地址的生成21.5.08086的工作方式与存储器物理地址的生成1.8086的工作方式只有实地址方式。32.存储器的地址生成8086CPU的地址引脚有20根,能提供20位的地址信息,可直接对1M个存储单元进行访问。但CPU内部可用来提供地址信息的寄存器都是16位的,那么如何用16位寄存器实现20位地址的寻址呢?4(1)存储器的分段管理8086的地址寄存器和PC是16位的,它只能管理216=64KB字节地址空间。8086/8088采用了分段结构的内存管理的方法。将指令代码和数据分别存储在代码段数据段堆栈段附加数据段(简城附加段)每一段最大64KB(216个字节),可用16位的地址寄存器管理。5代码段段基地址相对于段基地址的偏移量数据段段基地址相对于段基地址的偏移量这些段的段基地址分别由段寄存器CS、DS、SS、ES提供而代码或数据在段内的偏移地址则由有关寄存器或立即数给出。CSDSPC代码段段基址由CS给出数据段段基址由DS、ES给出堆栈段段基址由SS给出6代码段寄存器CS:存储程序当前使用的代码段的段地址。代码段用来存放程序的指令代码。下一条要读取指令在代码段中的偏移地址由指令指针寄存器IP提供;数据段寄存器DS:用来存放程序当前使用的数据段的段地址。一般来说,程序中所用到的原始数据、中间结果以及最终结果都存放在数据段中;7堆栈段寄存器SS:用来存放程序当前所使用的堆栈段的段地址。堆栈是在存储器中开辟的一个特定区域;附加数据段寄存器ES:用来存放程序当前使用的附加数据段的段地址。附加数据段通常用于存放字符串操作时的目的字符串。8程序员在编写汇编语言源程序时,应该按照上述规定将程序的各个部分放在规定的段内。每个源程序必须至少有一个代码段,而数据段、堆栈段和附加数据段则根据程序的需要决定是否设置。98086具有20位存储器地址,在对存储单元进行访问(读取指令或读/写操作数)时,必须在地址总线上提供20位的地址信息,以便选中对应的存储单元。CPU的寄存器都是16位(段基址寄存器和偏移地址都是)。那么,CPU是如何产生20位地址的呢?CPU提供的用来对存储单元进行访问的20位地址是由BIU中的地址加法器产生的。(2)8086处理器存储器物理地址的生成10存储器中每个存储单元的地址可有以下两种表示方式:(1)逻辑地址逻辑地址是程序设计时使用的地址,它由段基地址和段内偏移地址构成。逻辑地址的表达形式为:段地址:段内偏移地址段内偏移地址:又称为“有效地址EA”(EffectiveAddress)。它是指令或数据相对于他的段基地址的偏移量。在读指令时,段地址由代码段寄存器CS提供,当前要读取指令在代码段中的偏移地址由指令指针寄存器IP提供;在读取或存储操作数时,根据具体操作,段地址由DS、ES或SS提供,段内偏移地址由指令给出。11(2)物理地址:CPU与存储器进行数据交换时在地址总线上提供的20位地址信息称为物理地址。物理地址的形成过程如图所示。12段寄存器内容左移4位二进制位13段寄存器内容左移四位后(相当于乘以10H),与16位段内偏移地址,在BIU中的地址加法器中进行相加,形成一个20位的物理地址。这就是由逻辑地址求出物理地址的方法。由逻辑地址求物理地址的公式为:物理地址=段地址10H+段内偏移地址例如:假设当前(CS)=1000H,取出当前指令后指令指针(IP)=4052H,求下一条指令的地址。1000H左移4位后为:10000H,它与4052H相加10000+4052=14052h。下一条指令所在存储单元的物理地址为14052H。1000040521405214数据寻址与指令寻址类似区别只是偏移地址一般由指令给出,而不是唯一的由IP给出(段寄存器也会有差异)151.5.180X86的工作方式8086:只有实地址方式80286:实地址方式、虚地址保护方式80386、80486:实地址方式、虚地址保护方式、虚拟8086方式Pentium:实地址方式、虚地址保护方式、虚拟8086方式、系统管理方式所有处理器的实地址方式都和8086实地址方式相同复位后,全部80X86处理器都工作在实地址方式161.实地址方式与8086相同,只能寻址1MB存储器空间。存储器20位物理地址的生成与8086相同物理地址=段寄存器左移4位+段内偏移地址172.保护方式又叫虚地址保护方式。支持虚拟存储器、多任务、特权级和特权保护的工作方式。具有32位物理存储器地址,可管理4GB物理内存。由主内存和辅助存储器提供的虚拟内存空间可达64TB在该方式下,段寄存器的内容已不是段基地址,而是段选择子——由该段选择子在段描述符表中选择一个段描述符,段描述符中给出了32位的段基地址、段的长度限制、特权级,以及其他段的属性描述。183.虚拟8086方式是一种在32位保护方式下支持16位实地址的应用程序运行的特殊方式处理器工作在32位保护方式,但又虚拟出8086的实地址方式。通过操作系统管理,可以在保护方式下虚拟出多个8086处理器——8086虚拟机。194.系统管理方式为系统管理而设置。系统设计人员可以利用该方式实现高级管理功能,例如对电源实施管理——降低功耗等对操作系统和正在运行的程序实施管理提供安全管理205.四种方式的切换实地址方式保护方式虚拟8086方式系统管理方式211.5.280X86存储器物理地址的生成1.实地址方式下物理地址的生成。与8086相同。222.保护方式下存储器物理地址的生成实模式是模仿8086工作。保护模式下,CPU寻址内存的机制与实模式不同——它首先需要满足保护规则,然后才能进行寻址。80X86是多任务系统保护规则——每个任务,分配一定的内存资源和对内存的读写权限,如果某个任务对内存的访问超过了分配给它的内存区域或超越了读写权限,CPU将拒绝这次访问,并给出告警。保护模式下:线性地址=32位基地址+偏移地址。在实模式下:物理地址=段基地址×4+偏移地址保护模式下,段寄存器仍然是16位,但它已不是段基地址,而是段选择子,通过它选择段描述符,从段描述符中获得32位基地址。23(1)在保护模式下,新的寄存器全局描述附表寄存器GDTR局部描述附表寄存器LDTR中断描述附表寄存器IDTR任务寄存器TR原来的通用寄存器扩展为32位寄存器:EAX,EBX,ECX,EDX。标志寄存器EFLAG有了更多的定义位,控制寄存器CR0,CR1,CR2,CR3被实际使用。在保护模式下,16位的段寄存器CS、DS、ES、SS的内容作为段选择子24(2)段选择子段选择子被用于在描述符表中选择一个段描述符,再从描述符中获得32位的段基地址,该基址与32位的偏移地址相加,得到线性地址。线性地址——按顺序编号的地址。D15D3D2D1D0段描述符索引DITIRPLDI——在段描述符表中检索描述符,描述符表可以有8192个描述符TI——描述符表指示标志,=0,从GDT检索,=1,从LDT检索描述符RPL——请求特权级,0~3级,3级最低。16位段选择子位25(3)描述符表和描述符表寄存器在寻址过程中的作用描述符表:RAM中设置的一个区间,在该区间存放有很多描述符。描述符:为一个特定的数据结构,每个描述符占8个字节,段长限15~001段基地址15~023P45DPL段基地址23~16ATYPEDT段基地址31~24G7D7D6D5D4D3D2D1D0D7D6D5D4D3D2D1D0D00段长限19~166D7D6D5D4D3D2D1D0D7D6D5D4D3D2D1D0段长限15~0段基址23~0段长限19~15,段属性段基址31~241字节2字节3字节2字节26G(Granularity):粒度位。表示段的长度是以字节为单位还是以页为单位:0——字节;l——页。D(Default):表示缺省操作数的位数。当指令中没有明确操作数或偏移量的位数时,根据D位来确定:0——16位;1——32位。该位仅用于代码段描述符。P(Present):表示段是否存在于物理存储器中(0——不存在;1——存在)。注意:在启用页功能的情况下,即使P为1,所描述的段也未必整个都在物理存储器中,可能该段的若干虚拟页面被安排在辅存中。DPL(DescriptorPrivilegeLevel):表示段的特权级(优先级)。段的特权级分成0,1,2,3四级,0的级别最高,3的级别最低。一般用户程序使用的段特权级为3,而操作系统及其他内核心程序的段特权级特权级为0。当前程序段(代码段)的DPL叫当前特权级(CurrentPrivilegeLevel,CPL)。27DT(DeseriptorType):表示描述符类型:1——存储器的段描述符,0——系统的段描述符/门描述符。A(Accessed):表示从上次该位被清0后,该段是否被访问过(0——未被访问过,1——被访问过)。在物理存储器中进行段的替换时要用到此位。例如,P=1、A=0的段表示在存储器中且未被访问过,可以被替换掉。TYPE:共包含3位,用来表示段的存取权限,如只能读、只能执行、可读/可写等。这3位对于代码段和数据段的含义有所不同,如下表所示。数据段、堆栈段代码段TYPETYPEEEDWECR000只读(禁止写)100只执行001读/写101执行/读010只读,向下扩展110只执行,一致的代码段011读写,向下扩展111执行/读,一致的代码段28·E:E=0表示数据段,E=1表示代码段。·ED(ExpansionDirection):仅对数据段有意义。它指明段的地址范围在使用时是从基地址向高位地址方向扩展(ED=0),还是从段的最大偏移量处向低位地址方向扩展(ED=1)。对一般数据段来说,ED位取0。对堆栈段来说,若采用下堆式(随着入栈数据的增加,栈指针的值减小),ED位应取1。目前PC系列机的堆栈一般采用下堆式,故ED位取1。·W(Writable):仅适用于数据段,表示这个数据段是(W=1)否(W=0)可被写入。该位为重要数据提供了写保护措施。29·C(Conforming):仅适用于代码段。它表示段被一个较低特权的程序(任务)所调用时,是(c=0)否(C=1)要改变CPL的值。如果C=1,则该描述符所描述的段被称为“符合的代码段”(或“一致的代码段”),因为这个代码段被调用时,不需要改变CPU的值。·R(Readable):仅对代码段有意义。它表示该代码段是(R=1)否(R=0)可被读取。当然,对程序段来说,通常都是“可执行的”。R位取O可防止用户程序对存储器里的“目标程序代码”做手脚。R位为0的描述符只能加载到CS的描述符寄存器;而R位为l的描述符可加载到CS、DS、ES、Fs及GS的描述符寄存器,此时,可以读取段内的数据(程序代码)。30(4)描述符表寄存器GDTR、IDTR——48位寄存器,存放全局描述符表GDT、中断描述附表IDT在内存中的32位线性地址和16位的界限值。D47D16D15D0段描述符表索引DI(段描述符在内存中的首地址)界限值LDTR——16位寄存器,用于存放选择子。通过它,在全局描述符表中获得当前LDT的基地址。LDT是由操作系统针对某一特定任务建立的。通过描述符,可以很好的管理内存,实现不同任务间的保护。当然,使用也变得比8086的是模式要复杂的多了。31(5)寻址段寄存器(CS,DS,ES,SS等)作为选择子,高13位是描述符表的偏移地址。TI=0,表示是全局任务寻址,这时不用LDTR,直接通过段寄存器中的选择子和GDTR获得全局描述符,然后获得线性地址限长表基地址GDTR段寄存器物理存储器RAM描述符物理存储器RAM被寻址单元基地址32位偏移地址32位线性地址无分页时的寻址16位32段寄存器的第三位TI=1是一个局部任务。这时需要GDTR、LDTR、段寄存器一起找到局部段描述符。LDTR的高13位在GDT中获得一个描述符,该描述符的32位基地址指示的是该任务的LDT的首地址(基地址),它的限长是对应该任务的LDT的长度。段寄存器的高13

1 / 35
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功