`

32位寻址

 
阅读更多

转载:http://blog.csdn.net/jerry_zjnb/article/details/7907768

文章来自网络,在此感谢原作者。

 

32位cpu 地址线扩展成了32位,这和数据线的宽度是一致的。因此,在32位机里其实并不需要采用“物理地址=段:偏移”这种地址表达方式。原来在16位机里规定的每一个段不大于64kb在32位机里也不是必要的。所以,对于32位机来讲,最简单的方法就是用一个32位数来标识一个字节的存储地址,寻址时只要给出一个32位数就可以直接找到地址。这种地址储存模型就属于“平展储存模型”。

但是,新产品一般都希望遵循“向下兼容”这个原则。所以,32位机里完整的保留了16位寻址模式。即:寻址能力为1M;分段机制;每段不超过64kb。这就是通常所说的"实模式"。在地址储存模型中属于“实地址储存模型”。

其次,考虑到程序通常都是功能化的模块,所以分段虽然不是必要的,但分段却能大大提高 编程者管理程序的效率。故而32位机也采用了段+偏移的模式来寻址。但与实模型不同的是,由于地址线和数据线宽度一致,因而,每个段最大可以到4G,并且 段基址也是32位的无需进行左移处理。在地址储存模型中这属于“段地址储存模型”。然而需要注意的是,在32位机里,虽然通用寄存器,标志寄存器等都扩展 成了32位,但是段寄存器却依然是16位的(为什么不做改变??我猜可能是这样便于向下兼容)。所以在32位寻址时,段寄存器里放的不再是段基址(位数不够,放不下)而是一个选择子。这个选择子对应了一个64-bit长的描述符,64-bit的描述符里有32-bit是段基址。所以原来在16位机里通过段寄存器一步就可以找到段基址,而现在在32位机里分成了两步:先找选择子,然后通过选择子找段基址。段基址找到了,再加上偏移地址,物理地址就找到了。看样子,32位段模式寻址已经介绍清楚了。其实,这里头的故事还远没有讲完。

在上面简述的过程中,很容易发现有两个问题没有交待。(1)CPU是如何将选择子与描 述符对应起来的?(2)既然是64-bit的描述符,32位用来表示基地址,那么余下的32位是干什么用的?另外,当32位机发展起来的同时,操作系统也 有了长足进步,单任务模式的DOS被多任务的windows所取代。也就是说,现在驻留在内存中的往往不止是一个程序,而很可能是多个程序同时在内存中。 现在又没有了段大小的限制,程序之间便很有可能相互抢地址,如果核心程序被破坏,计算机就会崩溃。这就好比在马路上走车,如果只有一辆车开,怎么开都可 以,但是如果车多了不制定个交通规则,车便会抢道,道路就会瘫痪。所以,在多任务的情况下,必须给寻址也制定一个“交通规则”,这样才能保证多任务系统有 序的工作。制定什么样的规则呢?首先,既然程序是在无意识的情况下抢占了别的程序的地址,那么如果在寻址时包含一个查询的过程就可以有效的避免抢地址的情 况发生。也就是说,先得问一问那个地址是不是已经有程序段占用了?同时已占上地址的程序段除了告知CPU自己的基地址外还应该告诉CPU自己的长度信息。 这样别的程序段才能方便地查询。第二,多任务寻址最好应该包含优先级别的内容,已备紧急情况下为核心程序让道。这好比在马路上,一般情况下车是遵守规则 的,但如果是警车或救护车执行任务时,就可以优先抢占别的车的道。所以,还应该定义一个优先级。然后,由占上地址的程序段告诉CPU自己的优先级别。总的 来讲,原来在16位机里很单纯的一个“段”的概念现在变得复杂了。如同人的成长过程,刚开始的时候思维总是很幼稚的,相应的也只能解决简单的问题,只有当 你的思维摆脱幼稚的时候,才有能力解决更为复杂的事情。现在CPU摆脱了幼稚的16位,它在描述“段”的时候当然不应该像16位时那么肤浅。在32位机里,“段”有三个要素:基地址,长度,属性(属性里包含了优先级和其它的一些内容)。为了能一次完整的引用或者给出这三个要素,需要新定义一个数据结构。这个结构就是前面所提到的描述符,每一个描述符都占有64-bit(8b),有足够的长度来包含段的三个要素。当 然,现在内存中不止一个程序,而且程序也不止一个段,所以描述符也不会有一个,而是很多个。最简单的管理方法,就是将所有的描述符集中起来放在一块连续的 存储空间里,然后给各个描述符排上序号。当要找某一个特定的描述符时,只要先找到这块连续的存储空间然后给出序号就可以了。这些集中起来的描述符形成了一 张表,所以通常被叫做描述符表。所以,想找到一个段的信息,首先要找到描述符表。也就是说,找特定的描述符先要知道描述符表的基地址。在 32位cpu中,有一个48位的专用寄存器用来存放全局描述符表的信息,这个寄存器叫做GDTR。其中,高32位给出了全局描述符表的基地址,低16位给 出了描述符表的长度限制。所以,一张全局描述符表最长可以是64kb。那么,最多可以放64kb/8b=8k个描述符。所以如果想在其中选择任意一个描述 符,用13位就可以办到了。在32位cpu中,16位段寄存器的高13位就用来存放特定描述符的序号。其实,现在段寄存器的功能就是选择描述符,正因为如此,通常也把段寄存器叫做选择器。那么,经过冗长的介绍,现在32位段寻址的过程已经大体依稀浮现在眼前了:在段寄存器里找到序号,在GDTR中找到全局描述符表的基地址,然后就可以找到目的描述符。再从描述符中取出段的基地址,然后加上偏移地址,这样就得到了段的“物理地址”。

真是令人兴奋,这样的寻址过程为执行多任务提供了有力的保障,可以想象这是计算机执行 性能上的一次飞跃!从此高速的cpu再也不会为无用武之地发愁了,它可以最大限度的发挥自己速度快的优势,同时处理好多个任务。是的,当我们眼前出现了新 的景象的时候,我们有理由兴奋。但是,我们不应该就此满足。我们应该沿着新天地撇给我们的一丝亮光,继续前行,去找到这片新天地。人就是在这样的前行中不 断让事情变得更完美。到这里,我们对于寻址过程的了解,只是开了一个头而已,但这是一个好头,我们体会到了32位cpu的强大优势。这足以让我们对完整的 32位CPU寻址充满了期待。让我们鼓舞士气,沿着前人的足迹继续前行吧!

我们知道,程序代码和数据必须驻留在内存中才能得以运行,然而系统内存数量很有限,往 往不能容纳一个完整程序的所有代码和数据,更何况现在是多任务系统,想让内存驻留所有任务程序显然不太可能。老式系统就是将程序分割成小份,只让当前系统 运行它所有需要的那部分留在内存,其它部分都留在硬盘。当系统处理完当前任务片段后,再从外存中调入下一个待运行的任务片段,而且这个工作是由程序员自行 完成。显然这增加了程序员的负担。
由此针对多任务系统发展了一种虚拟内存技术。虚拟内存技术就是一种由操作系统接管的按需动态内存分配的方法,它允许程序不知不觉中使用大于实际物理空间大小的存储空间(其实是将程序需要的存储空间以页的形式分散存储在物理内存和磁盘上)。虚拟内存是将系统硬盘空间和系统实际内存联合在一起供进程使用,给进程提供了一个比内存大得多的虚拟空间。 在程序运行时,把虚拟地址空间的一小部分映射到内存,其余都存储在硬盘上(也就是说程序虚拟空间就等于实际物理内存加部分硬盘空间)。当被访问的虚拟地址 不在内存时,则说明该地址未被映射到内存,而是被存贮在硬盘中,因此需要的虚拟存储地址随即被调入到内存;同时当系统内存紧张时,也可以把当前不用的虚拟 存储空间换出到硬盘,来腾出物理内存空间。 这样,为了提高系统性能,发展了虚拟内存技术,那么相应的,32位cpu也应该发展新的寻址技术来管理虚拟内存。这是通过页机制来实现的。
因为使用页机制的原因,前面提到的通过段机制转换得到的地址仅仅是作为一个中间地址——线性地址了,该地址不代表实际物理地址,而是代表整个进程的虚拟空间地址。还得有一个将虚拟地址转换成物理地址的过程。

让我们来认识一下页机制。它就是把内存分成一个一个连续的页,每页大小4kb。与段不 同,页不是程序功能块的体现。一个程序功能块可能占用好多个页。现在内存就像一本书了,一页一页的,每页的容量都是相等的。当然,我们很快可以联想到,要 想能够很快的找到某页,最好给这本书分个章或者节什么的,然后逐级地向下查询。这就是32位cpu里页目录页表所起的作用。页目录的长度是4kb,它最多可以包含1024个页目录项,每个页目录项32-bit,包含了页表的地址和有关信息。所以,页目录把4Gb空间分成了1024个页组,每个页组4MB的大小页表的长度也是4kb,1024个页表项,每个页表项32-bit,包含页的地址和其它信息这样,4MB的页组又被分成了1024个页面,每个页面大小4kb。所 以找到某一个页就是先查页目录再查页表这么一个过程。为了找到页目录,我们需要知道其基地址。在32位cpu里,CR3寄存器里高20位放的就是页目录的 地址,因为页目录的低12位总是0,这样保证页目录始终是页对齐的(每页大小4kB)。再来看一看前面通过32位段机制找到的线性地址。其高10位是页目 录的偏移地址,一共1024个页目录用10位就可以标识可能的最大偏移了。加上CR3,就可以找到页目录,然后再通过页目录找到页表的基地址,线性地址的 中间10位放的是页表的偏移量,这样就找到了页表。最后页表的基地址再加上CR3最低12位所表征的页表的偏移地址就找到了页,这个页的地址就是最终的物 理地址。

前面提到,之所以采用页机制是为了虚拟内存技术。所以页目录也好,页表也好,除了地址信息外还有一些属性信息,比如,当前页表是不是在内存中等等。这样才能方便系统管理虚拟内存实施换进换出的功能。这里就不详述了。

总的来讲,32位寻址先通过32位段机制找到一个32位地址,如果没有采用分页,那么 它就是物理地址。否则,只是一个线性地址,然后再通过CR3,页目录,页表找到页的地址,它才是最终的物理地址。其实,还用很多细节没有涉及到,比如这里 提到的描述符表是全局描述符表,实际上还有局部描述符表,再比如描述符只重点介绍了地址位,优先级位和其它属性位都没有介绍。但是,一个完整的寻址图像已 经展现在我们眼前了。它包含了32位CPU里的所有重要机制。剩下的问题不妨采取暂不过问,现用现学的方法。

 

博主总结:IA-32CPU三种内存模式

Flat memory model:
直接给出32位数即可寻址

Segmented memory model:
32位CPU中存在一个48位的全局描述符表寄存器(GDTR),其中高32位存放GDT的基地址,低16位存放GDT的长度限制。所以,GDT长度最大 能达64kb(2^16),又因为每个描述符(Descriptor)占64位(8byte),所以GDT最多能放8k(64kb/8b)个描述符。所 以,对于这8k(2^13)个描述符,可以用13位的数来定位,32位CPU中16位段寄存器的高13位就是用来存放描述符的索引(0到8k),此时段寄 存器又被称为选择子(Selector)。
总结:16位段寄存器 -> 根据GDTR提供的GDT基地址计算出目的描述符的内存地址 -> 根据目的描述符中的基地址,加上偏移地址,实现32位寻址。

Real-address mode memory model:
寻址能力为1M;分段机制;每段不超过64kb。寻址方式:物理地址 = 段地址 : 偏移地址

分享到:
评论

相关推荐

    OS32位寻址提升36位寻址即64G

    标题"OS32位寻址提升36位寻址即64G"和描述"OS32位寻址提升36位寻址即64G,突破4G内存限制"正是指的这种对内存寻址能力的扩展。 32位系统的寻址空间是由32条地址线决定的,每一条可以表示0或1,总共可以组合出2^32种...

    寄存器间接寻址怎么算

    寄存器间接寻址(register indirect addressing) 操作数...寄存器的使用在16位寻址和32位寻址时不一样。 (1)16位寻址 寄存器 有效地址存放在SI, DI, BX, BP中。 如果指令中指定的寄存器是BX, SI, DI,则操作数......

    计算机寻址.pdf

    在32位微机系统中,寻址机制允许程序访问大量的内存空间,从而有效地执行各种计算任务。以下是根据给定信息对32位地址偏移量寻址方式的详细解释: 1. **有效地址计算**: 32位地址偏移量寻址的有效地址计算公式...

    stm32f1 iic寻址.rar

    本项目中的"STM32F1 IIC寻址"是针对STM32F1微控制器的IIC设备自动寻址程序。该程序的主要功能是扫描IIC总线,识别并输出连接到总线上的所有设备的地址。这在系统配置、故障排查或者新设备接入时非常有用,可以避免...

    32位微机原理上机实验报告:7种寻址方式指令编程

    在32位微机原理的学习中,寻址方式是理解计算机如何访问内存中数据的关键概念。本次实验报告主要探讨了七种寻址方式,并通过编程实践来深化理解。以下是这七种寻址方式的详细说明: 1. **立即寻址**:在此模式下,...

    寻址范围解释及计算方法

    在这个例子中,8051的地址范围是从0000H到FFFFH,涵盖了从二进制0000000000000000到1111111111111111的所有可能地址,即十进制表示的0到65535,或64KB。 #### 寻址范围的计算方法 计算寻址范围的公式为:\(寻址...

    Win汇编语言寻址方式PPT教案.pptx

    在32位寻址中,位移量可以是8/16/32位,基址和变址寄存器的选择更为灵活。 直接寻址方式允许直接使用绝对的内存地址,如`MOV AX, [2000H]`,但也可以使用符号地址,如变量的定义。例如,`VALUE DB 10`定义了一个...

    微型计算机原理及应用:第3章 8086的寻址方法和指令系统.ppt

    4.寄存器间接寻址:操作数地址的偏移量(有效地址 EA)存放在寄存器中,16 位寻址:偏移地址放在 SI、DI、BP、BX 中,以 SI、DI、BX 间接寻址,默认操作数在 DS 段中,32 位寻址:偏移地址放在 8 个 32 位通用寄存器...

    32位汇编语言程序设计课件

    2. **32位寻址**:32位汇编语言的一个重要特性是支持32位的地址,这意味着可以访问4GB的内存空间。课程可能会讲解不同寻址模式,如直接寻址、间接寻址、相对寻址等,并通过实例来展示如何使用它们。 3. **指令系统*...

    详解西门子间接寻址详解西门子间接寻址

    双字指针的前三位(0-2位)以八进制指示位编号(0-7),后16位(3-18位)指示从0到65535的字节编号。 #### 指针的使用示例 为了更好地理解单字和双字指针的应用,以下是一些具体的示例: 1. **单字指针示例**:...

    西门子STEP7详解西门子间接寻址

    双字指针是一个 32bit 结构,从 0-2bit,共三位,8 进制指示被寻址位编号,也就是 0-7;而从 3-18bit,共 16 位,指示一个从 0-65535 数值,这个数值就是被寻址字节编号。 西门子间接寻址应用 西门子间接寻址可以...

    scl寻址方式.docx

    双字寻址是指直接或间接访问一个双字(32位)的位置。双字寻址的方式包括: - **M区**:例如 `%MD(#Byte_Offset)` 表示访问MD5双字位置。 - **I区**:例如 `%ID(#Byte_Offset)` 表示访问ID5双字位置。 - **Q区**:...

    51单片机,arm等处理器的寻址方式对照表

    #### 二、ARM处理器寻址方式解析 ARM处理器因其高性能和广泛的适用性,在嵌入式系统中有着重要的地位。下面详细介绍ARM的几种主要寻址方式。 ##### 1. 立即寻址 立即寻址也被称为立即数寻址,操作数直接包含在指令...

    NAND Flash寻址方式

    在这种寻址模式下,地址分为三个部分:列地址(Column Address)、页内地址(Page Address within Block)和块地址(Block Address)。寻址过程分为三个步骤: - 第一步:通过I/O线传递列地址。 - 第二步:将地址右移,...

    西门子间接寻址

    #### 二、直接寻址与间接寻址 **直接寻址**是指直接给出指令的操作数,例如AQ2.0。这里,Q2.0是直接给出的地址,PLC将直接访问此地址执行指令。 **间接寻址**则是通过一个中间变量(指针)间接地给出指令的操作数...

    S7-200 SMART间接寻址功能说明详解.docx

    (1)间接寻址指针表示大小为:32 位=双字 Double Word (2)建立指针偏移时,是按照偏移量进行累计,而不是和指针指向的起始地址进行累计。 本资源对 S7-200 SMART PLC 的间接寻址功能进行了详细的说明,包括寻址...

    详解西门子间接寻址.doc

    双字指针是一个 32bit 的结构,从 0-2bit,共三位,按照 8 进制指示被寻址的位编号,也就是 0-7;而从 3-18bit,共 16 位,指示一个从 0-65535 的数值,这个数值就是被寻址的字节编号。 在使用存储器间接寻址时,...

    钱晓捷-32位汇编

    2. **寻址模式**:32位汇编支持多种寻址方式,包括直接寻址、间接寻址、立即寻址、相对寻址等,使得程序可以灵活地访问内存中的数据。 3. **流程控制**:32位汇编中,JMP(跳转)、CALL(调用子程序)、RET(返回)...

    XP_WIN7_VISTA_32位系统4G内存补丁

    在这些系统中,由于32位寻址的限制,最大可寻址内存为4GB,但实际可用的通常少于这个数值,因为部分内存空间被硬件设备占用。 "4G内存补丁"实际上是一种技术,称为PAE(Physical Address Extension,物理地址扩展)...

    arm寻址方式总结

    ARM指令集分为ARM状态下的指令集(32位)和Thumb状态下的指令集(16位/32位),每种状态下都有各自的支持寻址方式。 #### 二、ARM汇编语言编写规范 1. **标号的书写规则**: - 所有标号必须顶格书写,且后面不要...

Global site tag (gtag.js) - Google Analytics