让梁大侠头疼的CPU段式结构的由来

原创 2005年03月01日 00:19:00

梁在其<编程高手箴言>一书第二章说:8086最头疼的问题在于段式结构,1MB的内存被它的段偏移所限制。至今我也不明白Intel当初为什何要设计成这么复杂的内存机制,也许是为了与8080兼容的需要。这套笨拙的体系一直延续到IA64为止。

 

 

以下文字参考Linux内核源代码情景分析一书。

当我们说一个CPU”16”32”位时,指的是处理器中算术逻辑单元ALU]的宽度。系统总线中的数据线部分,称为数据总线,它通常与ALU有相同的宽度。另外,还有一条地址总线来访问内存,它的宽度应该与数据总线一致,这是因为从程序设计的角度来说,一个地址是一个指针,最好与CPU所处理的一个整数的宽度一致,但实际情况是不可能这样的。8CPU如果让地址总线也是8位,那只能寻址256个不同的地址单元,太小了。所以8位的CPU的地址总线通常是16位的,但这样,在8位的指令系统中常存在着一些16位的操作。后来CPU发展到了16位,本来地址总线和数据总线的宽度应该可以一致了,但当时人们又觉得16位的地址总线可以寻址的空间还是太小啊,还要加大。那加到多大?Intel结合当时人们所能看到的微型计算机的应用前景以及存储器芯片的价格,决定用1MB。由此可见,CPU的地址总线不是你觉得多少位好就采用多少位的宽度了,它要对当时存储器的价位进行衡量才可以确定要多少位的地址总线,假如当时人们不是普遍觉得1MB内存足够用的话,那么CPU发展到我们今天就有可能不是现在这样了,可能32位的地址总线就在8086中出现了。就这样,8086决定要用1MB的内存时,那么地址总线就必须是20位的宽度,但CPUALU的宽度只有16位,也就是说在内存寻址时参与计算的地址指针也只能是16位的。该如何解决这个问题,这应该是当时很困扰Intel的设计人员的问题,如果像8位计算机所做的那样,在CPU的指令集中添加一些20位的指令来进行内存寻址,这样会导致CPU内部结构的不均匀性(想一想就知道了,CPU内部的电路系统又要处理16位的指令,又要处理20位的指令,麻烦不麻烦?)Intel设计人员后来选择了分段机制,这在当时看来应该是很巧妙的方法了。当时PDP-II小型机也是16位的,但它可以通过内存管理机制将16位的地址映射到24位的地址空间,intel应该是借鉴了它的思路。

       Intel8086CPU中设置了四个段寄存器,每个段寄存器都是16位的,对应于地址总线的高16位。每条访问内存的指令中的内部地址也都是16位的,但是在将地址传到地址总线上之前,要使用CPU内部的加法器对内部地址和某个段寄存器中的地址相加,形成一个20位的地址。由于段寄存器中的内容对应于20位地址总线中的高16位,所以在相加时是拿内部地址的高12位与段寄存器中的16位相加,而内部地址中的低四位保持不变。这个方法与操作系统理论中的段式内存管理相似,但并不完全一样,主要是没有地址空间的保护机制,对每一个由段寄存器的内容确定的基地址,一个进程总是能够访问从此开始的64K字节的连续空间,而无法加以限制。同时,可以用来改变段寄存器内容的指令也不是什么特权指令,也就是说通过改变段寄存器的内容,一个进程可以随心所欲地访问内存中的任何一个单元,而丝毫不受到限制,能对一个进程的内存访问加以限制,也就谈不上对其他进程以及系统本身的保护。与此相应,一个CPU如果缺乏对内存访问的限制,就谈不上什么内存管理,也就谈不上是现代意义上的中央处理器。由此,而生出保护模式的概念。

auto_ptr应用

1、智能指针 为什么要使用智能指针?我们知道c++的内存管理是让很多人头疼的事,当我们写一个new语句时,一般就会立即把delete语句直接也写了,但是我们不能避免程序还未执行到delete时就跳转...
  • surui_555
  • surui_555
  • 2016年01月19日 17:06
  • 250

濠梁鲦鱼的由来

庄子与惠子游于濠梁之上。庄子曰:“鲦鱼出游从容,是鱼乐也。”惠子曰:“子非鱼,安知鱼之乐?”庄子曰:“子非我,安知我不知鱼之乐?”惠子曰:“我非子,固不知子矣,子固非鱼也,子不知鱼之乐,全矣。”庄子曰...
  • Aj_512
  • Aj_512
  • 2015年03月31日 14:45
  • 424

Revit开发获取梁的宽和高

在Revit里梁的宽和高一般都会有对应的参数,要获取大多数情况可以使用GetParameter, 但这个参数名称是用户自己定义的,不同的梁对应的参数名不一样,所以可以考虑通过梁的截面Face来获取 ...
  • The_Eyes
  • The_Eyes
  • 2017年04月17日 17:44
  • 780

内存管理第一谈:段式管理和页式管理

对于内存管理这个操作系统中庞大的体系,实在是容易让人望而止步,市面上介绍这块知识的书籍其实很多,但是由于书面语言的缘故,总感觉有些东西晦涩难懂,下面内容只是想把一些书面语言转换为比较容易理解的内容,希...
  • jy1075518049
  • jy1075518049
  • 2015年02月07日 20:45
  • 1655

Intel CPU的保护模式和段式内存管理简介

在操作系统原理的教材上,我们学到虚拟内存的管理方式有3种,段式内存,页式内存,和段页式内存。Intel的CPU同时支持段式内存和页式内存。我们在这一篇中先介绍段式内存。我们知道,Intel CPU在启...
  • gemini_star
  • gemini_star
  • 2009年07月21日 20:48
  • 2155

在revit模型中如何对建筑柱和梁进行过滤?

过滤是Revit的重要技术。用FilteredElementCollector 类可以实现对所有对象的过滤,这个类功能强大,效率也很高。 可以给他添加过滤条件,从中获取过滤结果。 我曾经录制过一个...
  • JoeXiongjin
  • JoeXiongjin
  • 2012年08月30日 12:00
  • 6241

[BASIC-20] 数的读法

基础练习 数的读法   时间限制:1.0s   内存限制:512.0MB 问题描述   Tom教授正在给研究生讲授一门关于基因的课程,有一件事情让他颇为头疼:一条染色体上...
  • u011506951
  • u011506951
  • 2014年05月21日 09:15
  • 1647

从X86架构来源开始:谈CPU

(整理的笔记来源于《鸟叔的私房菜》) 个人计算机常被称为x86架构癿计算机!这是因为由亍AMD、Intel、VIA所开发出来的x86架构CPU被大量使用亍个人计算机(Personal compute...
  • shilurujinyiguan
  • shilurujinyiguan
  • 2017年02月07日 17:30
  • 1359

Tom教授 染色体位置 念法 Java

问题描述   Tom教授正在给研究生讲授一门关于基因的课程,有一件事情让他颇为头疼:一条染色体上有成千上万个碱基对,它们从0开始编号,到几百万,几千万,甚至上亿。   比如说,在对学生讲解第1...
  • u011980994
  • u011980994
  • 2013年11月23日 09:37
  • 1919

1.偏头痛杨的Java入门教学系列之认识Java篇

前戏 今天我们主要来介绍一下Java,包括什么是Java、Java的特点、应用场景、历史、JDK&JRE&JVM的恩怨情仇以及第一个Java程序,让大家对Java有个宏观的认识,为后面的面向对象编...
  • piantoutongyang
  • piantoutongyang
  • 2017年04月12日 08:22
  • 1860
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:让梁大侠头疼的CPU段式结构的由来
举报原因:
原因补充:

(最多只允许输入30个字)