32位cpu寻址小结(转载)

来源:互联网 发布:淘宝5xl的裤子是多少码 编辑:程序博客网 时间:2024/04/28 18:31

  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,有足够的长度来包含段的三个要素。当然,现在内存中不止一个程序,而且程序也不止一个段,所以描述符也不会有一个,而是很多个。最简单的管理方法,就是将所有的描述符集中起来放在一块连续的存储空间里,然后给各个描述符排上序号。当要找某一个特定的描述符时,只要先找到这块连续的存储空间然后给出序号就可以了。这些集中起来的描述符形成了一张表,所以通常被叫做描述符表。所以,想找到一个段的信息,首先要找到描述符表。也就是说,找特定的描述符先要知道描述符表的基地址。在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里的所有重要机制。剩下的问题不妨采取暂不过问,现用现学的方法。


本文来自CSDN博客,转载:http://blog.csdn.net/zqf5816/archive/2009/09/25/4594806.aspx