第10章 协处理器访问指令的实现

2024-03-12 19:08

本文主要是介绍第10章 协处理器访问指令的实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

10.1 协处理器介绍

协处理器通常表示处理器的一个可选部件,负者处理指令集的某个扩展,具有与处理器核独立的寄存器。MIPS32架构提供了最多4个协处理器,分别是CP0~CP3,作用:
在这里插入图片描述

  • CP1、CP3用作浮点处理单元,CP2保留,除CP0外的协处理器都是可选的,OpenMIPS没有实现浮点运算,所以CP1,CP3不用实现,CP2也没有作用,而CP0是必须实现的。
  • 截至本章,我们的OpenMIPS处理器实现了很多指令,但是这些指令都是用来运算的,实际的处理器还要支持其他广泛的操作,例如:中断处理,提供可选的配置,观察并控制系统缓存或时钟,地址转换等。MIPS32架构定义的协处理器CP0的作用就是协助实现上述的广泛操作。主要负责工作如下:
  1. 配置cpu工作状态:符合MIPS32架构的硬件通常是很灵活的,可以童国读写一个或一些内部寄存器来改变一些根本的CPU特性(如:将字节次序从MSB变为LSB)
  2. 高速缓存控制:控制读写缓存
  3. 异常控制:异常发生时的检测核处理都由CP0中的一些控制寄存器来定义和控制
  4. 存储管理单元控制:对系统的存储区域进行合理控制、管理和分配,主要是对MMU、TLB的一些配置,管理、访问
  5. 其他:当要把额外的功能集成在CPU中,但又不方便当做外设访问时,常常在CP0中增加一些模块以实现这些功能例如:时钟,时间计数器,奇偶校验等

10.2 协处理器CP0中的寄存器

在这里插入图片描述
在这里插入图片描述
从表中可以发现很多寄存器都是与缓存、MMU、TLB、调试有关的,而OpenMIPS的设计目标是一个轻量级的处理器,并不打算实现缓存,MMU,TLB等复杂功能,所以相关寄存器都可以不用实现,本章主要实现以下7个寄存器:

  1. Count寄存器(标号9)
    在这里插入图片描述
    Count寄存器是一个不停计数的32位寄存器,技术频率一般与CPU时钟频率相同,当计数达到32位无符号的上限时,会从0开始重新计数。Count寄存器可读可写,其字段如表10-3所示:
    在这里插入图片描述
  2. Compare寄存器(标号11)
    Compare寄存器是一个32位的寄存器,与Count寄存器一起完成定时中断功能。当Count寄存器中的计数值与Compare寄存器中的值一样时,会产生定时中断。这个中断会一直保持,知道有数据被写入Compare寄存器。Compare寄存器可读可写。其字段如表10-4所示:
    在这里插入图片描述
  3. Status寄存器(标号12)
    Status寄存器也是一个32位可读可写的寄存器,用来控制处理器的操作模式、中断使能以及诊断状态。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  4. Cause 寄存器(标号13)
    用于记录最近一次异常发生的原因,也控制软件中断请求。Cause寄存器的各字段如表10-6所示,除了IP,IV和WP,其余字段都是只读的。
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
5. EPC寄存器(标号14)
异常程序计数器,存储异常返回地址
6. PRId寄存器(标号15)
处理器标志寄存器,包含:制造商信息,处理器类型以及处理器版本等。
在这里插入图片描述
7. Config寄存器
包含与处理器有关的各种配置和功能信息,大部分子弹由硬件在重启时进行初始化,或定为常量。
在这里插入图片描述
在这里插入图片描述
10.3 协处理器CP0的实现
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.4 协处理器访问指令说明

要实现CP0的控制功能,需要对CP0中的有关寄存器进行设置,这设计对CP0中寄存器的访问,需要使用处理器访问指令。MIPS32指令集架构中定义了2条协处理器访问指令:mtc0.mfc0,前者实现修改CP0中的寄存器,后者实现读取CP0中的寄存器。指令如图所示:
在这里插入图片描述
在这里插入图片描述

10.5 协处理器 访问指令实现思路

10.5.1 实现思路

与HI、LO寄存器的访问一样,对CP0中所有寄存器的写操作也都放在回写阶段。

  1. mtc0实现思路
    在这里插入图片描述
    在这里插入图片描述
  2. mfc0实现思路
    在这里插入图片描述

10.5.2 数据流图的修改

在这里插入图片描述

10.5.3 系统结构的修改

在这里插入图片描述

在这里插入图片描述

10.6 修改OpenMIPS以实现协处理器访问指令

10.6.1 修改译码阶段

10.6.2 修改执行阶段

  1. 修改EX模块
  2. 修改EX/MEM模块

修改访存阶段

  1. 修改MEM模块
  2. 修改MEM/WB模块

10.6.4 修改OpenMIPS模块

10.7 测试程序

这篇关于第10章 协处理器访问指令的实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/802284

相关文章

Spring Retry 实现乐观锁重试实践记录

《SpringRetry实现乐观锁重试实践记录》本文介绍了在秒杀商品SKU表中使用乐观锁和MybatisPlus配置乐观锁的方法,并分析了测试环境和生产环境的隔离级别对乐观锁的影响,通过简单验证,... 目录一、场景分析 二、简单验证 2.1、可重复读 2.2、读已提交 三、最佳实践 3.1、配置重试模板

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

Vue ElementUI中Upload组件批量上传的实现代码

《VueElementUI中Upload组件批量上传的实现代码》ElementUI中Upload组件批量上传通过获取upload组件的DOM、文件、上传地址和数据,封装uploadFiles方法,使... ElementUI中Upload组件如何批量上传首先就是upload组件 <el-upl

Docker部署Jenkins持续集成(CI)工具的实现

《Docker部署Jenkins持续集成(CI)工具的实现》Jenkins是一个流行的开源自动化工具,广泛应用于持续集成(CI)和持续交付(CD)的环境中,本文介绍了使用Docker部署Jenkins... 目录前言一、准备工作二、设置变量和目录结构三、配置 docker 权限和网络四、启动 Jenkins

Python3脚本实现Excel与TXT的智能转换

《Python3脚本实现Excel与TXT的智能转换》在数据处理的日常工作中,我们经常需要将Excel中的结构化数据转换为其他格式,本文将使用Python3实现Excel与TXT的智能转换,需要的可以... 目录场景应用:为什么需要这种转换技术解析:代码实现详解核心代码展示改进点说明实战演练:从Excel到

如何使用CSS3实现波浪式图片墙

《如何使用CSS3实现波浪式图片墙》:本文主要介绍了如何使用CSS3的transform属性和动画技巧实现波浪式图片墙,通过设置图片的垂直偏移量,并使用动画使其周期性地改变位置,可以创建出动态且具有波浪效果的图片墙,同时,还强调了响应式设计的重要性,以确保图片墙在不同设备上都能良好显示,详细内容请阅读本文,希望能对你有所帮助...

C# string转unicode字符的实现

《C#string转unicode字符的实现》本文主要介绍了C#string转unicode字符的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录1. 获取字符串中每个字符的 Unicode 值示例代码:输出:2. 将 Unicode 值格式化

python安装whl包并解决依赖关系的实现

《python安装whl包并解决依赖关系的实现》本文主要介绍了python安装whl包并解决依赖关系的实现,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 目录一、什么是whl文件?二、我们为什么需要使用whl文件来安装python库?三、我们应该去哪儿下

Python脚本实现图片文件批量命名

《Python脚本实现图片文件批量命名》这篇文章主要为大家详细介绍了一个用python第三方库pillow写的批量处理图片命名的脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录前言源码批量处理图片尺寸脚本源码GUI界面源码打包成.exe可执行文件前言本文介绍一个用python第三方库pi

Java中将异步调用转为同步的五种实现方法

《Java中将异步调用转为同步的五种实现方法》本文介绍了将异步调用转为同步阻塞模式的五种方法:wait/notify、ReentrantLock+Condition、Future、CountDownL... 目录异步与同步的核心区别方法一:使用wait/notify + synchronized代码示例关键