查看64位多核 MIPS 异常和中断结构的源代码
←
64位多核 MIPS 异常和中断结构
跳转到:
导航
,
搜索
因为以下原因,你没有权限编辑本页:
您刚才请求的操作只有这个用户组中的用户才能使用:
用户
您可以查看并复制此页面的源代码:
== 高优先级例外类型和入口 == 所谓高优先级例外,就是需要 MIPS 尽可能快地响应并执行例外处理函数的例外。 MIPS 高优先级例外有 4 类,分别为: <source lang=bash> Vec0: 冷启动、热重启、非屏蔽中断 (Reset) Vec1: TLB Refill Vec2: Cache Error Vec3: 其它例外 </source> 他们在 MIPS 上,有固定的入口地址,一旦例外发生,即跳转到这个地址,迅速处理。 Reset 类例外容易理解,一旦这类发生,将伴随系统启动,需要即刻响应。固定入口地址处,实际上就是 bootloader 的第一条指令,也是存放 bootloader 的 flash 之所在。 由于 MIPS 采用的是软件 TLB,即需要 OS 读取内存中的页表来填充 TLB。这个对系统的性能影响很大,因此也需要第一时间处理。 Cache 发生错误时,往往内部数据就不再可信,因此需要第一时间处理。 其他例外包括中断,系统调用,地址错误,非法指令等等例外都是 <br><br> === 正常运行模式下例外入口 === ==== MIPS64 R1 情形 ==== MIPS 设计时固定了四大类例外的入口,正常运行情形下(非初始化情形,BEV=0): <source lang=bash> TLB Refill 时,PC 的值为 0xFFFF FFFF 8000 0000,对应物理地址 0x00 处,访问的数据会进入 Cache (32 bit address space) xTLB Refill 时,PC 的值为 0xFFFF FFFF 8000 0080,对应物理地址 0x80 处,访问的数据会进入 Cache (64 bit address space) Cache Error 时,PC 的值为 0xFFFF FFFF a000 0100,对应物理地址 0x100 处,访问的数据不会进入 Cache 其它例外时,PC 的值为 0xFFFF FFFF 8000 0180,对应物理地址 0x180 处,访问的数据会进入 Cache </source> MIPS64 通常是用 xTLB Refill 例外入口,为 0xFFFF FFFF 8000 0080,其处理程序的体积最大为 0x80 字节(MIPS32 为 0x8000 0000,容量为 0x80 字节),loongson 2E 比较特殊,他的入口只用了 32 位地址空间的,始终为 0xFFFF FFFF 8000 0000 Cache Error 例外,因为 Cache 已不能相信,因此只能使用不走 Cache 的虚拟地址 0xFFFF FFFF a000 0100 置入 PC 中。其处理程序的体积最大为 0x80 字节 其它例外,入口在 0xFFFF FFFF 8000 0180,MIPS 的其他例外都进入此入口,由软件根据寄存器中的通用例外类型,进入到对应的处理函数。其处理程序的体积一般不超过 0x80 字节 <br><br> ==== Cavium Octeon (MIPS64 R2) 情形 ==== 对于像 Cavium Octeon 这类多核处理器,他有 16 个 CPU 核,在一些特殊应用环境下(比如其中 1 个核跑一个 Linux 作为控制面,其他 15 个核,每个核只跑一个应用作为数据面),不同的核就需要不同的例外入口基地址。为了这个原因,MIPS 在 MIPS64 R2 里引入了 CP0_EBase 寄存器,用于存放例外入口的基地址。 MIPS64 R2 规定,CP0_EBase 只在 CP0_STATUS[BEV]=0 时,即在正常运行时有效,BEV=1 的上电启动状态,例外的基地址还是原来的地址。 CP0_EBase 的默认值为 0x8000 0000,32bit 的值在 64bit 下,高位自动扩展: 0xFFFF FFFF 8000 0000,这样就能和 MIPS64 R1 兼容,即使用户无视这个寄存器,原系统也能在 R2 上正常运行。 有了 CP0_EBase 后,不同的核就可以有自己的例外入口,这样就可以各自跑自己的系统,甚至只跑一个应用。 因此在 MIPS64 R2 下,BEV = 0 时只规定四个固定例外入口的偏移: <source lang=bash> TLB Refill 时,偏移为 0x00 (32 bit address space) xTLB Refill 时,偏移为 0x80 (64 bit address space) Cache Error 时,偏移为 0x100 其它例外时,偏移为 0x180 </source> 实际的入口为 0xFFFF FFFF 0000 0000 + (cp0_ebase & 0x3FFF F000) Cavium Octeon 上 Bootloader 将异常的基地址设为 0xFFFF FFFF 8000 1000 <br><br> === 上电初始化时例外入口 === 下面这一段与 Linux Kernel 关系不大,但与 Bootloader 关系密切,请酌情选读: 对于 MIPS 刚上电的初始化阶段(CP0_STATUS[BEV]=1),因为 Cache 状态未知,不能使用,所以所有的例外入口虚地址都得使用数据不进入 Cache 的地址段。因此MIPS 规定,BEV=1 时,例外向量入口为: <source lang=bash> 冷启动、热重启、非屏蔽中断,入口为 0xFFFF FFFF BFC0 0000 TLB Refill,入口为 0xFFFF FFFF BFC0 0200 Cache Error,入口为 0xFFFF FFFF BFC0 0300 其它例外,入口为 0xFFFF FFFF BFC0 0380 </source> 特别地,冷启动、热重启、非屏蔽中断例外时,PC 的值都为 0xFFFF FFFF BFC0 0000 (MIPS32 为 0xBFC0 0000),即当发生这类例外时,处理器总是跳转到这个地址继续执行,其固定映射到的物理地址为 0x1FC0 0000 处。这个地址常常关联到放置 Bootloader 的内部flash,每次一 reset,就会触发这个例外,跳转到 0x1FC0 0000,去取 Bootloader 的第一条指令。 可以看到在初始化阶段 (CP0_STATUS[BEV]=1,bootloader 最初执行时),4 类例外处理程序的最大允许长度分别为:0x200, 0x100, 0x80, 通常不超过 0x80 字节 注意 BEV=1 的时间很短,一旦 bootloader 完成初始化,其就将 BEV 置为 0,进入系统正常运行模式 <br><br>
返回到
64位多核 MIPS 异常和中断结构
。
个人工具
登录
名字空间
页面
讨论
变换
查看
阅读
查看源代码
查看历史
操作
搜索
导航
首页
社区专页
新闻动态
最近更改
随机页面
帮助
工具箱
链入页面
相关更改
特殊页面