查看64位多核 MIPS 异常和中断结构的源代码
←
64位多核 MIPS 异常和中断结构
跳转到:
导航
,
搜索
因为以下原因,你没有权限编辑本页:
您刚才请求的操作只有这个用户组中的用户才能使用:
用户
您可以查看并复制此页面的源代码:
== 中断的特殊结构 == MIPS CPU 收到硬件中断请求后,会跳到其他例外入口,此时 CP0_STATUS 的 ExcCode 的值为 0,此只能描述“有了中断”,尚不能确定中断来自哪个中断控制器亦或就是 CPU 内部的硬件中断,比如 Timer 中断或者 Performace Counter 溢出中断 因此 MIPS 把 CP0_CAUSE 的 15:8 位留给了 8 个中断,可以描述 8 个中断的到来 (Pending),对应位为 1,则表示相应中断到来: <source lang=bash> Bit | Name | Meaning 15 | IP7 | Hardware interrupt 5 14 | IP6 | Hardware interrupt 4 13 | IP5 | Hardware interrupt 3 12 | IP4 | Hardware interrupt 2 11 | IP3 | Hardware interrupt 1 10 | IP2 | Hardware interrupt 0 09 | IP1 | Request software interrupt 1 08 | IP0 | Request software interrupt 0 </source> 相对应的,CP0_STATUS[15:8] 为 IM7 ~ IM0,是为 IP7 ~ IP0 的中断 Mask 位 IP1 ~ IP0 对应 CP0_CAUSE[9:8],留给软中断 IP2 ~ IP7 则给硬件中断 在 MIPS64 R1 里,IP7 留给 Timer 或者 Performace Counter,至于是哪个,实现时自己取舍。Loongson 2E 实现时,把 IP7 给了 Timer;Performace Counter 用 IP6。 而在 MIPS64 R2 里,IP7 可以同时给 Timer 和 Performace Counter。当 IP7 被置位时,OS 可以检查 CP0_CAUSE[30] 和 CP0_CAUSE[26],前者为 1,表示 TI (Timer Interrupt);位 26 为 1,则表示是 PCI (Performace Counter Interrupt) 通常来说, IP7 ~ IP2 会对应 6 个电气信号引脚。在 2E 上对应 Int#[5..0],当然 Int#[1:0] 保留未用 各外围设备都可以直接把中断请求线接到 IP2 ~ IP6 上,但现代系统上外围设备五花八门,种类繁多,几根线根本不够用,因此一般都是外围设备的中断先汇总到中断控制器,中断控制器再单独向 CPU 请求中断。 比如 Loongson 2E 上,一个类 8259A 的中断控制器(负责键盘、声卡、IDE 等设备的中断),链接到 IP5 北桥内的中断控制器(负责 PCI 上的中断,如网卡、USB 等)则链接到 IP2 Cavium Octeon 上 CIU0(负责 UART0/1, MailBox0/1, USB0, MII0, WorkQueue 等)链接到 IP2;CIU1(负责 UART2, USB1, MII1, NAND 等)连接到 IP3。16 个核,CIU0 都连接到每个核的 IP2,CIU1 也都连接到每个核的 IP3 不管 IP2, IP3 直接挂设备还是挂中断控制器,OS 都可以区分到底是哪个具体设备的中断,对中断控制器,只要访问一下中断控制器的内部状态寄存器,就能确定是哪个具体设备的中断 也可以多个设备/中断控制器接到同一个 IP2,如果同时发生,这时候 OS 处理时就要负责判断优先级了,哪个先执行哪个后执行。当然有人要说了,这样不就把中断控制器省略了吗?理论上是可以的,但当设备繁多到上百后,原来控制器硬件做的事都由软件来做对性能是一个不小的影响,而且可扩展性也是一个问题。微型系统上用用可以,大一点的系统就不合适了。 在 2E 上,一个用户敲击键盘的行为,中断流程是这样的: * 用户击键后,键盘控制器8042产生中断,这个中断链接到 (route) I8259A,并由 8259A 在CPU的中断引脚上发起中断请求 * CPU 自动设置 CAUSE 的 ExcCode 位为0,IP5 为1,并跳转到其他例外入口 0xFFFFFFFF 80000180 * 位于其他例外入口处的简单异常处理程序,根据 ExcCode 的值索引例外处理表(exception_handlers),获取到0号例外的处理程序是 handle_int,并跳转过去 * handle_int 根据 CAUSE 之 IP 位的值跳转到中断控制器 8259A 相关的中断处理函数 i8259_irqdispatch() * i8259_irqdispatch() 读取 8259A 之 In-Service Register (ISR, 注意与x86的差异,x86是由8259A主动将中断号送上数据总线的),通过简单的计算得到中断号,进而调用 do_IRQ 进入相应的键盘中断处理函数 类似 Cavium Octeon 的多核处理器,往往都在 CPU 内部实现一个中央中断控制器 (CIU),来负责所有中断的路由,哪一个设备中断路由到哪一个核,都是由中央中断控制器控制,并且是可配置的,一般 OS 也是能更改的,即 OS 可以根据当前核的中断负载情形,对中断路由进行动态调整。Cavium Octeon 的详细情形,后文讨论。 <br><br>
返回到
64位多核 MIPS 异常和中断结构
。
个人工具
登录
名字空间
页面
讨论
变换
查看
阅读
查看源代码
查看历史
操作
搜索
导航
首页
社区专页
新闻动态
最近更改
随机页面
帮助
工具箱
链入页面
相关更改
特殊页面