I386的体系结构(上)

摘要:本期上半部分将和网友一起聊聊I386体系结构,认识一下Intel系统中的内存寻址和虚拟内存的来龙去脉。下半部分将实现一个最最短小的可启动内核,一是加深对i386体系的了解,再就是演示系统开发的原始过程。作为实例我们将分析计算机的启动流程,然后着手学习开发一个基于I386体系的可启动系统 内存寻址 曾经有一个叫“阿兰.图灵”的天才,它设想出了一种简单但运算能力几乎无限发达的理想机器——这可不是
摘要由CSDN通过智能技术生成

摘要:本期上半部分将和网友一起聊聊I386体系结构,认识一下Intel系统中的内存寻址和虚拟内存的来龙去脉。下半部分将实现一个最最短小的可启动内核,一是加深对i386体系的了解,再就是演示系统开发的原始过程。作为实例我们将分析计算机的启动流程,然后着手学习开发一个基于I386体系的可启动系统

 

内存寻址

曾经有一个叫阿兰.图灵的天才,它设想出了一种简单但运算能力几乎无限发达的理想机器——这可不是一个具体的机械玩艺,而是一个思想模型——用来计算能想象得到的所有可计算函数。这个有趣的机器由一个控制器,一个读写头和一条假设两端无限长的带子组成。工作带好比存储器,被划分成大小相同的格子,每格上可写一个字母,读写头可以在工作带上随意移动,而控制器可以要求读写头读取下方工作带上的字母。

你可千万别觉得这个机器傻可爱,它可是当代.诺依曼体系计算机的理论鼻祖。它带来的数据连续存储和选择读取思想可是目前我们使用的几乎所有机器运行背后的灵魂。计算机体系结构中的核心问题之一就是如何有效地进行内存寻址,因为所有运算的前提都是先要从内存中取得数据,所以内存寻址技术从某种程度上代表了了计算机技术。

下面就开始一起聊聊关于寻址的故事。

.诺依曼体系计算机系统由运算器、存储器、控制器、输入设备、输出设备五大部件组成。运算器就是我们熟知的CPU中的AUL(算术逻辑单元),存储器是内存,控制器是CPU中的控制单元;输入设备就是我们的鼠标键盘等;输出设备就是显示器,打印机等。

历史回顾

计算机的内存寻址技术和世界上的其它事物一样都经历了由简单到复杂,由笨拙到优雅的过程。自我听说计算机到今天,内存寻址方法发生了几次决定性的变革(史前的内存寻址方法我连资料都没由找到,真是无据可查了),而每次变革都带来了软件技术的发展注入了新鲜血液。

让我们沿着Intel公司的脚步来回顾一下历史吧!(我实在没机会接触除Intel以外的处理器!!!

石器时代

    20年前intel推出了一款8位处理器——8080,它有1个主累加器(寄存器A)和6个次累加器(寄存器B,C,D,E,HL,几个次累加器可以配对(如组成BC, DEHL)使用来访问16位的内存地址,也就是说8080可访问到64K内的地址空间。另外那时还没有段的概念,访问内存都要通过绝对地址,因此程序中的地址必须进行硬编码,而且也难以重定位,因此当时的软件都是可控性弱,结构简陋,数据处理量小的工控程序。

人类从来都是不断前进的,很快几年后intel就开发出了16位的新处理器——8086,这便是内存寻址的第一次飞跃。

青铜时代

8086处理器引入了一个重要概念——。段描述了一块有限的内存区域,区域的起始位置存在专门的寄存器(段寄存器)中。另外8086处理器可以寻址 1M 大的内存空间,因为它的地址线扩展到了20位。可是制造20位的寄存器来存放内存地址在当时显然要比制造20位的地址线难得多。为了克服困难,intel的工程师们想出了好办法:将内存分为数个64k大小的段,然后利用两个16位值——一个是段地址,另一个是段内偏移量——巧妙组合产生20位的内存地址。换句话说就是把 1M 大的空间分成数个64k的段来管理(化整为零了)。

系统所需要作的仅仅是:16位的段地址左移动4位后再与16位的偏移量相加便可获得一个20位的内存地址,见图1

摘要:本期上半部分将和网友一起聊聊I386体系结构,认识一下Intel系统中的内存寻址和虚拟内存的来龙去脉。下半部分将实现一个最最短小的可启动内核,一是加深对i386体系的了解,再就是演示系统开发的原始过程。作为实例我们将分析计算机的启动流程,然后着手学习开发一个基于I386体系的可启动系统
 
内存寻址
曾经有一个叫“阿兰.图灵”的天才,它设想出了一种简单但运算能力几乎无限发达的理想机器——这可不是一个具体的机械玩艺,而是一个思想模型——用来计算能想象得到的所有可计算函数。这个有趣的机器由一个控制器,一个读写头和一条假设两端无限长的带子组成。工作带好比存储器,被划分成大小相同的格子,每格上可写一个字母,读写头可以在工作带上随意移动,而控制器可以要求读写头读取其下方工作带上的字母。
你可千万别觉得这个机器傻得可爱,它可是当代 冯.诺依曼体系计算机的理论鼻祖。它带来的“数据连续存储和选择读取思想”可是目前我们使用的几乎所有机器运行背后的灵魂。计算机体系结构中的核心问题之一就是如何有效地进行内存寻址,因为所有运算的前提都是先要从内存中取得数据,所以内存寻址技术从某种程度上代表了了计算机技术。
下面就开始一起聊聊关于寻址的故事。
冯.诺依曼体系计算机系统由运算器、存储器、控制器、输入设备、输出设备五大部件组成。运算器就是我们熟知的CPU中的AUL(算术逻辑单元),存储器是内存,控制器是CPU中的控制单元;输入设备就是我们的鼠标键盘等;输出设备就是显示器,打印机等。

历史回顾

计算机的内存寻址技术和世界上的其它事物一样都经历了由简单到复杂,由笨拙到优雅的过程。自我听说计算机到今天,内存寻址方法发生了几次决定性的变革(“史前”的内存寻址方法我连资料都没由找到,真是无据可查了!),而每次变革都带来了软件技术的发展注入了新鲜血液。
让我们沿着Intel公司的脚步来回顾一下历史吧!(我实在没机会接触除Intel以外的处理器!!!)
石器时代
    20年前intel推出了一款8位处理器——8080,它有1个主累加器(寄存器A)和6个次累加器(寄存器B,C,D,E,H和L),几个次累加器可以配对(如组成BC, DE或HL)使用来访问16位的内存地址,也就是说8080可访问到64K内的地址空间。另外那时还没有段的概念,访问内存都要通过绝对地址,因此程序中的地址必须进行硬编码,而且也难以重定位,因此当时的软件大都是些可控性弱,结构简陋,数据处理量小的工控程序。
人类从来都是不断前进的,很快几年后intel就开发出了16位的新处理器——8086,这便是内存寻址的第一次飞跃。
青铜时代
8086处理器引入了一个重要概念—— 。段描述了一块有限的内存区域,区域的起始位置存在专门的寄存器(段寄存器)中。另外8086处理器可以寻址到1M大的内存空间,因为它的地址线扩展到了20位。可是制造20位的寄存器来存放内存地址在当时显然要比制造20位的地址线难得多。为了克服困难,intel的工程师们想出了个好办法:将内存分为数个64k大小的段,然后利用两个16位值——一个是段地址,另一个是段内偏移量——巧妙组合产生20位的内存地址。换句话说就是把1M大的空间分成数个64k的段来管理(化整为零了)。
系统所需要作的仅仅是:把16位的段地址左移动4位后,再与16位的偏移量相加便可获得一个20位的内存地址,见图1

   1

Intel内存地址的描述形式也很贴近上图,采用了段地址:偏移量的形式来描述内存地址,比如A815:CF2D就代表段首地址在A815,段内偏移位CF2D

为了支持段机制,8086为程序使用的代码段,数据段,堆栈段分别提供了专门的16位寄存器CSDSSS,此外还给内存和字符串拷贝操作留下了一个目的段寄存器ES

段式内存管理带来了显而易见的优势——程序的地址不再需要硬编码了,调试错误也更容易定位了,更可贵的是支持更大的内存地址。程序员开始获得了自由。

白银时代

     人们的欲望在继续膨胀。intel80286处理器于1982年问世了,它的地址总线位数增加到了24位,因此可以访问到 16M 的内存空间。更重要的是从此开始引进了一个新理念——保护模式。这种模式下内存段的访问受到了限制。访问内存时不能直接从段寄存器中获得段的起始地址了,而需要经过额外转换和检查(从此你不能在随意执行数据段,或向代码段里写东西了,具体保护和实现我们后面讲述)。

为了和过去兼容,80286内存寻址可以以两种方式进行,一种是先进的保护模式,另一种是老式的8086方式,被成为实模式。启动时候处理器处于实模式只能访问 1M 空间,经过处理可进入保护模式访问空间扩大到 16M ,但是要想想从保护模式返回到实模式,你只有重新启动机器。还有一个致命的缺陷是80286虽然扩大了访问空间,但实每个段的大小还是64k,这太糟糕了,程序规模仍受到压制。因此这个先天低能儿注定命不久也。很快它久被它天资卓越的兄弟——80386代替了。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值