转自:http://blog.sina.com.cn/s/blog_640531380100xa15.html

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里的所有重要机制。剩下的问题不妨采取暂不过问,现用现学的方法

版权声明:本文为博主原创文章,未经博主允许不得转载。

32位机,CPU是如何利用段寄存器寻址的的更多相关文章

  1. 32位的CPU最多只能支持最大到4GBytes的内存

    和总线宽度相似的,CPU每次能够处理的数据量称为字组大小(word size), 字组大小依据CPU癿设计而有32位与64位.我们现在所称的计算机是32或64位主要是依据这个 CPU解析的字组大小而来 ...

  2. c# 32位机和64位机 读取Excel内容到DataSet

    // ----------------------32位机 //注释说明 //ExclePath 为Excel路径 批号 是指Excel文件中某一列必填项 public static DataSet ...

  3. 32位Intel CPU所含有的寄存器

    4个数据寄存器(EAX.EBX.ECX和EDX)2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)6个段寄存器(ES.CS.SS.DS.FS和GS)1个指令指针寄存器(EIP) ...

  4. 关于MVC4项目从32位机移到64位机编译报错解决方案

    早上写了个MVC WEBAPI的demo 机子环境是:XP SP3+ VS2010 + ASP.NET MVC4 然后晚上拿回笔记本进行编译运行,结果报错如下: “/”应用程序中的服务器错误. 分析器 ...

  5. 32位机和64位机下面各类型sizeof的大小

    ---<这种类型的题目出的太多了,还是整理下吧!>--- 一.机器平台:X86_64 处理器 操作系统:Red Hat 4.1.2-14 编译器: gcc version 4.1.2 20 ...

  6. c语言sizeof用法(32位机)

  7. mongodb在32位机的连接

    Windows 32bit版本安装Mongodb时,会发生的下面问题 2016-05-09T00:09:45.124+0800 I STORAGE  [initandlisten] exception ...

  8. win7 32位机安装VMware win7 64位虚拟机

    VMware10虚拟机怎么安装win7系统(详细教程):https://jingyan.baidu.com/article/86f4a73ec62e8f37d65269a1.html 然而上述教程想不 ...

  9. 32位x86处理器编程导入——《x86汇编语言:从实模式到保护模式》读书笔记08

    在说正题之前,我们先看2个概念. 1.指令集架构(ISA) ISA 的全称是 instruction set architecture,中文就是指令集架构,是指对程序员实际"可见" ...

随机推荐

  1. C++(二十一) — 引用概念及本质

     1.引用概念 引用是别名,必须在声明的时候初始化.即:是指一个已定义变量的别名.(一个内存空间,有两个名字都可以操作) 引用:在函数调用时,是变量的别名,不可以单独存在,使用时必须要初始化: 指针: ...

  2. 三 web爬虫,scrapy模块介绍与使用

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以 ...

  3. 第七届蓝桥杯C-B-10-最大比例/gcd变形

    最大比例 X星球的某个大奖赛设了M级奖励.每个级别的奖金是一个正整数.并且,相邻的两个级别间的比例是个固定值.也就是说:所有级别的奖金数构成了一个等比数列.比如:16,24,36,54其等比值为:3/ ...

  4. Redis 命令,键(key),字符串(String),哈希(Hash),列表(List),集合(Set)(二)

      Redis 命令 Redis 命令用于在 redis 服务上执行操作. 要在 redis 服务上执行命令需要一个 redis 客户端.Redis 客户端在我们之前下载的的 redis 的安装包中. ...

  5. QT Designer 的汉化

    Designer是很好用的设计器,通过 pip 安装PyQt5之后,一般都是英文的 所以给有需要的人带来汉化的包(这个是通过替换  translations 文件夹来实现的) translations ...

  6. Shiro快速入门

    1.什么是Shiro Shiro是Java的一个安全框架, 完成权限控制的任务. 权限控制的基本功能: 认证(让系统知道你是谁); 授权(让系统知道你能做什么)权限控制常用的技术: 过滤器/拦截器, ...

  7. EasyDarwin开源流媒体服务器中一种实现对作用域内new对象自动释放的方法(值得借鉴)

    我们经常在开发过程中,在局部new了一个对象,我们就会在复杂的逻辑过程中担心这个对象是否已经被释放,需要在一大堆的if.else.while.break进行判断new对象是否还存在,或者相同的dele ...

  8. CentOS给网站配置Https证书

    1.在腾讯云申请域名的证书 2.配置文件 安装相应模块: yum install mod_ssl openssl 编辑配置文件: cd /etc/httpd/conf.d vi jerryqi.con ...

  9. Android开发的基础知识点

    1.Android开发的四大组件: Activity:android应用程序上看到的一页. Service:运行在后台,可以其他组件交互(音乐播放器). BroadcoastReceiver:用来对外 ...

  10. DbEntry 简单实现

    在着手编码之前首先安装DbEntry DbEntry.Net.4.1.Setup.zip 在建立类库时选择 DbEntryClassLibrary 如图 DbEntryClassLibrary1 中建 ...