- 概述
- 超标量处理器的流水线重叠是通过硬件实现的,VLIW是通过程序员和编译器实现的;一个适用通用,一个适用专用,一个硬件复杂,软件简单,一个软件复杂,硬件简单;
- 时钟和周期自己的理解
- 顺序执行和乱序执行
- Cache
- 虚拟存储器
- 地址转换
- 注:
- 物理存储器的大小不能超过处理器的最大可以寻址空间,比如:32位的处理器,最大也就4GB,超过的处理器也找不到;
- 虚拟地址用页式存储进行划分,划分为页,物理地址也会进行相应的划分,划分为frame;物理地址和虚拟地址的大小划分必须是一样的;
- 因为划分一致,所以不用管偏移量,实际虚拟地址到物理地址的映射就是VPN到PFN的映射;
- 每个程序(准确的说是进程)都会有一个页表,也就是虚拟地址和物理地址的转换;即使两个页表里的虚拟地址一样,MMU也会映射成不一样的物理地址;不过如果几个虚拟地址对应的都是同一个函数,那么MMU会把不同的虚拟地址映射到相同的物理地址;(函数就在那存着,就那一个物理地址,想整俩也没有)
- 单级页表
- page fault
- 多级页表
- 注:
- 注:
- 程序保护
- TLB
- 注:
- 地址转换
- 分支预测
- 指令集
- 复杂和精简
- 精简指令集
- 三个精简指令集的相同点
- 三个精简指令集的不同点
- 异常的新理解
- 问题:
- 指令解码
- 寄存器的重命名
- 发射
-
- 发射队列的实现方式
- 发射过程的流水线
- 分配
- 仲裁
- 压缩方式的发射队列的仲裁
- 非压缩方式的发射队列的仲裁
- 发射队列里的指令的位置是完全随机的,这就需要仲裁电路对发射队列的指令进行识别,那个是旧的,那个是新的。
- 指令在寄存器重名之后,会写入发射队列,同时也会写入ROB(重排序缓存),这个写入的时候,指令还是顺序执行的,所以ROB里其实存储着所有的指令,而且还是顺序执行的;
- 因为ROB本质上是一个FIFO,所以没法直接按照位置判断指令的新旧,加入和一个位置值(position bit)(标志写指针和读指针的关系,是不是在一个面)
- 这样,把ROB的位置值和地址值一起和指令送到发射队列里,然后仲裁电路就可以进行判断选择;但是还是有很多问题,没准备好的指令咋个处理?发射队列里现在是存着年龄信息,咋选?——通过复杂的电路实现;
- 1-of-M的仲裁电路
- N-of-M的仲裁电路
- 唤醒
- 唤醒的广播机制是通过总线的形式实现的;
- 单周期指令的唤醒
- 被仲裁电路选中指令会把他的目的寄存器的编号,送对对应的总线上;
- 每一条总线上的值会和发射队列中所有指令的源寄存器的编号进行比较,如果发现相等,就会把自己对应的源寄存器的状态设置为准备好状态;
- 发射队列中的某条指令发现自己所有的源寄存器的状态都是准备好的,并且他还没有被仲裁电路选中,那他就会向仲裁电路发出申请(选我!选我!)
- 如果仲裁电路发现,当前有优先级更高的指令,就不会理睬这个指令的申请,下个周期这个指令继续向仲裁电路发出申请;如果这条指令一直得不到这个仲裁电路的回应,他就会心灰意冷的去找另外一个(如果另外一个存在的话);如果得到了回应,这条指令就会开心的把自己标记为被选中状态(名花有主);为啥不直接发射(嫁过去),因为考虑到有些指令需要好几个周期才能运行完,所有需要在这等等,有个机制待处理;
- 这条指令根据得到的回应,把他的目的寄存器的编号,送对对应的总线上,同时去FU执行;
- 多周期指令的唤醒
- 推测唤醒
- 执行
- 提交
3460

被折叠的 条评论
为什么被折叠?



