首页 > 技术文章 > 80X86计算机组织

funblogs 2017-11-14 19:09 原文

  计算机主要由运算器、控制器、存储器、和输入输出设备构成。

  主频:  

    主频是指芯片所用的主时钟频率,它直接影响计算机的运行速度,由于处理器体系结构的差别,同样的主频可能产生不同的计算速度,但主频仍然是反映计算机速度的一个重要指标;

  数据总线

    数据总线负责计算机中数据在各组成部分之间的传送,数据总线宽度是指芯片内部数据传送的宽度,外部数据总线宽度则是指芯片内和芯片外交换数据的宽度。

  地址总线

    地址总线宽度是指专用于传送地址的总线宽度,根据这一数值可确定处理机可以访问的存储器的最大范围(寻址空间),如20位地址总线可以访问2^20 = 1048576个存储单元。在计算

  机中,为方便起见,在讨论储存容量时,以2^10 = 1024为基本单位,称为1k,1024k就称为1M。所以20位地址总线可以访问1M个存储单元。32位地址总线可访问4G个存储单元。

  寄存器:

    寄存器可以分为程序可见的寄存器和程序不可见的寄存器两大类。所谓程序可见的寄存器是指在汇编语言程序设计中用到的寄存器,它们可以由指令来指定。而程序不可见的寄存器则

  是指一般应用程序设计中不用而系统所用的寄存器。程序可见寄存器可以分为通用寄存器、专用寄存器和段寄存器3类。

  1、通用寄存器:

      8086、8088和80286所具有的的寄存器,它们都是16位寄存器。其中AX、BX、CX、DX可称为数据寄存器,用来暂时存放计算过程中所用到的操作数、结果或其他信息。它们都可

    以以字的形式访问,或者也可以以字节的形式访问。例如对AX可以访问高位字节AH或低位字节AL。这4个寄存器都是通用寄存器,但它们又可用于各自专用的目的。

      AX作为累加器用,所以它是算术运算的主要寄存器。BX、CX、DX可以作为通用寄存器使用,

      SP、BP、SI、DI四个16位寄存器可以像数据寄存器一样在运算过程中存放操作数,但它们只能以字(16位)为单位使用。SP称为堆栈指针寄存器,BP称为基址指针寄存器,它可

    以与堆栈段寄存器SS联用来确定堆栈段中的某一存储单元的地址。SP用来指示段顶的偏移地址,BP可作为堆栈区中的一个基地址以便访问堆栈信息。SI源变址寄存器和DI目的变址寄存

    器一般与数据段寄存器DS联用,用来确定数据段中某一存储单元的地址。

      80386及其后继的机型,它们是32位通用寄存器,包括EAX,EBX,ECX,EDX,ESP,EBP,EDI和ESI。它们可以用来保存不同宽度的数据,如可以用EAX保存32位数据,用AX

    保存16位数据,用AH或AL保存8位数据。

  2、专用寄存器

      8086/8088和80286的专用寄存器包括IP、SP和FLAGS 3个16位寄存器。

      IP为指令指针寄存器,它用来存放代码段中的偏移地址。在程序的运行过程中,它始终指向下一条指令的首地址,它与寄存器CS联用确定下一条指令的物理地址。当这一地址送到

    存储器后,控制器可以取得下一条要执行的指令,而控制器一旦取得这条指令马上修改IP的内容,使它指向下一条指令的首地址。

      SP为堆栈指针寄存器,它与堆栈段寄存器联用来确定堆栈段中栈顶的地址,也就是说SP用来存放栈顶的偏移地址。

      FLAGS为标志寄存器,又称程序状态寄存器,这是一个存放条件码标志、控制标志和系统标志的寄存器。

      80386及其后继机型也有三个32位专用寄存器,它们是EIP、ESP和EFLAGS。它们的作用和相应的16位寄存器相同。

   3、段寄存器

      段寄存器也是一种专用寄存器,它们专用于存储器寻址,用来直接或间接地存放段地址。段寄存器的长度为16位,在80286以前的处理器中,只有代码段CS、数据段DS、堆栈段

    SS和附加段ES 4个寄存器,从80386起增加了FS和GS两个段寄存器,它们也属于附加的数据段。 

  存储器

      计算机存储信息的基本单位是一个二进制位,一位可存储一个二进制数:0或1。每8位组成一个字节。由两个字节组成一个字,16位,两个字即4个字节组成双字。

      在存储器例以字节为单位存储信息,每一个字节单元有一个唯一的存储器地址,称为物理地址,地址总线宽度为为20位,则可寻址为2^20个存储单元,即1M的寻址空间。

      在X86系列中,8086和8088是16位处理器,而从80386开始为32位处理器,当我们说一个CPU是16位或32位时,指的是处理器中“算术逻辑单元ALU”的宽度。而8086/8088地址

    总线为20位,为解决16位字长的机器里怎么提供20位地址的问题,提出了存储器地址分段的方法。(20位物理地址 = 16位段基地址 + 16位偏移地址)。在8086~80286中,有四个

    专门存放段地址的寄存器,称为段寄存器。它们是代码段CS、数据段DS、堆栈段SS和附加段ES寄存器。每个段寄存器可以确定一个段的起始地址,而这些段则各有各的用途。代码段

    存放当前正在运行的程序,数据段存放当前运行程序所用的数据,堆栈段定义了堆栈所在的区域,堆栈是一种数据结构,它开辟了一个比较特殊的存储区,并以先进先出的方式访问这

    一区域。附加段是附加的数据段,它是一个辅助的数据区。

      存储器寻址分为实模式存储器寻址和保护模式存储器寻址, 首先说明一下,8086、8088是16位的处理器,80386以后都是32位的处理器,80286虽然是16位的处理器,但是在

    寻址方式上已经开始了从“实模式”到“保护模式”的过渡。btw,当我们说一个CPU是16位或32位时,指的是处理器中的ALU(算数逻辑单元)的宽度。

实模式存储器寻址和保护模式存储器寻址:

  8086中,数据总线的宽度是16位(通常和ALU一样),地址总线为20位,寻址空间为1M。因此,在8086中使用了分段的方法来把16位的地址映射为20位的物理地址。16位的段寄存器对应地址总线的高16位,段地址左移4位再加上访存指令中的16位地址,就形成了真正的20位的物理地址。但在这种机制下,由段寄存器确定一个“基地址”,一个进程总是可以访问由此开始的64K字节的连续地址空间,且无法加以限制。进一步,通过改变段寄存器的内容,这个进程可以随心所欲的访问内存中的任何一个单元,因此根本谈不上对系统和其它进程的保护。这就是“实模式”的最大缺点。

  从80386开始,进入了真正的“保护模式”。386是32位的CPU,数据、地址总线都是32位,因此寻址空间为4G。80386中对内存的管理有两种,一个是段式内存管理,一个是页式内存管理。
    先从段式内存管理说起。由于Intel是在16位CPU基础上涉及32位CPU的,因此在32位处理器中,它继承了段寄存器。由于寻址空间的增大,16位的段寄存器已不能够提供基地址了。这样就引入了一个数据结构来描述关于段的一些信息(即段描述子)。当一个访存指令发出一个内存地址时,CPU按照下面过程实现从指令中的32位逻辑地址到32位物理地址的转换:
    1.首先根据指令的性质来确定该使用哪一个段寄存器。
    2.根据段寄存器的内容,找到相应的“段描述结构”。
    3.从“段描述结构”中得到基地址。
    4.将指令中的地址作为位移,与段描述结构中规定的段长度相比,看是否越界;
    5.根据指令的性质和段描述符中的访问权限来确定是否越权;
    6.最后才将指令中的地址作为位移,与段基地址相加,得到物理地址。
    同时,在上面过程中,由于有对访问权限的检查,就实现了保护。
    上面提到的“段描述结构”实际就是段描述子。80386中有两个寄存器,分别是全局的段描述表寄存器(GDTR)和局部的段描述表寄存器(LDTR),用来指向存储在内存中的某个段描述表。原段寄存器中的高13位指明某个段描述子在段描述表中的偏移,这个偏移加上GDTR(或LDTR)中段描述表的基地址,就得到段描述子的地址。最后从段描述子中得到段的32位基地址和长度以及其它的一些信息(这些信息包括关于越界和权限检查)。
    段式内存管理只是386保护模式的一个部分,由于其效率的问题以及段是可变长度的,又发展出了页式内存管理。386处理器中有一个寄存器CR0,如果它的PG位为1,就打开了页式内存管理。
    页式内存管理是在有段式内存管理形成的地址上再加上一层地址映射。此时由段式管理形成的地址就不再是物理地址了,而是“线性地址”。段式内存管理先把“逻辑地址”映射为“线性地址”,再由页式内存管理把“线性地址”映射为“物理地址”;当不使用页式内存管理时,“线性地址”就直接用作“物理地址”。
    80386把内存分为4K的页面,每一个页面被映射到物理内存中任一块4K字节大小的空间(边界必须与4K字节对齐)。需要注意的是,在段式管理中,连续的逻辑地址经映射后在线性空间还是连续的,但连续的线性地址经映射后在物理空间却不一定连续。
    页式内存管理中,32位的线性地址划分为三个部分:10位的页目录表下标、10位的页面表下标、12位的页内地址偏移。CPU增加了一个CR3寄存器存放指向当前页目录表的指针。寻址方式就改为:
    1.从CR3取得页目录表的基地址;
    2.根据10位页目录表下标和1中得到的基地址,取得相应页面表的基地址;
    3.根据10位页面表下标和2中得到的基地址,从页面表中取得相应的页面描述项;
    4.将页面描述项中的页面基地址和线性地址中的12位页内地址偏移相加,得到物理地址。

推荐阅读