mips下的异常、中断

论坛 期权论坛     
选择匿名的用户   2021-5-30 01:23   259   0
<h2><strong>什么是异常</strong></h2>
<p>在mips中,中断、陷阱、系统调用和任何可以中断程序正常执行流的情况都称异常</p>
<p>1. 外部事件  ——中断</p>
<p>2. 内存翻译异常</p>
<p>3. 其他不太常见的内核修改的程序条件</p>
<p>4. 程序或硬件探测到的错误</p>
<p>5. 数据完整性错误</p>
<p>6. 系统调用和陷入</p>
<h2><strong>精确异常</strong></h2>
<p>在运行流程中没有任何多余效应的异常。即当异常发生时,在受害指令之前的指令被完全执行,而受害指令及后面的指令还没开始执行(注:说受害指令及后面的指令还没做任何事情是不对的,实际上受害指令是处于其指令周期的第三阶段刚完成,即ALU阶段刚完成)。精确异常有有助于保证软件设计上不受硬件实现的影响。</p>
<p><strong>CP0中的EPC寄存器</strong>用于指向异常发生时指令跳转前的执行位置,一般是受害指令地址。当异常时,是返回这个地址继续执行。但如果受害指令在分支延迟槽中,则会硬件自动处理使EPC往回指一条指令,即分支指令。在重新执行分支指令时,分支延迟槽中的指令会被再执行一次。</p>
<p>精确异常的实现对流水线的流畅性是有一定的影响的,如果异常太多,系统执行效率就会受到影响。</p>
<p> </p>
<h2><strong>异常</strong></h2>
<p>常规异常一般为软件的异常,而中断一般为硬件异常,中断可以是芯片内部,也可以是芯片外部触发产生。</p>
<p>异常发生时,跳转前最后被执行的指令是其MEM阶段刚好被执行完的那条指令。受害指令是其ALU阶段刚好执行完的那条指令。</p>
<p> 用户特权地址的TLB重填</p>
<p>TLB硬件上只存在存储一定数目的地址转换条目,在运行一个虚拟内存的OS的系统中,如果如果程序得以充分的运行,应用程序就会很容易碰到一个虚拟地址在TLB中没有的情况,一个TLB不匹配的事件就发生了。异常产生后硬件帮助异常处理程序在大约13个时钟周期内完成TLB重填。</p>
<p> 64位地址空间的TLB重填</p>
<p>为了充分利用64位CPU的地址空间,地址转换用了一套略为不同的寄存器布局和不同的TLB重填例程,叫做XTLB重填。</p>
<p> 非缓存的异常入口点</p>
<p>出于对异常处理性能的考虑,访问中断入口地址时都要经过缓存,但是在系统启动期间,上电或重启时缓存未经初始化不能使用。因此,在早期启动期间访问不需要经过缓存,CP0寄存器中有个模式位SR(BEV)将异常处理入口定位于非缓存的、启动安全的kseg1内存区域。</p>
<p> 奇偶/ECC校验错误</p>
<p>Mips32cpu可以检查到数据错误,这是不管SR(BEV)的状态,缓存错误的异常入口都在非缓存区域kseg1内存区域。</p>
<p> 重启</p>
<p>MIPS系统把重启看作一个不可回归的异常来处理。<br>           冷启动:CPU硬件完全被重新配置,软件重新加载;<br>            热启动:软件完全重新初始化;</p>
<p> 中断</p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<h2><strong>异常向量</strong></h2>
<p>所有的异常入口点都位于MIPS内存映射中不需要地址转换的区域——非缓存的kseg1段和缓存的kseg0段。当SR(BEV)置位时,非缓存的异常入口时固定的,但是当SR(BEV)清零时,EBase寄存器可以通过编程一起移动所有的异常入口到其他地址。</p>
<p>高优先级异常有:冷启动、热重启、非屏蔽中断,</p>
<p>TLB 重填(32 位模式),</p>
<p>xTLB 重填(64 位模式),cache 错误,其他异常。</p>
<p> </p>
<p>高优先级异常入口地址有以下五个:</p>
<p> </p>
<p>优先级异常入口</p>
<table><tbody><tr><td> <p>异常类型 </p> </td><td> <p>正常运行(BEV 为 0)</p> </td><td> <p> 启动(BEV 为 1)</p> </td></tr><tr><td> <p>冷启动、热重启、非屏蔽中断</p> </td><td> <p>0x BFC0 0000</p> </td><td> <p>0x BFC0 0000</p> <p> </p> </td></tr><tr><td> <p>TLB 重填</p> </td><td> <p>0x 8000 0000</p> </td><td> <p>0x BFC0 0200</p> </td></tr><tr><td> <p>xTLB 重填 </p> </td><td> <p>0x 8000 0080</p> </td><td> <p>0x BFC0 0280</p> </td></tr><tr><td> <p>cache 错误</p> </td><td> <p>0x A000 0100</p> </td><td> <p>0x BFC0 0300</p> </td></tr><tr><td> <p> 其他</p> </td><td> <p>0x 8000 0180 </p> </td><td> <p>0x BFC0 0380</p> </td></tr></tbody></table>
<p> </p>
<p>状态寄存器(SR)</p>
<p>BEV&#61;1 :非缓存异常处理入口固定定位于非缓存的、启动安全的kseg1内存区域</p>
<p>BEV&#61;0 :异常处理入口不固定,通过EBase寄存器可以编程移动,系统正常运行时为0</p>
<p> </p>
<p>MIPS 下 TLB、Cache 都要 OS 参与管理,在其启动时 OS 尚未接管系统,这个时候不采用 TLB、Cache 机制是很重要的。</p>
<p> </p>
<p><span style="color:#000000">冷启动、</span><span style="col
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP