第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

相关文章

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

SpringBoot实现数据库读写分离的3种方法小结

《SpringBoot实现数据库读写分离的3种方法小结》为了提高系统的读写性能和可用性,读写分离是一种经典的数据库架构模式,在SpringBoot应用中,有多种方式可以实现数据库读写分离,本文将介绍三... 目录一、数据库读写分离概述二、方案一:基于AbstractRoutingDataSource实现动态

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Java枚举类实现Key-Value映射的多种实现方式

《Java枚举类实现Key-Value映射的多种实现方式》在Java开发中,枚举(Enum)是一种特殊的类,本文将详细介绍Java枚举类实现key-value映射的多种方式,有需要的小伙伴可以根据需要... 目录前言一、基础实现方式1.1 为枚举添加属性和构造方法二、http://www.cppcns.co

使用Python实现快速搭建本地HTTP服务器

《使用Python实现快速搭建本地HTTP服务器》:本文主要介绍如何使用Python快速搭建本地HTTP服务器,轻松实现一键HTTP文件共享,同时结合二维码技术,让访问更简单,感兴趣的小伙伴可以了... 目录1. 概述2. 快速搭建 HTTP 文件共享服务2.1 核心思路2.2 代码实现2.3 代码解读3.

MySQL双主搭建+keepalived高可用的实现

《MySQL双主搭建+keepalived高可用的实现》本文主要介绍了MySQL双主搭建+keepalived高可用的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、测试环境准备二、主从搭建1.创建复制用户2.创建复制关系3.开启复制,确认复制是否成功4.同

Java实现文件图片的预览和下载功能

《Java实现文件图片的预览和下载功能》这篇文章主要为大家详细介绍了如何使用Java实现文件图片的预览和下载功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... Java实现文件(图片)的预览和下载 @ApiOperation("访问文件") @GetMapping("

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义