没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
MIPS Linux 异常中断代码分析 1
MIPS Linux 异常
中断代码分析
CurrentVersion: 0.16
Date: 2007-04-12
Author: Dajie Tan <jiankemeng@gmail.com>
Author: Dajie Tan <jiankemeng@gmail.com>
MIPS Linux 异常中断代码分析 2
版本历史
版本状态 作 者 参与者 起止日期 备注
0.10 Dajie Tan 07-04-12 完成草稿
0.12 Dajie Tan 07-04-19 完善 A
0.14 Dajie Tan 07-08-17 完善 B.1
0.15 Dajie Tan 07-08-19 完善 B.2
0.16 Dajie Tan 07-09-10 完善 B.3
Author: Dajie Tan <jiankemeng@gmail.com>
MIPS Linux 异常中断代码分析 3
本文拟以龙芯 2E (兼容 MIPS III)为例,对内核的异常、中断系统作一个框架式的描述,
将结合 2.6.18 的代码来说明。
A. 概述
龙芯 2E 在高优先级异常出现时,在设置了某些寄存器后,会根据异常类型跳转到相应的固
定地址处(高优先级异常服务入口),操作系统会将相应的异常处理程序,置于这些地址处。
龙芯 2E 的高优先级异常有:冷启动、热重启、非屏蔽中断,TLB 重填(32 位模式),
xTLB 重填(64 位模式),cache 错误,其他异常。
龙芯 2E 之高优先级异常入口地址有以下五个:
Table A.1 优先级异常入口
异常类型 正常运行(BEV 为 0) 启动(BEV 为 1)
冷启动、热重启、非屏蔽中断 0xFFFFFFFF BFC00000 0xFFFFFFFF BFC00000
TLB 重填 0xFFFFFFFF 80000000 0xFFFFFFFF BFC00200
xTLB 重填 0xFFFFFFFF 80000080 0xFFFFFFFF BFC00280
cache 错误 0xFFFFFFFF A0000100 0xFFFFFFFF BFC00300
其他 0xFFFFFFFF 80000180 0xFFFFFFFF BFC00380
当龙芯正常运行时,STATUS 寄存器之 BEV 位为 0 ,0xFFFFFFFF 80000000 地址处不经
TLB 映射、但缓存;当龙芯启动时,STATUS 寄存器之 BEV 位为 1,0xFFFF FFFF BFC0
0200 地址处龙芯不缓存、不经 TLB 映射。MIPS 下 TLB、Cache 都要 OS 参与管理,在其
启动时 OS 尚未接管系统,这个时候不采用 TLB、Cache 机制是很重要的。
注意,冷启动、热重启、非屏蔽中断的入口地址始终位于 0xFFFF FFFF BFC0 0000
由此可见龙芯 2E 启动时(冷启动异常或者热重启异常),执行的第一条指令是位于地址
Author: Dajie Tan <jiankemeng@gmail.com>
MIPS Linux 异常中断代码分析 4
0xFFFF FFFF BFC0 0000 处的,实际上龙芯电脑上所用之 BOOTLOADER(PMON)的第一
条指令就映射在地址空间的 0xFFFF FFFF BFC0 0000 处。
注意到上面的五个固定的异常入口地址,有一个其他异常类入口(一般称为通用异常入口),
当 CPU 内部异常或者外部中断发生时,CPU 硬件设置 CAUSE 寄存器的 ExcCode(CAUSE
6:2)位后,就跳转到该异常入口。ExcCode 位段用来描述通用异常类型,共 5 位,故而可
以描述 2^5 = 32 个异常类型。
位于通用异常入口处的是操作系统设置的一个简单的异常处理程序,它会取出 CAUSE 寄存
器的 ExcCode 域(5 位,可以描述 32 个异常),用之索引一个通用异常处理表
(exception_handlers),并跳转到异常处理表项所指向的处理程序,通用异常处理表如
下所示:
------------------------
| handle_int | ----------> 中断 ExcCode 值为 0
------------------------
| handle_tlbm | ----------> TLB 修改异常 ExcCode 值为 1
------------------------
| handle_tlbl | ----------> TLB 读异常 ExcCode 值为 2
------------------------
| ....... |
| |
------------------------
| handle_sys | ----------> 系统调用 ExcCode 值为 8
------------------------
| ....... |
该异常处理表很像 x86 的 IDT,只是他的每个表项没什么附加信息,就是一个相应异常处
理程序的地址。
来自硬件的中断,CPU 会自动将 CAUSE 寄存器的 ExcCode 域(6:2)设为 0,其最终会执行
总的中断处理程序 handle_int。
ExcCode 位为 0 时,只是笼统地描述为中断,具体的是何种中断,还要借助 CAUSE 寄存器
的 IP 位(15:8, IP7-IP0)来描述。硬件中断出现时,CPU 会根据中断信号的来源,设置
Author: Dajie Tan <jiankemeng@gmail.com>
MIPS Linux 异常中断代码分析 5
CAUSE 之 IP 位。IP 位共 8 位,每位对应一个中断。龙芯 2E 下,8 个中断的用途分配如下:
Table A.2 CAUSE 之 IP 位对应中断
IP0 软件中断 保留未用
IP1 软件中断 保留未用
IP2 硬件中断 北桥中断控制器中断
IP3 硬件中断 保留
IP4 硬件中断 保留
IP5 硬件中断 I8259A 中断
IP6 硬件中断 Perfcounter 溢出
IP7 时钟中断 Timer 中断
IP6, IP7 都是 CPU 内部产生。
可以看到,一个硬件中断的流程应该是这样的(以键盘为例):
1. 用户击键后,键盘控制器 8042 产生中断,通过 I8259A 在 CPU 的中断引脚上,引起异
常
2. CPU 自动设置 CAUSE 的 ExcCode 位为 0,IP5 为 1,并跳转到通用异常入口
0xFFFFFFFF 80000180
3. 位于通用异常入口处的简单异常处理程序,根据 ExcCode 的值索引异常处理表
(exception_handlers),获取到 0 号异常的处理程序是 handle_int,并跳转过去
4. handle_int 根据 CAUSE 之 IP 位的值跳转到中断控制器 8259A 相关的中断处理函数
do_nb2005_8259
Author: Dajie Tan <jiankemeng@gmail.com>
剩余51页未读,继续阅读
资源评论
- 蟋蟀很帅2014-02-20最近调试中断,看看能否用得上
lover2668
- 粉丝: 6
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- PHP端通过modbus协议跟第三方设备进行数据通信
- navicat安装包亲测可用
- 算法部署-使用OpenVINO部署MobileStyleGAN轻量化高保真图像合成算法-项目源码-优质项目实战.zip
- 基于java实现远程采集华为逆变器使用modbus tcp协议进行通讯的设备数据
- Unity画面共享Spout插件
- 基于C++用modbus实现的工业设备的数据采集程序,支持Tcp、串口
- 完结12章AI Agent智能应用从0到1定制开发
- 15白落梅:你是锦瑟我为流年:三毛的万水千山-3491776.mobi
- Federated Learning-Aided Prognostics in the Shipping 4.0: Princi
- OFDM 的鲁棒频率和定时同步文献部分阅读笔记
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功