《ISASystemArchitecture》读书笔记
2022-07-12 09:36:40 0 举报
AI智能生成
读书笔记,讲述ISA系统架构,以及8086、80286、80386发展,处理器寻址,实模式 保护模式
作者其他创作
大纲/内容
0 概述
系统内核:
提供微处理器与系统其它部分所必需的基本信号、时钟和协议
提供微处理器与系统其它部分所必需的基本信号、时钟和协议
ISA架构:
一开始iISA是基于8M的IBM-PC,最初的讨论是基于8M的Inter80286
运行速度超过8M的80286就要进行轻微改动,803/486运行更快,就需要大改
一开始iISA是基于8M的IBM-PC,最初的讨论是基于8M的Inter80286
运行速度超过8M的80286就要进行轻微改动,803/486运行更快,就需要大改
ISA的概念:
ISA槽的信号分为3种:地址/控制/数据总线组
ISA标准步进包含扩展连接器的结构,还必须为中断处理,
直接内存访问,定时钟,错误处理,键盘接口和配置RAM提供支持逻辑
ISA槽的信号分为3种:地址/控制/数据总线组
ISA标准步进包含扩展连接器的结构,还必须为中断处理,
直接内存访问,定时钟,错误处理,键盘接口和配置RAM提供支持逻辑
第一部分 System Kernel
第一章 微处理器通信简介
1、微处理器的作用
| 从内存读取和执行指令
| 从内存读取和执行指令
①指令的作用
告诉微处理器执行以下三种操作之一
- 从外部设备读取数据
- 写数据到外部设备
- 执行不包括从外部读取或写入的内部操作
②第一条指令
·上电后第一个读取数据的地址。
从该地址获取到第一条指令后,cpu便完全由程序告诉它做什么
从该地址获取到第一条指令后,cpu便完全由程序告诉它做什么
在实模式下,微处理器总是在CS寄存器内容F000h的末尾附加一个额外的Oh,
从而产生一个代码段的起始地址F0000h。然后将IP寄存器中包含的地址FFF0h偏移部分
添加到段的起始地址,生成的内存地址FFFFOh
从而产生一个代码段的起始地址F0000h。然后将IP寄存器中包含的地址FFF0h偏移部分
添加到段的起始地址,生成的内存地址FFFFOh
③获取线性地址空间代码
当前指令未指定下一条指令的内存地址时
微处理器默认按顺序从内存的下一个地址获取下一条指令
微处理器默认按顺序从内存的下一个地址获取下一条指令
当前指令指定了下一条指令的内存地址时
处理器,处理器便跳转到改地址获取下一条指令
处理器,处理器便跳转到改地址获取下一条指令
④、MCU与外部设备通信的条件
除特殊情况,一般:
- 从内存中读取下一条指令
- 当前执行的指令指示MCU从外设读数据
- 当前执行的指令指示MCU向外设写数据
2、内存的使用
①MCU从内存读到的数据类型
指令和数据
②MCU写入内存的数据类型
MCU只能将数据写入内存,不能写指令到内存
指令由DMA控制器(直接存储器)写入到内存
指令由DMA控制器(直接存储器)写入到内存
3、总线
①地址总线
作用:识别/找要通信外部设备,每个地址代表一个外部设备
②数据总线
作用:传输数据,半双工,可读可写,但同一时刻只能做一个操作
③控制总线
作用:
- 识别事务类型,读或者写
- 同步快的处理器和慢的设备,正在读或者写
第二章 总线周期介绍
1、介绍
MCU内部总线单元是一个状态机
状态机用来定义每个状态持续时间的时钟
状态机用来定义每个状态持续时间的时钟
2、系统时钟-节拍器
时钟输入由晶振提供,是一个固定频率的电信号。
- 80286和80386将时钟输入的频率除以2来作为内部时基,又称为处理器时钟(PCLK)
- 486DX微处理器用时钟输入作为PCLK,不分频 (↑处理器时钟与晶振时钟关系)
3、微处理器总线周期状态机
MCU读/写时,启用一系列总线周期,一个总线周期内:
地址总线放设备地址,控制总线指示任务类型(读/写),数据总线放置数据
地址总线放设备地址,控制总线指示任务类型(读/写),数据总线放置数据
x86MCU包含一个总线单元子系统,负责运行总线周期任务
[Address time] 写地址的总线周期
在地址时间内,持续一个PCLK周期,微处理器将地址放在地址总线上,
并将控制数据(控制事务类型)放在控制总线上。
在地址时间内,持续一个PCLK周期,微处理器将地址放在地址总线上,
并将控制数据(控制事务类型)放在控制总线上。
[Data Time] 传输数据的总线周期
处理器根据输入引脚READY#的状态来判断数据是否传完,是否该读数据了
处理器根据输入引脚READY#的状态来判断数据是否传完,是否该读数据了
[Wait State]等待状态
处理器速度比外设快,如果外设这边没处理完,mcu会延长总线pclk周期去等待外设处理结束
处理器速度比外设快,如果外设这边没处理完,mcu会延长总线pclk周期去等待外设处理结束
0等待状态总线周期是80286、80386、80486和Pentium微处理器能够执行的最快的总线周期类型
最快的x86总线周期需要两个“滴答”(周期)的PCLK
最快的x86总线周期需要两个“滴答”(周期)的PCLK
第三章 寻址I/O和内存
1、IO内存和IO地址空间的演化
0 祖先: Intel 8080微处理器是整个x86微处理器家族的祖先。
这个家族的许多特征都源于这个共同的祖先。
这个家族的许多特征都源于这个共同的祖先。
【8080】--有16根地址线,A[15::0],最大可寻址2^16=64k的地址空间
so,接在上的内存不能大于64k
so,接在上的内存不能大于64k
【8085】
16根地址线,可寻址64k,加入一个新的引脚 IO/M#(将8228的功能整合到8085中),
来指示是向IO还是存储器里存地址
(同样是0001H,IO/M#状态不同,存放的位置也不同)
由于系统用到的IO数量有限,intel给IO分配了256个地址
16根地址线,可寻址64k,加入一个新的引脚 IO/M#(将8228的功能整合到8085中),
来指示是向IO还是存储器里存地址
(同样是0001H,IO/M#状态不同,存放的位置也不同)
由于系统用到的IO数量有限,intel给IO分配了256个地址
任何不是内存设备(RAM或ROM)且微处理器能够读取或写入数据的设备都是I/O设备。
与这些IO设备通信需要给其分配内存地址。内存本就不大,IO设备很占内存
8080里,Intel为节省内存,在8080里加入了两个新指令:IN和OUT
增加了一个8228控制芯片,来检测与IO的通信意图
与这些IO设备通信需要给其分配内存地址。内存本就不大,IO设备很占内存
8080里,Intel为节省内存,在8080里加入了两个新指令:IN和OUT
增加了一个8228控制芯片,来检测与IO的通信意图
【8086和8088mcu】
有20根地址线,可寻址1M内存空间
和8085一样,也用一个引脚来指示内存或IO,但定义和8085不同,从IO/M#变成了M/IO#
I/O内存地址从256增加到了64k,I/O的地址划分在内存地址的前64K位置(0000H-FFFFH)
有20根地址线,可寻址1M内存空间
和8085一样,也用一个引脚来指示内存或IO,但定义和8085不同,从IO/M#变成了M/IO#
I/O内存地址从256增加到了64k,I/O的地址划分在内存地址的前64K位置(0000H-FFFFH)
40pin
【80286和386SX】
有24根地址线,可访问16M内存
I/O空间仍为64K
有24根地址线,可访问16M内存
I/O空间仍为64K
80286图 72pin
【386DX、486及奔腾】
有32根地址线,可防汛4G内存空间
I/O空间仍为64K
有32根地址线,可防汛4G内存空间
I/O空间仍为64K
80386图
2、内存映射I/O
将I/O映射到内存中,为防止程序与映射的I/O地址冲突
通常在内存地址高地址范围内映射I/O地址
通常在内存地址高地址范围内映射I/O地址
3、I/O设备
I/O分类
1.命令端口,程序员向IO设备传命令的端口
2.状态端口,查看I/O设备的当前状态。比如打印机是否有纸
3.数据端口,作为MCU与I/O互传数据的端口
第四章 地址解码逻辑
1、地址解码器的概念
每个能和MCU读写的设备都有一个地址解码器的逻辑块,
当地址解码器检测到其定义范围的地址时,解码器会关联该设备
当地址解码器检测到其定义范围的地址时,解码器会关联该设备
MCU能访问的内存或I/O地址是映射地址,不是内存或IO设备本身。
MCU定义了设备在映射地址的哪个地方
MCU定义了设备在映射地址的哪个地方
2、数据总线争用(地址冲突)
系统中地址解码器的地址范围不能相同,不然会导致数据冲突。
比如MCU是医院医生,叫一个号,进来了两个人,他们同时给医生讲
自己的病情,最好的情况:医生听不清他们谁说的什么,
最坏的情况,两个人打起来,打死一个。也就是会导致设备损坏。
自己的病情,最好的情况:医生听不清他们谁说的什么,
最坏的情况,两个人打起来,打死一个。也就是会导致设备损坏。
解决方法,ISA系统中,通过在卡上配置开关or跳线帽,
用户使卡检测不同的地址范围去解决冲突
用户使卡检测不同的地址范围去解决冲突
3、地址解码器工作原理
地址解码器检查MCU正输出的地址的高位部分,判断地址是不是在自己管辖范围内,
如果是,则解码器的片选设备区检查地位,确定MCU寻址的具体位置。
从高位开始判断,如果不同,则判断低位没有意义。
如果是,则解码器的片选设备区检查地位,确定MCU寻址的具体位置。
从高位开始判断,如果不同,则判断低位没有意义。
例子1:PC和PC/XT ROM地址解码
内存范围:
F0000h到FFFFFh --存放系统BOOT ROM,又叫BIOS ROM
E0000h到EFFFFh --分配给可选的ROM,可将其安装在系统板上空ROM插槽中。
为了允许安装包含BIOS例程和可添加到计算机的可选设备的中断服务例程的ROM,此外接ROM通常称为选项ROM。
F0000h到FFFFFh --存放系统BOOT ROM,又叫BIOS ROM
E0000h到EFFFFh --分配给可选的ROM,可将其安装在系统板上空ROM插槽中。
为了允许安装包含BIOS例程和可添加到计算机的可选设备的中断服务例程的ROM,此外接ROM通常称为选项ROM。
因此,ROM地址解码器必须检测A[19:16]这四位,
而E和F只有A16位有区别,只需要检测A16是1还是0,
便能确定是选择ROM还是可选ROM
而E和F只有A16位有区别,只需要检测A16是1还是0,
便能确定是选择ROM还是可选ROM
硬件设计上,通过非门和与非门来判断
BootRom的片选:CSF#=/(A16·A19-17) 来选中
OptionRom的片选:CSE#=/(/A16·A19-17)
A19-17必须全为1,如果其中有0,则两个ROM都不会查看A[15:0]的地址信息
BootRom的片选:CSF#=/(A16·A19-17) 来选中
OptionRom的片选:CSE#=/(/A16·A19-17)
A19-17必须全为1,如果其中有0,则两个ROM都不会查看A[15:0]的地址信息
例子2:系统板I/O地址解码器
138译码器
4、ISA I/O解码器
两个状态机的例子,洗碗机的经典例子
第五章 80286微处理器
1、80286功能单元
组成:处理器由多个功能单元组成,它们各司其职
【80286mcu由总线单元(BU)、指令单元(IU)、执行单元(EU)、地址单元(AU)组成】
指令单位-在对指令进行解码,然后传递给执行单元执行。
执行单元-处理指令的实际执行。
地址单元-当微处理器必须寻址一个存储器位置时,地址单元形成存储器地址,
在总线周期期间被总线单元驱动到地址总线上
总线单元-处理与微处理器芯片外部世界的通信(通过执行总线周期)。
指令单位-在对指令进行解码,然后传递给执行单元执行。
执行单元-处理指令的实际执行。
地址单元-当微处理器必须寻址一个存储器位置时,地址单元形成存储器地址,
在总线周期期间被总线单元驱动到地址总线上
总线单元-处理与微处理器芯片外部世界的通信(通过执行总线周期)。
指令单元(IU):
从预取队列读取指令,一次只能取一个,解码后,将其放入已解码的指令队列中,以便转发到执行单元
执行单元(EU):
EU主要为执行指令,指令分为两类:
1、对存在EU寄存器内的数据进行内部处理
2、从外设读/写数据,EU发布一个总线周期请求给BU,然后等待BU完成数据转移
EU寄存器逻辑上可分为两类:通用寄存器&状态控制寄存器
1、对存在EU寄存器内的数据进行内部处理
2、从外设读/写数据,EU发布一个总线周期请求给BU,然后等待BU完成数据转移
EU寄存器逻辑上可分为两类:通用寄存器&状态控制寄存器
微处理器可处理两类信息:指令和数据
【指令】--总是从内存获取,然后放入指令预取队列,解码后被发送到IU的寄存器执行
【数据】--要处理的数据直接直接进入EU的寄存器
【寄存器】--可看作是mcu里的存储位置,有只读、只写和可读可写寄存器三种。
(EU内寄存器的作用见备注)
1. 通用寄存器
AX/BX/CX/DX可存16位的信息,
还可单独引用上半部/下半部的8位寄存器
mov AX,1234 #将1234h移入AX寄存器中
mov AL,02 #将02h移动到AL寄存器中
OUT 60,AL #将AL的内容写入I/O位置的60h
(这会产生一个地址总线上的000060h地址和数据低8位的I/O写总线周期)
【指令】--总是从内存获取,然后放入指令预取队列,解码后被发送到IU的寄存器执行
【数据】--要处理的数据直接直接进入EU的寄存器
【寄存器】--可看作是mcu里的存储位置,有只读、只写和可读可写寄存器三种。
(EU内寄存器的作用见备注)
1. 通用寄存器
AX/BX/CX/DX可存16位的信息,
还可单独引用上半部/下半部的8位寄存器
mov AX,1234 #将1234h移入AX寄存器中
mov AL,02 #将02h移动到AL寄存器中
OUT 60,AL #将AL的内容写入I/O位置的60h
(这会产生一个地址总线上的000060h地址和数据低8位的I/O写总线周期)
2. 状态控制寄存器
(标志和机器状态字(Word)寄存器)
(标志和机器状态字(Word)寄存器)
状态和控制寄存器由三个寄存器组成
标志寄存器
有16位,可分为三组:
1.状态标志位。这些位反映了先前执行指令的结果
2.控制标志位。设置或清除这些位,程序员可以修改mcu的某些操作
3.系统标志字段。这三个位与保护模式操作有关。与本书无关
有16位,可分为三组:
1.状态标志位。这些位反映了先前执行指令的结果
2.控制标志位。设置或清除这些位,程序员可以修改mcu的某些操作
3.系统标志字段。这三个位与保护模式操作有关。与本书无关
橙色为状态标志位,紫色为控制标志位,最后为系统标志位
MSW:机器状态字寄存器
有16位,但只有低4位被使用
当RESET持续时,FFF0h被强制写入MSW,机器运行在实模式
(后面会讲实模式)
有16位,但只有低4位被使用
当RESET持续时,FFF0h被强制写入MSW,机器运行在实模式
(后面会讲实模式)
3. BP(基数指针寄存器)
常用于形成内存地址。 (解释说明,见备注)
BP寄存器通常用于访问堆栈,而不会影响SP寄存器的内容。
常用于形成内存地址。 (解释说明,见备注)
BP寄存器通常用于访问堆栈,而不会影响SP寄存器的内容。
4. 索引寄存器
SI:源索引寄存器 DI:目的索引器
常用于操作字符串,对一串地址执行操作,典型例子就是:move string操作
程序员想执行一系列内存读写操作将数据从内存的一个区域转移到另一区域
代码如下:
SI:源索引寄存器 DI:目的索引器
常用于操作字符串,对一串地址执行操作,典型例子就是:move string操作
程序员想执行一系列内存读写操作将数据从内存的一个区域转移到另一区域
代码如下:
MOV SI,XXXX #SI是源起始地址
MOV DI,YYYY #DI是目的起始地址
MOV CX,ZZZZ #CX是要移动的字节数
REP MOVSB #重复操作,直至移动完成
MOV DI,YYYY #DI是目的起始地址
MOV CX,ZZZZ #CX是要移动的字节数
REP MOVSB #重复操作,直至移动完成
地址单元(AU):
定义:mcu读/写内存位置时,AU用于形成地址,在总线周期期间被放在地址总线上。
1.段寄存器
80286有四个段寄存器:CS/DS/SS/ES
段寄存器的作用是指向包含特定类型信息的内存区域的起始地址。
段寄存器的作用是指向包含特定类型信息的内存区域的起始地址。
80286源于源于当时流程的结构化编程的思想
即:一个特定区域存储程序(段)
一个区域存放运行中的数据
一个内存的暂存区域又称为栈
一个额外的数据段
即:一个特定区域存储程序(段)
一个区域存放运行中的数据
一个内存的暂存区域又称为栈
一个额外的数据段
2. 段寄存器在实模式下的使用(p63-66 一句话总结↓)
若段寄存器内存的值为2000h,表示指示的内存地址为20000h
只要复位后从保护模式切换到实模式,就可以使用所有物理内存地址
但实际上,段寄存器中的地址是四个高阶16进制数字,最低有效位
是虚数,段寄存器中放置1000h,是指向从地址10000开始的内存段
若段寄存器内存的值为2000h,表示指示的内存地址为20000h
- 在实模式下,基于ISA的80286/386/486mcu会被限制成和8086/8088一样,
只要复位后从保护模式切换到实模式,就可以使用所有物理内存地址
- 每个段寄存器中的地址指向内存中段的实际起始地址,
但实际上,段寄存器中的地址是四个高阶16进制数字,最低有效位
是虚数,段寄存器中放置1000h,是指向从地址10000开始的内存段
- 总之,段寄存器用于告诉微处理器内存中代码、数据、堆栈和额外段的起始地址。
3. CS 代码段和IP指针寄存器 (指令常被称为code)
16位IP寄存器指向下一条指令应该从代码段中读取的确切位置。
CS提供地址的段部分,IP提供偏移量。用分段:偏移的格式引用内存地址,冒号作为分割
例: CS和IP当前内容为 3000:0010
表示从内存地址30000h开始的代码段中的位置0010h的处取下一条指令
(30010h是mcu放在地址总线上读取下一条指令的实际地址)
程序员要时刻注意下一条要执行的指令在哪个内存段中。然后将内存段的起始地址加载到CS
新段中指令的偏移量加载到IP寄存器中。
另一个jump将新值加载到ip寄存器中,由于jump在同一段内,所以称为 near jump
因为要跳到不同的代码段,所以称为FAR IUMP
- CS总是与IP一起使用,共同协作来指向mcu运行下一条指令的内存地址
16位IP寄存器指向下一条指令应该从代码段中读取的确切位置。
CS提供地址的段部分,IP提供偏移量。用分段:偏移的格式引用内存地址,冒号作为分割
例: CS和IP当前内容为 3000:0010
表示从内存地址30000h开始的代码段中的位置0010h的处取下一条指令
(30010h是mcu放在地址总线上读取下一条指令的实际地址)
- 由于inter的这种分隔方式,而IP寄存器只有16位宽,FFFFh是IP寄存器的最大值,
程序员要时刻注意下一条要执行的指令在哪个内存段中。然后将内存段的起始地址加载到CS
新段中指令的偏移量加载到IP寄存器中。
- near jump
另一个jump将新值加载到ip寄存器中,由于jump在同一段内,所以称为 near jump
- far jump
因为要跳到不同的代码段,所以称为FAR IUMP
4. DS 数据段寄存器
MOV指令若未指定哪个段,则默认为DS段
[ ]内的偏移地址不能大于FFFF
- DS寄存器指向存储与CS寄存器指向的程序相关的数据的存储器区域
MOV指令若未指定哪个段,则默认为DS段
[ ]内的偏移地址不能大于FFFF
MOV AX,2000 #2000 into AX
MOV DS,AX #AX的值传给DS
MOV AL,[0100] #将2000::0100(20100h)地址的值读给AL
MOV DS,AX #AX的值传给DS
MOV AL,[0100] #将2000::0100(20100h)地址的值读给AL
5. ES 额外段寄存器
- 使用方式和DS一样,但有微小区别
MOV AX,3000 #3000 into AX
MOV ES,AX #AX的值传给DS
MOV AL.ES:[0100] #将3000::0100(20100h)地址的值读给AL
MOV ES,AX #AX的值传给DS
MOV AL.ES:[0100] #将3000::0100(20100h)地址的值读给AL
6. SS & SP,堆栈段和栈指针寄存器
用于程序员临时存放一个值,一会儿再取回来,无需指定内存地址
SS指向用作堆栈的内存地址的起始地址,SP提供偏移部分
用于程序员临时存放一个值,一会儿再取回来,无需指定内存地址
SS指向用作堆栈的内存地址的起始地址,SP提供偏移部分
PUSH --入栈
当前SS:SP=8000:FFFF,执行指令
MOV AX,1234
PUSH AX
首先:SP自减2Byte,变成8FFFDh,然后,AL存入8FFFD,AH存入8FFFE(小端模式)
每次PUSH,SP回先自减2,再将数据存入堆。
当前SS:SP=8000:FFFF,执行指令
MOV AX,1234
PUSH AX
首先:SP自减2Byte,变成8FFFDh,然后,AL存入8FFFD,AH存入8FFFE(小端模式)
每次PUSH,SP回先自减2,再将数据存入堆。
- 所以,堆栈在内存中从堆栈中的最高内存位置向段起始地址向下增长(sp 自减)。
POP --出栈
POP AX
处理器从8FFFD开始读2Byte,存入到AX,然后SP增加2
POP AX
处理器从8FFFD开始读2Byte,存入到AX,然后SP增加2
6. 大/小端排序规则
Litte-Endian 低位优先顺序规则
最低有效字节必须与最低内存地址相关联
(适用于I/O访问和内存)
最低有效字节必须与最低内存地址相关联
(适用于I/O访问和内存)
例:当前DS是0000
MOV AX,1234
MOV [0200],AX
AL的34存在内存的00200 地址
AH的12存在内存的000201 地址
MOV AX,1234
MOV [0200],AX
AL的34存在内存的00200 地址
AH的12存在内存的000201 地址
BIG-Endian 大端字节排序规则
最高有效字节必须与最低地址相关联
(大多使用在非X86的计算机)
最高有效字节必须与最低地址相关联
(大多使用在非X86的计算机)
如果代码依旧如上如上:
AH的12存在内存的00200 地址
AL的34存在内存的000201 地址
AH的12存在内存的00200 地址
AL的34存在内存的000201 地址
7. 扩展内存
定义:是指驻留在超过1M或更高地址的内存
8086/8088只有20根地址线,无法扩展。
80286/80386/80486/奔腾微处理器也不能扩展内存,
除非微处理器自上次复位后至少被设置为保护模式一次,[有一个例外,后面讲]
8086/8088只有20根地址线,无法扩展。
80286/80386/80486/奔腾微处理器也不能扩展内存,
除非微处理器自上次复位后至少被设置为保护模式一次,[有一个例外,后面讲]
在实模式下可以访问少量的扩展内存(>1MB的内存)(80286有24根地址线)
MOV AX,FFFF
MOV DS,AX
MOV AL,[FFFF] #此时访问的内存地址为:FFFF0+FFFFh=10FFEFh
(许多MS-DOS内存管理程序用这种方法在实模式下访问扩展内存,又叫HMA)
MOV AX,FFFF
MOV DS,AX
MOV AL,[FFFF] #此时访问的内存地址为:FFFF0+FFFFh=10FFEFh
(许多MS-DOS内存管理程序用这种方法在实模式下访问扩展内存,又叫HMA)
8086只有20根地址,如果这么操作其无法像80286那样访问扩展地址
但是是会产生地址回绕或段回绕( 段的地址空间从最高物理地址到最低物理地址回绕)
从而可以访问地地址上的数据,比如中断表或者BIOS空间
(为了使286以上处理器兼容这些代码,就必须截断来模拟这20根地址)
但是是会产生地址回绕或段回绕( 段的地址空间从最高物理地址到最低物理地址回绕)
从而可以访问地地址上的数据,比如中断表或者BIOS空间
(为了使286以上处理器兼容这些代码,就必须截断来模拟这20根地址)
总线单元(BU)
定义:当80286mcu必须与外设通信时,总线单元使用地址/数据/控制总线执行所需的总线周期。
总线单元由以下子单元组成:
总线单元由以下子单元组成:
1. 地址锁存器和驱动器
当微处理器在地址总线上放置一个地址时,地址被锁定到(由)总线单元的内部地址锁存器。
然后,地址驱动程序将锁定的地址驱动到地址总线上。
然后,地址驱动程序将锁定的地址驱动到地址总线上。
2. 指令预取器和6字节预取队列
由于处理器是顺序提取代码,只有遇到Jump才改变程序流程
指令预取器就是利用这一点,假设处理器会从下一个内存位置取指令,
并且没有jump,所以就预先把后面连续6个字节内存中的指令读取到预取器中
当mcu执行到jump指令时,预取器例的指令全部失效,从jump的位置重新取
指令预取器就是利用这一点,假设处理器会从下一个内存位置取指令,
并且没有jump,所以就预先把后面连续6个字节内存中的指令读取到预取器中
当mcu执行到jump指令时,预取器例的指令全部失效,从jump的位置重新取
3. 处理器扩展接口
这种总线单元逻辑允许微处理器与数字协处理器通信(如果它被安装)。
4. 总线控制逻辑
- 它是总线单元的状态机,
- 指令预取器发出读内存的总线请求
- EU发出的读/写内存或IO读/写总线请求
- 相应中断请求
5. 数据收发器
2、80286外部设备的硬件接口
地址总线
【组成】
25根信号线组成。
24根地址线:A[23::0] 和BHE# (Bus High Enable)
25根信号线组成。
24根地址线:A[23::0] 和BHE# (Bus High Enable)
数据总线
技术上说:80286有16根数数据总线
准确地说:80286数据总线由2个8位DB构成
数据传输由3个基本规则来组织
准确地说:80286数据总线由2个8位DB构成
数据传输由3个基本规则来组织
【三条规则】
适用于80286/80386SX
适用于80286/80386SX
1. 基于x86架构的处理器,每个memory或I/O存储单元存储1个字节的信息
基于80286的系统中,每个存储单元包含1个字(2 个字节)的信息
基于80286的系统中,每个存储单元包含1个字(2 个字节)的信息
2. 在每个A0为0的时候,地址是偶数
A0为1的时候,地址是奇数
A0为1的时候,地址是奇数
3. 80286读写一个偶数地址,数据被放在低数据路径上D[7:0]
读写一个奇数地址,数据被放在高数据路径[15:8]
读写一个奇数地址,数据被放在高数据路径[15:8]
控制总线
控制总线由除地址总线和数据总线之外的所有80286信号线组成。
CBus信号线可分为以下子类:
CBus信号线可分为以下子类:
1. Bus Cycle Definition lines
总线周期定义线
BU从外部位置读写数据时会运行一个总线周期,总线cycle期间
通过在总线周期定义线上放置适当的模式来指定总线周期的类型
BU从外部位置读写数据时会运行一个总线周期,总线cycle期间
通过在总线周期定义线上放置适当的模式来指定总线周期的类型
2.Bus Mastering lines
总线掌握线 p90-94
3. Ready Line
允许慢速访问设备延长mcu总线周期,以匹配自己的慢速设备
4. Interrupte Line
80286有2个输入,由外部逻辑来中断cpu的程序执行,分别是INTR&NMI
INTR:可屏蔽中断请求输入
程序员不想某段程序的中断被响应,可以以CLI作为前缀清除中断启用,
结束后,应执行STI,重新启用外部识别
程序员不想某段程序的中断被响应,可以以CLI作为前缀清除中断启用,
结束后,应执行STI,重新启用外部识别
NMI:不可屏蔽中断请求
用于外部逻辑警告MCU检测到一个软/硬件故障
用于外部逻辑警告MCU检测到一个软/硬件故障
5、Processer Extension Interface Line
处理器扩展是数字协处理器的另一个名称。这四条信号线是用来连接数字协处理器和微处理器的
- 处理器扩展请求(PEREQ)是数字协处理器的输出和微处理器的输入。它被数字协处理器用来要求微处理器执行内存传输。
- 处理器扩展确认(PEACK#)是微处理器的输出和数字协处理器的输入。微处理器使用PEACK#来响应数字协处理器发出的PEREQ。它通知数字协处理器请求的内存传输正在进行中。
- BUSY#是从数字协处理器到微处理器的输出。当数字协处理器开始执行从微处理器接收到的指令时,它会断言BUSY#。当断言BUSY#时,微处理器不应该再将任何指令转发给数字协处理器.
- ERROR#是从数字协处理器到微处理器的输出。它通知微处理器,数字协处理器在执行指令时发生了错误。在ISA机器中,数字协处理器的ERROR#的输出没有连接到微处理器的ERROR#输入。
6. Clock Line
常称为CLK2,这是微处理器的双频时钟输入。在内部,微处理器然后将CLK2除以2得到PCLK,即微处理器的真正心跳。
7. Reset Line
Mcu的RESET来自电源的PowerGood信号线,电源第一次上电电压不稳定
PowerGood失效,电压稳定后PowerGood生效RESET失效。
RESERT生效时,对mcu和其他系统组件有2个影响
PowerGood失效,电压稳定后PowerGood生效RESET失效。
RESERT生效时,对mcu和其他系统组件有2个影响
1. 在电压稳定之前阻止任何活动的发生。
2. 在让微处理器和其他系统设备开始工作之前,将它们预设到一个已知的状态。
这确保机器总是以相同的方式启动。
这确保机器总是以相同的方式启动。
3.、保护模式
保护模式和多任务操作系统介绍
1、80286的保护模式用于促进unix或OS/2等多任务操作系统的实现
其与MS-DOS的一次处理一个任务不同
其与MS-DOS的一次处理一个任务不同
1、多任务OS通常将任务运行到以下两种情况之一
- 预定的时间段已过
- 任务需要的不是立即可用的
2、80286保护模式的功能
1. 保护应用程序免受其他程序的攻击。即 不允许一个应用程序使用另一个应用程序的数据或代码段。
任何访问的尝试都会导致一个异常中断,这个异常中断将由操作系统软件处理
任何访问的尝试都会导致一个异常中断,这个异常中断将由操作系统软件处理
2. 保护自己不受它所监督的应用程序的影响。
3. 提供应用程序和1/0设备之间的接口。如果应用程序在操作系统不知情的情况下操作l/O设备(例如磁盘),
这可能是灾难性的。操作系统不会知道磁盘上的数据或1/0设备的状态已经改变
这可能是灾难性的。操作系统不会知道磁盘上的数据或1/0设备的状态已经改变
3. 保护模式下
段寄存器被分成几类
段寄存器被分成几类
1. 全局段,属于所有程序(皆可访问)。(全局描述符描述)
2. 本地段,属于一个特定的应用程序。因为它是当前运行的应用程序的本地段。(局部描述符描述)
除了“拥有”此本地段的应用程序或操作系统,其他程序访问本地段的任何尝试都将导致异常中断。
3. 系统段,属于操作系统软件。操作系统以外的程序访问系统段的任何尝试都会导致异常中断
4. 只读段。任何写入只读段的尝试都会导致异常中断。
5. execute-only代码段。任何试图访问除指令获取之外的仅执行权限的操作都将导致异常中断,即使尝试将指令读取为
数据(使用MOV指令)也会导致此异常。即,另一个程序不能反汇编一个程序的代码段中的指令来弄清楚是什么使它运行。
6. 读/写段。这将是一个正常的数据段。
7. 只能由特权级别等于或大于段特权级别的程序访问。
(更多-见备注)
2. 本地段,属于一个特定的应用程序。因为它是当前运行的应用程序的本地段。(局部描述符描述)
除了“拥有”此本地段的应用程序或操作系统,其他程序访问本地段的任何尝试都将导致异常中断。
3. 系统段,属于操作系统软件。操作系统以外的程序访问系统段的任何尝试都会导致异常中断
4. 只读段。任何写入只读段的尝试都会导致异常中断。
5. execute-only代码段。任何试图访问除指令获取之外的仅执行权限的操作都将导致异常中断,即使尝试将指令读取为
数据(使用MOV指令)也会导致此异常。即,另一个程序不能反汇编一个程序的代码段中的指令来弄清楚是什么使它运行。
6. 读/写段。这将是一个正常的数据段。
7. 只能由特权级别等于或大于段特权级别的程序访问。
(更多-见备注)
段寄存器在保护模式下的使用
【保护模式下1】
段寄存器在保护模式下的使用
段寄存器在保护模式下的使用
打开保护模式:
1、第21条线A20。
2、置位CR0的位0(Protection Enable,PE)
通过将CR0即MSW寄存器中的bit0的PE bit1
可以将微处理器置于保护模式
(写该位之前,必须将某些信息表写入内存,
否则启用保护模式后,一切都会混乱)
1、第21条线A20。
2、置位CR0的位0(Protection Enable,PE)
通过将CR0即MSW寄存器中的bit0的PE bit1
可以将微处理器置于保护模式
(写该位之前,必须将某些信息表写入内存,
否则启用保护模式后,一切都会混乱)
【实模式下】
80286有24条地址线,但段寄存器只能形成5位地址(不超过1M,即000000h-0FFFFFh)
段寄存器中的值(末尾为0h)是内存中各个段(CS/DS/SS/ES)的实际起始地址
80286有24条地址线,但段寄存器只能形成5位地址(不超过1M,即000000h-0FFFFFh)
段寄存器中的值(末尾为0h)是内存中各个段(CS/DS/SS/ES)的实际起始地址
【保护模式下1】
80286能生成16M(000000h-FFFFFFh)的存储地址,
段寄存器(常称为段选择器)中的值包含以下信息
80286能生成16M(000000h-FFFFFFh)的存储地址,
段寄存器(常称为段选择器)中的值包含以下信息
- 请求者特权级别(RPL)
- 表指示位(TI)
- 表索引字段
【段选择符】
- RPL字段:指示试图访问目标段的程序的特权级别
- 表指示位TI:指向内存中两个表中的一个
- 表索引部分:提供一个到TI位所指示的表的索引值
【保护模式下2】
除了段寄存器之外,80286还有三个寄存器,分别是:
除了段寄存器之外,80286还有三个寄存器,分别是:
- 全局描述符表寄存器(GDTR)
- 本地描述符表寄存器(LDTR)
- 中断描述符表寄存器(IDTR)。
【保护模式的存储器寻址】
实模式采用段地址+偏移地址寻址的方案,保护模式下,偏移地址仍然存在,但段地址将不复存在。
在放置段地址的地方--段寄存器里放置了一个选择符,用于选择一个描述表(GDT)里的描述符。
描述符描述了存储段的位置、长度和访问权限。
【选择符和描述符】
装在段寄存器里的选择符,用于从 全局/局部两个描述符表的一个中,选择8192个描述符中的一个,描述符描绘存储段的位置、长度、和访问权限。(用于段寄存器选择的两个描述符表:一个包括全局描述符,另一个包括局部描述符,前者适用于所有程序的段定义,后者一般适用于特定的应用程序。每个描述符表包括8192个描述符)
实模式采用段地址+偏移地址寻址的方案,保护模式下,偏移地址仍然存在,但段地址将不复存在。
在放置段地址的地方--段寄存器里放置了一个选择符,用于选择一个描述表(GDT)里的描述符。
描述符描述了存储段的位置、长度和访问权限。
【选择符和描述符】
装在段寄存器里的选择符,用于从 全局/局部两个描述符表的一个中,选择8192个描述符中的一个,描述符描绘存储段的位置、长度、和访问权限。(用于段寄存器选择的两个描述符表:一个包括全局描述符,另一个包括局部描述符,前者适用于所有程序的段定义,后者一般适用于特定的应用程序。每个描述符表包括8192个描述符)
【选择符】
在保护模式中,原先实模式中的段寄存器CS,DS,ES,FS,GS,SS,存放选择符,
bit[15:3]共13位用于从2^13(8192)个选择符中选择一个,而非地址。GDT的线性地址在GDTR中,又每个描述符占8字节,
所以描述符在表内的偏移地址是索引号*8。段选择子的概念和原先实模式中的段寄存器完全不一样
在保护模式中,原先实模式中的段寄存器CS,DS,ES,FS,GS,SS,存放选择符,
bit[15:3]共13位用于从2^13(8192)个选择符中选择一个,而非地址。GDT的线性地址在GDTR中,又每个描述符占8字节,
所以描述符在表内的偏移地址是索引号*8。段选择子的概念和原先实模式中的段寄存器完全不一样
描述符,占8个字节
Attribute Byte
【描述符1】从内存中读取的8字节段描述符会被加载到一个特殊的微处理器寄存器中,
称为描述符缓存寄存器。这四个段寄存器中的每一个都有一个对应的缓存寄存器。
称为描述符缓存寄存器。这四个段寄存器中的每一个都有一个对应的缓存寄存器。
【描述符2】字节0和1,即描述符中的前两个字节,指定所描述的段的大小。
接下来的三个字节提供内存中该段的实际起始地址。因为这是一个24位的值,
所以开始地址可以是“在80286微处理器的16MB内存地址空间中的任何位置”。
下一个字节称为属性字节,定义了段的以下特征:
接下来的三个字节提供内存中该段的实际起始地址。因为这是一个24位的值,
所以开始地址可以是“在80286微处理器的16MB内存地址空间中的任何位置”。
下一个字节称为属性字节,定义了段的以下特征:
52
全局描述符表(GDTR):由各种段描述符组成的表,包括局部表(LDT)、状态表(TSS)等等
图4-9。DS寄存器从全局描述符表中选择一个描述符,该例中,DS寄存器寻址段的100000H-1000FFH存储单元
访问权限字节
【访问权限字节】
控制对内存段的访问,该字节描述了段在系统中有哪些功能。用于全面地控制段的访问。
如果是数据段,就指定增长方向,如果段长度越过了它的界限,mcu程序就被中断,表明出现了一般性错误。也可以说明一个数据段是可写的或是写保护的。代码段也以同样的姿态被控制,为了保护软件还可以禁止读取操作
控制对内存段的访问,该字节描述了段在系统中有哪些功能。用于全面地控制段的访问。
如果是数据段,就指定增长方向,如果段长度越过了它的界限,mcu程序就被中断,表明出现了一般性错误。也可以说明一个数据段是可写的或是写保护的。代码段也以同样的姿态被控制,为了保护软件还可以禁止读取操作
每个描述符是8个字节,所以全局和局部描述符最大为64K字节。80286和80386至Pentium的描述符有少许区别,但是向上兼容的。
80386及以上微处理器使用32位基地址,允许段在其4G字节存储器的任何单元开始。注意80286描述符的基地址时如何与80386向上兼容的,因为其Byte7是00H。
对于80386至Pentium,其段界限是20位,访问长度在1至1MB之间或4KB至4GB之间的存储段。即基地址是00F00000H,段界限是000FFH。
(80386至Pentium描述符的Byte 6里出现了一个G位,即粒度位,若G=0,说明段界限长度从1至1M字节,若G=1,则界限长度为4k字节的倍数,这允许段长从4K字节开始,以4K字节为步长,直到4G字节)
- 描述符基地址指针指示存储段的起始地址单元。
80386及以上微处理器使用32位基地址,允许段在其4G字节存储器的任何单元开始。注意80286描述符的基地址时如何与80386向上兼容的,因为其Byte7是00H。
- 段界限包含段最大偏移地址。(例如:基地址是F00000H,界限是FFH, 即段区间为F00000H--F000FFH)
对于80386至Pentium,其段界限是20位,访问长度在1至1MB之间或4KB至4GB之间的存储段。即基地址是00F00000H,段界限是000FFH。
(80386至Pentium描述符的Byte 6里出现了一个G位,即粒度位,若G=0,说明段界限长度从1至1M字节,若G=1,则界限长度为4k字节的倍数,这允许段长从4K字节开始,以4K字节为步长,直到4G字节)
80286 Segment Descripter format
80286保护模式环境的段描述格式:
Byte0和1:描述段的长度和限制
Byte2/3/4:提供段的起始地址,允许段地址从80286的16M内存的任何位置开始
Byte5:属性字节,描述段的特性
Byte6/7:未被80286使用
Byte0和1:描述段的长度和限制
Byte2/3/4:提供段的起始地址,允许段地址从80286的16M内存的任何位置开始
Byte5:属性字节,描述段的特性
Byte6/7:未被80286使用
80386/Pentium General Segment Descripter format
80386保护模式环境的段描述格式:
- Byte0/1: Byte0/1/和Byte6的低四位制定了段的长度,这20位,可指定0-1M的段长度,
- Byte2/3/4/7:指定段起始地址,允许段位于4G区间的任何位置
- 第6字节的第7位G位 用于定义段的单位长度。即粒度位。如果G = 0,长度以字节为单位。这允许一个段的长度从1到1MB。如果G =1,界限长度是4k字节的倍数,因此界限字节是4k的乘积,这允许段长从4KB字节开始,以4k字节为步长,直到4G字节。
- AV位用作指示段有效(AV=1)或者段无效(AV=0)
- D位指示在保护模式或实模式下指令如何访问寄存器或内存数据,D=0,指令是16位指令。D=1,指令是32位指令,用32位寄存器
第六章 复位逻辑
1.、电源复位
【开机执行的第一个指令见备注】
- 开启电源后,需要一段时间 等待电压达到适合工作的稳定水平,
- RESET置位时,会对mcu或其他系统组件产生2点影响
- 在能量稳定之前阻止任何活动的发生。
- 在让微处理器和其他系统设备开始工作之前,把它们预先设定到一个已知的状态。
【开机执行的第一个指令见备注】
2、按键复位
系统提供一个物理开关,按下会强制RESET信号线被置位,相当于复位PowerGood,但电源并未关闭
3、关机检测
mcu通过串行方式处理异常,当在保护模式下出现保护冲突时,会关机并重置RESET重启
4、热复位
用于80286在MS-DOS系统下访问全部内存地址。
帮助80286实现从保护模式到实模式的切换。(详情见备注)
帮助80286实现从保护模式到实模式的切换。(详情见备注)
子为此,必须采取以下行动:
- 1. 程序员存储一个地址指针,它指向负责将系统恢复到以前的操作条件的实模式指令的地址。这个指针存储在位置0040:0067到0040:006A。当处理器返回到实模式时,将使用这些位置的内容来查找实模式指令驻留的内存地址。
- 2. 在配置CMOS RAM位置(OFh)中存储一个特殊值(05h或(Ah),以指示复位的原因。CMOS RAM中复位字节的定义见表6-1。
- 3.该系统现在已经准备好回到真实模式。现在必须向键盘/鼠标界面发出热重置命令。*这是通过写FEh到kevboard/鼠标接口的命令端口在1/0地址0064h
- 4. 作为回应,键盘/鼠标界面脉冲它的热复位输出一次,导致硬件生成一个复位到80286。
- 5. 当复位变成不断言,微处理器开始获取和执行指令在开机重新启动地址,就像一个powerup刚刚发生。
- 6. 在POST开始时,程序员读取存储在配置RAM位置的值,以确定重置的原因。在本例中,这个值(05h或0Ah)表示它是由热重置导致的,以回到真实模式并继续程序执行。
- 7. POST然后检索之前存储在位置0040:0067的实模式地址指针,并跳转到指定的地址,并从它在实模式下停止的位置拾取。
子主题
MS-DOS的历史
5、备用(快速)热复位
功能与热复位相同,但速度更快
6、Ctrl+Alt+Del 软复位
当三键按下,三个键的'make'代码被存入键盘缓冲区,
当键盘中断服务程序检测到‘make’代码序列时,会调用软复位程序
(软复位程序见备注)
当键盘中断服务程序检测到‘make’代码序列时,会调用软复位程序
(软复位程序见备注)
第七章 上电运行顺序
主要重置源
每一个ISA PC电源会产生一个PowerGood,主板上,RESET信号由PowerGood信号驱动,
在输出电压达到稳定之前,PowerGood信号由电源保持为低电平0。即RESET=1
在输出电压达到稳定之前,PowerGood信号由电源保持为低电平0。即RESET=1
如图中的触发器提供一个与CLK2同步的RESET输出,
它是来自电源的POWERGOOD信号的翻转。
它是来自电源的POWERGOOD信号的翻转。
电源电压不稳定时,当PowerGood=0,RESET=1,其对mcu有两点影响
- 在能量稳定之前阻止任何活动的发生。
- 在让微处理器和其他系统设备开始工作之前,把它们预先设定到一个已知的状态。
重置会如何影响处理器
当RESET=1时,mcu无法获取和执行指令
这些值会强制重置到8086\8088mcu寄存器中
这些值会强制重置到8086\8088mcu寄存器中
续图7-2
当系统重置时,其输出状态如上
输出电压稳定时处理器的反应
当输出电压稳定时,PowerGood=1,RESET=0,
此时,mcu开始运行,386/486/奔腾mcu
开始执行自检程序。mcu用CS+IP寄存器从内存获取和执行第一条指令
此时,mcu开始运行,386/486/奔腾mcu
开始执行自检程序。mcu用CS+IP寄存器从内存获取和执行第一条指令
在实模式下,CPU基址总是在16位段寄存器CS(内容F000h)左移4位来产生20位基址,
从而产生一个代码段的起始地址F0000h。然后将IP寄存器中包含的地址FFF0h偏移部分
添加到段的起始地址,生成的内存地址FFFFOh
从而产生一个代码段的起始地址F0000h。然后将IP寄存器中包含的地址FFF0h偏移部分
添加到段的起始地址,生成的内存地址FFFFOh
The processor is initialized to this starting address as follows. The CS reaister has two parts: the visible segment selector part and the hidden base address part. In real-address mode, the base address is normally formed by shifting the 16-bit seqment selector value 4 bits to the left to produce a 20-bit base address. However, during a hardware reset, the segment selector in the CS register is loaded with F000H and the base address is loaded with FFFF0000H. The starting address is thus formed by adding the base address to the value in the EIP register (thatis, FFFF0000 + FFF0H =FFFFFFF0H).(32位处理器初始化)
mcu运行的第一个总线周期
mcu启动一个内存读总线周期来从内存中的上电重新启动地址取出第一个指令。
开机重启地址总是位于Boot-ROM中。
开机重启地址总是位于Boot-ROM中。
从开机重启地址获取的第一条指令始终是开机自检或POST的第一条指令。
POST程序在Boot-ROM中,并且总是第一个要运行的程序。
POST程序在Boot-ROM中,并且总是第一个要运行的程序。
直到程序执行jump指令跳到另一个代码段,mcu才会将较高地址线为1设为0; (FFFFFFF0H)
(即直到一个新值加载到CS寄存器。重新加载CS和IP寄存器的跳转指令被称为“段内跳转”或“段间跳转”
除非处理器被程序切换到保护模式,否则较高位的地址线就会一直保持为0。
实际上,系统ROM执行的第一条指令总是一条jump指令,因此CS会在执行第一个指令时立即重新加载。mcu较高的位被设为L,他们将不会再次设置高,而处理器保持在实模式。
这也意味着mcu在实模式下不能访问附加内存(大于1MB的内存)。
(即直到一个新值加载到CS寄存器。重新加载CS和IP寄存器的跳转指令被称为“段内跳转”或“段间跳转”
除非处理器被程序切换到保护模式,否则较高位的地址线就会一直保持为0。
实际上,系统ROM执行的第一条指令总是一条jump指令,因此CS会在执行第一个指令时立即重新加载。mcu较高的位被设为L,他们将不会再次设置高,而处理器保持在实模式。
这也意味着mcu在实模式下不能访问附加内存(大于1MB的内存)。
jump指令机器码
第八章 80286系统内核
1、总线控制逻辑
为了完成一个总线周期所需的所有动作,80286微处理器需要外部逻辑的帮助。
涉及到这个过程的主要的的逻辑被称为Bus Device Logic。参见图8-1。
涉及到这个过程的主要的的逻辑被称为Bus Device Logic。参见图8-1。
图8-1 Bus Control Logic
微处理器的外部逻辑可以通过查看80286定义的总线周期输出pin来检测总线周期是否开始。当检测到SO#或S1#变低时,这表示总线周期的开始。这触发与微处理器的总线单元一起工作的总线控制逻辑的状态机在总线周期内完成数据传输。总线控制逻辑使用CLK2(双频率时钟)为其状态机定义时间插槽。在总线周期适当的时间,总线控制逻辑执行适当的动作来完成总线周期
解释了S0#和S1#的作用,是表示启动一个总线周期
S1#=0,S0#=1 --开始一个读总线周期
S1#=1,S0#=0 --开始一个写总线周期
S1#=0,S0#=1 --开始一个读总线周期
S1#=1,S0#=0 --开始一个写总线周期
2、地址锁存器
intel规定,每个基于80286的系统必须包含一个名为地址锁存器的外部设备。
图8-2 The Address Latch
当mcu在一个总线周期输出地址到本地地址总线上时,总线控制逻辑信号ALE(address latch enable)命令地址锁存器保持或锁存住这个地址。一旦锁存,地址锁存输出把地址输出到系统地址总线SA[19:1],然后遍及整个系统的地址解码器会检测这个锁存的地址,去判断是否mcu尝试和他们各自的设备通信
必须包含地址锁存器和LA可锁存地址线(Latchable Address Lines)来支持80286的地址流水功能
注意:地址线A[23:20]没有被锁住,这些地址线和A[19:17]通过缓冲器直接到LA。
LA总线直接与ISA总线的16位槽连接。稍后讲解LA bus的作用
注意:地址线A[23:20]没有被锁住,这些地址线和A[19:17]通过缓冲器直接到LA。
LA总线直接与ISA总线的16位槽连接。稍后讲解LA bus的作用
3、地址流水线(Pipelining)
略
4、地址总线收发器
解释了DT/R和Data Enable信号的作用
- DT/R=1 收发器处于transmit模式,数据从左往右传输
- DT/R=0 收发器处于read模式,数据从右往左传输
5、数据总线控制逻辑
解释了M16#\IO16#信号的作用
M16#=0 ,表示与16位的外设进行memory通信;=1 表示与8位外设
IO16#=0 ,表示与16位的外设进行IO地址通信;=1 表示与8位外设
M16#=0 ,表示与16位的外设进行memory通信;=1 表示与8位外设
IO16#=0 ,表示与16位的外设进行IO地址通信;=1 表示与8位外设
5、场景
场景1--在8位设备的偶数地址读取8位
同下
8位设备data line接在SD[7:0]上,收发都在其上
8位设备data line接在SD[7:0]上,收发都在其上
场景2--从8位设备的奇数地址读取8位
MOV DX,03F0
IN AL,61
IN AL,61
将000061H放在地址总线上&BHE#置位,先发起一个I/O read Cycle 开始,
M/IO#=0 --表示I/O操作,
S0#=1,S1#=0 --不是一个写操作,是一个读操作
enable ALE signal --将local地址放在系统地址线SA上,整个系统的解码器去译码 片选61地址设备
61设备将数据放在SD[7:0]上,但根据规则三,奇数地址数据必须放在搞数据路径SD[15:8]上。
(因此在lower data bus path和Upper path之间加入了一个Hi/Lo Byte Copier)
DT/R#=0,ENABLE Upper=1,Enable Coy line,Hi/Lo Byte Copier将lower data path上的数据转到upper path上SD[15:8]
MCU将SD上的数据放在Local data先上,再将数据放在AL寄存器里。
M/IO#=0 --表示I/O操作,
S0#=1,S1#=0 --不是一个写操作,是一个读操作
enable ALE signal --将local地址放在系统地址线SA上,整个系统的解码器去译码 片选61地址设备
61设备将数据放在SD[7:0]上,但根据规则三,奇数地址数据必须放在搞数据路径SD[15:8]上。
(因此在lower data bus path和Upper path之间加入了一个Hi/Lo Byte Copier)
DT/R#=0,ENABLE Upper=1,Enable Coy line,Hi/Lo Byte Copier将lower data path上的数据转到upper path上SD[15:8]
MCU将SD上的数据放在Local data先上,再将数据放在AL寄存器里。
场景3--写8位到8位设备的奇数地址
同上
场景4--把16位写入到8位设备
延长 CPU READY#,在低数据路径上执行2次单独的单字节传输,
(现将lower data path写入,再将High path数据转到Low path,再写入)
(现将lower data path写入,再将High path数据转到Low path,再写入)
场景5--从8位设备读16位
同上,相反
6、Ready Logic
1、访问时间
设备的访问时间取决于设备和制造商,不同的设备(ROM/RAM/ioDevice)访问时间不同
且并不是每个设备都有READY# 信号线
且并不是每个设备都有READY# 信号线
2、获取和转换时间
访问慢速设备室,必须延长mcu总线周期来匹配设备速度,这就是CPU上有READY# input的原因
由于I/O或内存设备没有Ready output,因此必须设计一些其他方法来取消对CPU就绪信号的评估,
直到当前寻址设备准备好完成总线周期
由于I/O或内存设备没有Ready output,因此必须设计一些其他方法来取消对CPU就绪信号的评估,
直到当前寻址设备准备好完成总线周期
3、Default Ready Timer
ISA系统对不同类型的设备使用单个默认计时器。通常被安置在总线控制逻辑内部。
如图说明了当访问1/0和内存时,默认计时器插入到总线周期中的等待状态的数量。
如图说明了当访问1/0和内存时,默认计时器插入到总线周期中的等待状态的数量。
4、Custem Ready Timer
ISA总线允许设计师灵活地选择不同的设备访问时间
延长默认计时器
通过覆盖默认计时器和延长总线周期所需的等待状态的数量来实现
缩短默认计时
利用NOWS#(no wait state)提供的方法。
置位NOWS#,当其被置位时,CPU会产生一个READY#信号,提前结束总线周期
置位NOWS#,当其被置位时,CPU会产生一个READY#信号,提前结束总线周期
第九章 80286总线周期详细视图
数据和地址的Revisited
当mcu要与memory或IO地址通信时,会发起一个总线周期
mcu总线单元通过addr、data、control总线去寻址设备,
指示正在进行的总线周期的事务类型,再与当前地址设备传输数据。
mcu总线单元通过addr、data、control总线去寻址设备,
指示正在进行的总线周期的事务类型,再与当前地址设备传输数据。
总线周期事务类型
mcu执行一个总线周期时,mcu的总线单元离开空闲状态和进入地址时间。在这个PCLK期间,
mcu将地址和总线周期类型定义放在总线上。整个系统的地址解码器在这个时间段开始解码地址。
地址时间后跟着数据时间。在state下,mcu在自身和当前寻址设备之间传输数据。
mcu将地址和总线周期类型定义放在总线上。整个系统的地址解码器在这个时间段开始解码地址。
地址时间后跟着数据时间。在state下,mcu在自身和当前寻址设备之间传输数据。
inter定义的传送地址和数据总线周期的状态名字
读总线周期
Bus cycle A
略 (对时序图cycle A的解释)
Bus cycle B
略 (对时序图cyclle B的解释
停止和关闭总线周期
- mcu执行一个停止或关闭总线周期时,周期定义线会呈现一下状态
- 地址位1 (A1)的状态表示是停止还是关闭总线周期。
在停止或者关闭期间,80286可以服务PEREQ(process extension request)或者HOLD request
NMI(不可屏蔽中断请求)或重置将迫使80286停止或关闭。如果中断被启用,
一个INTR(可屏蔽的中断请求)也将迫使微处理器停止(但不是停止)。
一个INTR(可屏蔽的中断请求)也将迫使微处理器停止(但不是停止)。
Halt
当微处理器执行HLT指令时,它将启动暂停或关闭总线周期,并停止提取和执行指令。
微处理器通过将值放置在总线周期定义线和地址位1上来指示它正在停止总线周期,
注意:S0#和Sl#仅在总线周期本身为低电平。 当微处理器采样在数据时间结束时声明的READY#时,
总线周期结束。
微处理器通过将值放置在总线周期定义线和地址位1上来指示它正在停止总线周期,
注意:S0#和Sl#仅在总线周期本身为低电平。 当微处理器采样在数据时间结束时声明的READY#时,
总线周期结束。
总线循环结束后,通过以下标志从外部识别停止状态:
S#=s1#=1 M/IO#=1 Address bit1=1
S#=s1#=1 M/IO#=1 Address bit1=1
Shutdown
关闭总线周期和停止总线周期的标志相同,唯一不同的时Address bit1=0
第十章 80386DX和SX微处理器
Introduction
本章描述了80386DX和SX处理器,它们的内部单元都是一样的,除了外围设备不同
本章分成3部分:
本章分成3部分:
- 80386的内部结构和操作
- 80386DX和外部设备的接口
- 80386SX和外部设备的接口
80386功能单元
组成
80386处理器由5个功能单元组成:
总线单元:处理mcu和外部设备之间的通信
代码预取单元:在处理器实际请求前,从内存中获取指令
指令解码单元:在将指令传递到执行单元执行之前对指令进行解码。
执行单元:进行指令的实际执行
内存管理单元(MMU):当微处理器寻址一个内存位置时,MMU形成\
物理内存地址。在一个总线周期期间由总线单元驱动到地址总线上。
总线单元:处理mcu和外部设备之间的通信
代码预取单元:在处理器实际请求前,从内存中获取指令
指令解码单元:在将指令传递到执行单元执行之前对指令进行解码。
执行单元:进行指令的实际执行
内存管理单元(MMU):当微处理器寻址一个内存位置时,MMU形成\
物理内存地址。在一个总线周期期间由总线单元驱动到地址总线上。
图解
代码预取单元(CpreU)
代码预取单元利用程序执行的可预测性。通常程序指令是按顺序从内存中取出的。
只有遇到跳转指令才会改变程序流程,跳转到内存的另一个区域。
发生流更改之后,程序继续按顺序取指令,直到遇到另一条跳转指令。
只有遇到跳转指令才会改变程序流程,跳转到内存的另一个区域。
发生流更改之后,程序继续按顺序取指令,直到遇到另一条跳转指令。
当总线单元不为执行单元执行总线周期时,代码预取单元使用总线单元从内存中获取下一个顺序指令
并将其存储在16字节预取队列中。代码预取单元总是试图通过一次取整个双字(四个字节)来最大化
总线单元的吞吐量。预取指令被放置在预取队列中以等待指令解码单元的处理。
并将其存储在16字节预取队列中。代码预取单元总是试图通过一次取整个双字(四个字节)来最大化
总线单元的吞吐量。预取指令被放置在预取队列中以等待指令解码单元的处理。
指令解码单元(IDU)
指令解码单元从16字节预取队列获取指令,将其转换成微码并将其存储在一个
三深度解码指令队列中供执行单元使用。任何即时数据和偏移量与该指令相结合
的指令也从预处理队列中取出并存储在已解码的指令队列中。
三深度解码指令队列中供执行单元使用。任何即时数据和偏移量与该指令相结合
的指令也从预处理队列中取出并存储在已解码的指令队列中。
执行单元(EU)
【General】
EU依次执行从指令解码队列获取的指令,并和mcu的其他单元通信以完成指令
EU依次执行从指令解码队列获取的指令,并和mcu的其他单元通信以完成指令
指令单元本分成三个子单元。
控制单元:控制单元的微码和特殊的并行硬件速乘、除和有效地址计算。
数据单元:包含算术逻辑单元,或ALU,八个通用寄存器和一个64位桶移位器。
数据单元执行控制单元所要求的数据操作。
protection test单元:检查是否存在分段违规。
控制单元:控制单元的微码和特殊的并行硬件速乘、除和有效地址计算。
数据单元:包含算术逻辑单元,或ALU,八个通用寄存器和一个64位桶移位器。
数据单元执行控制单元所要求的数据操作。
protection test单元:检查是否存在分段违规。
【寄存器】
EU包含以下寄存器:
EU包含以下寄存器:
- 通用寄存器
- 状态和控制寄存器
- debug寄存器
- test寄存器
【通用寄存器】
在80386微处理器中实现的通用寄存器
是X86处理器家族早期寄存器的超集。
在80386微处理器中实现的通用寄存器
是X86处理器家族早期寄存器的超集。
【386通用寄存器】
EAX\EBX\ECX\EDX的寄存器是80286的扩展版本
扩展BP, SI, DI和SP寄存器的宽度到32位,允许程序员指定在微处理器的4GB地址范围内的
任何内存地址,而不改变段寄存器的内容
EAX\EBX\ECX\EDX的寄存器是80286的扩展版本
扩展BP, SI, DI和SP寄存器的宽度到32位,允许程序员指定在微处理器的4GB地址范围内的
任何内存地址,而不改变段寄存器的内容
状态\MSW\指令寄存器
Eflag寄存器时80286flag寄存器的扩展版本,包含了两个新的控制位:
RF(resume flag)位:允许程序员禁用调试异常,以便在调试异常后重新启动指令,而不会立即导致另一个调试异常。
VM(虚拟模式)位:,允许程序员启用或禁用虚拟8086模式。虚拟8086模式将在本章后面讨论。
RF(resume flag)位:允许程序员禁用调试异常,以便在调试异常后重新启动指令,而不会立即导致另一个调试异常。
VM(虚拟模式)位:,允许程序员启用或禁用虚拟8086模式。虚拟8086模式将在本章后面讨论。
控制寄存器0或CRO是80286机器状态字(MSW)寄存器的超集。 CRO包含MSW中找不到的两个新位。
扩展类型(ET)位(第4位)指示系统中存在的数字协处理器的类型(80287/80387)。当检测到80387协处理器时,ET位置1。
寻呼位PG(第31位)在该位设置为1时启用虚拟寻呼。 虚拟分页将在本章稍后的“页面转换”部分中介绍。
扩展类型(ET)位(第4位)指示系统中存在的数字协处理器的类型(80287/80387)。当检测到80387协处理器时,ET位置1。
寻呼位PG(第31位)在该位设置为1时启用虚拟寻呼。 虚拟分页将在本章稍后的“页面转换”部分中介绍。
重置后,80386城市MSW寄存器的值是0000h。80286MSW寄存器在复位后有FFFOh。因寄存器中的高级位未被处理器使用,所以这种差异没有影响。
Debug寄存器
80386调试寄存器。支持设置代码断点和数据断点
80386 Debug Registers
DR7(Debug Register 7,定义了4种断点的使能和禁用)
- 只在指令执行时中断。
- 只在数据写入时中断。
- 在数据读写时中断,
- 但在指令读取时不中断。
DR7还可用于将断点定义为特定任务的局部断点或全局断点。
DR6允许程序员确定满足了哪个断点条件。
DR4和DR5没有被80386使用。
DRO - DR3用于指定最多四个断点地址
DR4和DR5没有被80386使用。
DRO - DR3用于指定最多四个断点地址
Test寄存器
80386测试寄存器用于测试分页单元的转换后备缓冲器或TLB
80386 test Register
TR6是TLB访问的命令寄存器,而TR7是数据寄存器。地址和命令使用命令寄存器写入TLB,
而数据使用数据寄存器从TLB读取或写入TLB。
而数据使用数据寄存器从TLB读取或写入TLB。
内存管理单元(MMU)
Segmention单元(SU)
微处理器必须在下列情况下访问内存:
- 为代码预取单元获取下一条指令。
- 当执行单元必须从内存中读取数据以满足MOV输入时结构式。
- 当执行单元必须向内存写入数据以满足MOV指令时。
- 在保护模式下,当段寄存器加载了一个新值时,从内存中获取段描述符。
- 从内存中获取页目录或页表项。
当微处理器必须访问内存时,段单元通过将目标段内的偏移量加到包含在相应段寄存器内的段起始地址来形成内存地址。
最后得到的32位内存地址,称为线性地址,
然后要么提交给分页单元(如果分页启用),要么在最终的内存总线周期中输出到地址总线上。
最后得到的32位内存地址,称为线性地址,
然后要么提交给分页单元(如果分页启用),要么在最终的内存总线周期中输出到地址总线上。
实模式下,程序员可以使用所有的段寄存器,包括FS和GS。
在实模式下,程序员还可以访问调试、控制和测试寄存器。
在实模式下,程序员还可以访问调试、控制和测试寄存器。
Page单元(PU)
后面的Page Translate章节对Page页有详细描述
总线单元(BU)
总线单元提供微处理器和外部存储器和I/O设备之间的接口。
当微处理器必须从外部设备读信息或写信息时,总线单元使用地址/数据/控制总线运行一个或多个总线cycles。出现以下请求时,总线单元会运行总线周期。
当微处理器必须从外部设备读信息或写信息时,总线单元使用地址/数据/控制总线运行一个或多个总线cycles。出现以下请求时,总线单元会运行总线周期。
- 运行l/O或内存读写的执行单元。
- 从存储器读取下一条指令的代码预取单元。
- 在保护模式下,当段寄存器加载新值时,从内存中获取段描述符
- 执行单元从内存中获取页目录或页表条目的分页单元。
存储器分页
80386以后的mcu的分页机制允许把任何物理存储单元分配给任何线性地址,线性地址是由存储器程序产生的。
以存储器分页为单位,线性地址透明地转换为物理地址。32位物理地址被放在地址总线上
以存储器分页为单位,线性地址透明地转换为物理地址。32位物理地址被放在地址总线上
分页寄存器
分页单位由mcu控制寄存器的内容来控制,Pentium处理器另加了一个CR4,其中一个特性用CR4 bit4打开一个4MB的页
对分页单位至关重要的寄存器是CR0和CR3
- CR0 的bit31(PG)=1时,就选择分页,PG位为0时,程序产生的线性地址就是物理地址,用于寻址存储器。GP=1时,则线性地址通过分页机制变换为物理地址。实模式和保护模式下分页机制都能正常工作
- CR3的内容包括页索引基地址和PCD、PWT位,这两位控制mcu上的PCD和PWT管脚,PCD=1时,PCD脚在缺页的总线周期变为逻辑1,这就允许外部硬件取控制2级高速缓冲存储器。PWT位是缺页的总线周期在PWT管脚上出现的信号标志,以便控制通写系统中的高速缓冲存储器。页索引基地址装载为页转换单位的页索引。
图4.11 微处理器的控制寄存器结构
线性地址(32位)分为3段,页目录项、页表项和页偏移地址。
bit[32:22],高10位寻址页目录,对应线性地址为00000000H到003FFFFFH,页目录的第一项被访问,每个页目录代表一个4M字节的段。
bit[21:12],中间20位索引页表,其范围为4K字节,
bit[11:0] 表示线性地址偏移量,用于选择4K字节存储页内的一个字节
bit[32:22],高10位寻址页目录,对应线性地址为00000000H到003FFFFFH,页目录的第一项被访问,每个页目录代表一个4M字节的段。
bit[21:12],中间20位索引页表,其范围为4K字节,
bit[11:0] 表示线性地址偏移量,用于选择4K字节存储页内的一个字节
子主题
页目录和页表
系统中只有一个页目录,页目录包含1024个双子地址,最多可装1024个页表,页目录和每个页表为4K字节长
Page Translation
虚拟 Paging
见书 p164-170
Translation Look-aside Buffer(TLB)
如果微处理器每次访问内存时都必须访问两级基于内存的表,性能将大幅下降。为了解决这个问题,80386微处理器维护了最近访问过的页表项的片上高速缓存。这个缓存被称为转换后备缓冲区(TLB )。
80486中,最近的32个页表转换被存在TLB中,若某个存储区被访问,而地址已在TLB中,就不需要再去访问页目录和页表,加速了程序的执行。若TLB中没有,则必须访问页目录和页表,这就会要增加执行时间
80486中,最近的32个页表转换被存在TLB中,若某个存储区被访问,而地址已在TLB中,就不需要再去访问页目录和页表,加速了程序的执行。若TLB中没有,则必须访问页目录和页表,这就会要增加执行时间
虚拟8086模式
80386可在两种模式中执行8086代码:实模式和虚拟8086模式
1、从tss(任务状态实例)加载的Eflags寄存器中的VM标志位将正在运行的任务的虚拟处理器定义为8086或80386,当80386从其VM标志位已设置的TSS加载其寄存器时, 处理器进入虚拟8086模式。 在随后的任务切换上,当处理器从TSS加载VM清除的TSS寄存器时,它将离开虚拟8086模式。 因此,在逐个任务的基础上,处理器根据VM位的值模拟80386或8086。 80386在引发异常或被中断时也会离开虚拟8086模式,从而使体系结构的全部资源可用于中断和异常处理程序。 从虚拟8086模式下调用的处理程序返回时,当从堆栈中重新加载Eflags寄存器时,80386将自动重新进入虚拟8086模式。
2、因为8086的地址空间是1兆字节,所以虚拟8086模式任务生成的逻辑地址属于80386线性地址空间的第一个兆字节。多个虚拟8086模式任务可能会相互干扰,因为它们都将共享线性地址空间的低兆字节。操作系统可以使用80386分页将虚拟8086模式任务的线性地址空间重定位到物理地址空间的不同区域。以这种方式使用分页不仅可以防止虚拟8086模式任务之间的干扰,而且可以使虚拟内存操作系统像交换80386任务一样交换虚拟8086模式任务的页面。
3、从tss(任务状态段)加载的Eflags寄存器中的VM标志位将正在运行的任务的虚拟处理器定义为8086或80386,当80386从其VM标志位已设置的TSS加载其寄存器时, 处理器进入虚拟8086模式。 在随后的任务切换上,当处理器从TSS加载VM清除的TSS寄存器时,它将离开虚拟8086模式。 因此,在逐个任务的基础上,处理器根据VM位的值模拟80386或8086。 80386在引发异常或被中断时也会离开虚拟8086模式,从而使体系结构的全部资源可用于中断和异常处理程序。 从虚拟8086模式下调用的处理程序返回时,当从堆栈中重新加载Eflags寄存器时,80386自动重新进入虚拟8086模式
Automatic Self-Test
80386外部接口
地址总线
80386DX地址bus由两组信号线组成 地址总线:A[21:2], byte enable bus BE#[3:0],
数据总线
控制总线
80386SX外部接口
接口信号的差异
第十一章 80386系统内核
第二部分
第三部分
总线的发展
1. ISA (Industry Standard Architecture)
2. MCA (Micro Channel Architecture)
3. EISA (Extended Industry Standard Architecture)
4. VLB (VESA Local Bus)
5. PCI (Peripheral Component Interconnect)
6. PCI-X (Peripheral Component Interconnect eXtended)
7. AGP (Accelerated Graphics Port)
8. PCI Express (Peripheral Component Interconnect Express)
2. MCA (Micro Channel Architecture)
3. EISA (Extended Industry Standard Architecture)
4. VLB (VESA Local Bus)
5. PCI (Peripheral Component Interconnect)
6. PCI-X (Peripheral Component Interconnect eXtended)
7. AGP (Accelerated Graphics Port)
8. PCI Express (Peripheral Component Interconnect Express)
版本信息:v1.0
作者:金靖淋
时间:2020.9.7-2020.9.11
进度:第一部分/第五章/第一节-通用寄存器
作者:金靖淋
时间:2020.9.7-2020.9.11
进度:第一部分/第五章/第一节-通用寄存器
版本信息:v1.1
作者:金靖淋
时间:2020.9.14-2020.9.18
进度:第一部分/第五章/第二节 地址总线
作者:金靖淋
时间:2020.9.14-2020.9.18
进度:第一部分/第五章/第二节 地址总线
版本信息:v1.2
作者:金靖淋
时间:2020.9.21-2020.9.25
进度:第一部分/第六章/完结
作者:金靖淋
时间:2020.9.21-2020.9.25
进度:第一部分/第六章/完结
版本信息:v1.3
作者:金靖淋
时间:2020.10.9-2020.10.30
进度:第一部分/第八章/第二节 地址锁存器
作者:金靖淋
时间:2020.10.9-2020.10.30
进度:第一部分/第八章/第二节 地址锁存器
版本信息:v1.4
作者:金靖淋
时间:2020.11.1-2020.11.30
进度:第一部分/第十章/第二节 386功能单元之内存管理U
作者:金靖淋
时间:2020.11.1-2020.11.30
进度:第一部分/第十章/第二节 386功能单元之内存管理U
收藏
0 条评论
下一页