查看64位多核 MIPS 异常和中断结构的源代码
←
64位多核 MIPS 异常和中断结构
跳转到:
导航
,
搜索
因为以下原因,你没有权限编辑本页:
您刚才请求的操作只有这个用户组中的用户才能使用:
用户
您可以查看并复制此页面的源代码:
== 概述 == MIPS 统称异常(同步事件)和中断(异步事件)为例外 (Exception) 引入异常则是为了解决处理器运行过程中的一些意外情形,比如执行流中有非法指令(无法被处理器辨识的指令),访问了没有映射的虚拟地址等等。 中断的引入则是提供一种 IO 设备请求处理器服务的一种通讯机制;往往是由外部设备主动发起(给处理器的中断引脚一个信号),处理器收到信号后跳转到特定入口处执行。 处理器运行在用户态的话,例外发生时,则会进行模式切换(即进入特权级,可以执行管理系统资源的特权指令,比如 mfc0/mtc0),因此中断和异常也可看作是一些事件(主动及意外)请求特权服务。因为现代操作系统都运行在特权级下,拥有并管理系统资源,因此中断和异常实际是请求操作系统服务。 因为例外发生时总会伴随模式切换,即进入特权模式,因此对于程序需要主动进入特权模式的情形(比如用户态程序通过系统调用请求操作系统服务),MIPS 引入一条 'syscall' 指令来触发系统调用例外,一旦该指令被执行,处理器即切换到特权级并进入“系统调用例外” 处理器的一个例外过程,多数情形下(非嵌套)其实就相当于一个伴随模式切换的过程调用。例外发生后,MIPS 在置 CP0 寄存器 Status[EXL] = 1,并将当前 PC 值存入 EPC (Exception PC,即指向发生例外的指令),就从当前指令流跳转到另外一个指令流,MIPS 硬件不负责保存上下文,因此软件先保存上下文,服务完成后恢复上下文,再执行指令 'eret' 例外返回(eret 所作的操作为:将 EPC/ErrorEPC 的值置入 PC,同时清除 CP0_Status 寄存器的 EXL 位)。MIPS 下,只要 Status 寄存器的 EXL (exception) 位为 1 即表示处理器进入例外,处于特权模式下。 首先看一个系统调用异常发生时的现场过程,当用户态进程执行到 'syscall' 指令时,CPU 触发系统调用异常,MIPS 这样响应: a. 将引起异常的 syscall 指令所在地址压入 EPC b. 置 STATUS 的 EXL 位为 1(其他位不变) c. 设置 CAUSE 的 ExcCode 位为 8,指明这是其他例外里的系统调用异常 d. 跳转到其它例外入口 CPU 的 STATUS[EXL] 被置为 1,这个意味着: I. CPU 自动进入内核模式(忽略 STATUS[KSU] 位),禁止中断(忽略 STATUS[IE] 位) II. TLB Refill 例外入口使用其他例外入口而非原 TLB Refill 入口 III. 当又出现新例外时,CPU 将不会重新设置EPC 和 CAUSE[BD] 一个中断过程: 特权级迁移 例外向量入口 异常类型、优先级 中断特殊性 由于 MIPS 版本众多,光官方的规范版本就有 MIPS32 R1, MIPS32 R2, MIPS64 R1, MIPS64 R2 四个版本,全覆盖地讨论实在没有必要,下文单核将以 Loongson 2E 为范例(类MIPS64 R1),多核将以目前使用较多、并且 Kernel Mainline 已有支持的 Cavium Octeon CN38XX 系列为例 (MIPS64 R2) 讨论。 <br><br>
返回到
64位多核 MIPS 异常和中断结构
。
个人工具
登录
名字空间
页面
讨论
变换
查看
阅读
查看源代码
查看历史
操作
搜索
导航
首页
社区专页
新闻动态
最近更改
随机页面
帮助
工具箱
链入页面
相关更改
特殊页面