查看64位多核 MIPS 异常和中断内核代码分析 (1)的源代码
←
64位多核 MIPS 异常和中断内核代码分析 (1)
跳转到:
导航
,
搜索
因为以下原因,你没有权限编辑本页:
您刚才请求的操作只有这个用户组中的用户才能使用:
用户
您可以查看并复制此页面的源代码:
===== Cavium Octeon handle_tlbl 分析 ===== handle_tlbl (位于代码段,不受向量空间限制。从其它例外入口进入): <source lang=c> c: 403a4000 dmfc0 k0,c0_badvaddr 10: 001ada3e dsrl32 k1,k0,0x8 # 失败地址右移 40 位 14: 17600032 bnez k1,e0 <0xe0> # 40 位外不为 0 则跳转。不管CPU 具体实现了多少位的虚拟地址,对内核来讲 40 位外不为 0 都是异常地址,需要小心处理 18: 403b2000 dmfc0 k1,c0_context 1c: 7c1bb007 dins k1,zero,0x0,0x17 20: 377b0540 ori k1,k1,0x540 24: 003bdafa dror k1,k1,0xb # 以上四条指令是为:k1 = 0xA800 0000 0000 0000 + PGD_Phy,即使用一个固定映射的虚址访问 PGD 28: 001ad6fa dsrl k0,k0,0x1b # k0 里放的是 c0_badvaddr 2c: 335a1ff8 andi k0,k0,0x1ff8 # PGD offset 30: 037ad82d daddu k1,k1,k0 # PMD base addr 34: 403a4000 dmfc0 k0,c0_badvaddr 38: df7b0000 ld k1,0(k1) 3c: 001ad4ba dsrl k0,k0,0x12 40: 335a0ff8 andi k0,k0,0xff8 # PMD offset 44: 037ad82d daddu k1,k1,k0 # get PT base addr 48: 403a4000 dmfc0 k0,c0_badvaddr 4c: df7b0000 ld k1,0(k1) 50: 001ad27a dsrl k0,k0,0x9 54: 335a0ff8 andi k0,k0,0xff8 # PT offset 58: 037ad82d daddu k1,k1,k0 # index PT 5c: d37a0000 lld k0,0(k1) # get PTE 60: 42000008 tlbp # 查找失效地址 VA1 对应之 TLB 项,有则将 index 写入 cp0_index,无则将 cp0_index[31] = 1;注意所有 TLB 相关的异常 (Refill, Invalid, Modified) 出现时,CPU 都会把失效地址的高位置入 EntryHi[VPN2] 64: 335a0001 andi k0,k0,0x1 68: 13400020 beqz k0,ec <0xec> # 判断 PTE 的最低位 _PAGE_PRESENT,为 0 表示该页未分配或未在内存,则跳转到 do_page_fault() 处理。此应是 EXL=1 TLB Miss 的在此的主要路径,进入这里的 TLB Miss,多数情形是页面尚未分配,在 TLB Miss 的处理中,索引 PT 失败。经此一路,在 do_page_fault() 中,系统会为其分配页面,填充页表项,往下就不会是页面尚未分配的情形 注意,tlbp 失败只能是失效地址对应页表没有分配或不在内存(交换出去);往下 tlbp 不可能是其失败的情形,如果失效地址有页表项(有效无效皆可),其也不会在 TLB Miss 中再次 TLB Miss 另外 tlbp 失败会将 cp0_index[31] = 1,这个值远远大于现代 MIPS 实现的 TLB 项数目,随后来一条 tlbr 的话,其结果未定义! 6c: d37a0000 lld k0,0(k1) # 该页已分配,get PTE again 70: 335a0080 andi k0,k0,0x80 74: 13400008 beqz k0,98 <0x98> # 判断 PTE 的 _PAGE_VALID 位,为 0 表示该页无效,跳转。失效地址对应的页表项无效,其就不是 EXL=1 TLB Miss 引起的了,应为 TLB Invalid 异常 78: 00000000 nop # 页表项有效 7c: 42000001 tlbr # 读 TLB,cp0_Index 对应 TLB 项存入 EntryHi, EntryLo0/1, PageMask 80: 337a0008 andi k0,k1,0x8 # k1 为页表项指针,此为判断奇偶页操作 84: 13400002 beqz k0,90 <0x90> # 奇数项则跳转 88: 403a1000 dmfc0 k0,c0_entrylo0 # 延迟槽,总是被执行。取奇数页在 TLB 中的值 8c: 403a1800 dmfc0 k0,c0_entrylo1 # 偶数项 90: 335a0002 andi k0,k0,0x2 # TLB 项之 V 位 94: 17400015 bnez k0,ec <0xec> # 不为 0(有效)则跳转到 do_page_fault() 处理。这是一个奇怪的现象,能找到失效地址对应的TLB项(非 EXL=1 TLB Refill),页表项目有效(非空 PTE),且对应的 TLB 项亦有效(非 TLB Invalid),应由 do_page_fault() 进一步甄别 # 失效地址对应之页表项无效 (V=0);或者对应页表项有效,却 TLB 项无效 (V=0) 98: d37a0000 lld k0,0(k1) # 再取 PTE 9c: 375a0084 ori k0,k0,0x84 # 置 _PAGE_VALID 和 _PAGE_WRITE a0: f37a0000 scd k0,0(k1) # 更新页表项 a4: 1340ffed beqz k0,5c <0x5c> # k0=0 则事务操作失败,重做 a8: 00000000 nop ac: 377b0008 ori k1,k1,0x8 b0: 3b7b0008 xori k1,k1,0x8 # 重置页表项指针,使其重新指向失效地址对应之奇数项 b4: df7a0000 ld k0,0(k1) # 以下操作取失效地址的页表项,填充 TLB,分析同 TLB Refill b8: df7b0008 ld k1,8(k1) bc: 001ad13a dsrl k0,k0,0x4 c0: 001bd93a dsrl k1,k1,0x4 c4: 003ad0ba dror k0,k0,0x2 c8: 40ba1000 dmtc0 k0,c0_entrylo0 cc: 003bd8ba dror k1,k1,0x2 d0: 40bb1800 dmtc0 k1,c0_entrylo1 d4: 42000002 tlbwi # 写入 Index 指定的 TLB 入口中 d8: dc1a8078 ld k0,-32648(zero) dc: 42000018 eret # 40位外有货,地址异常 ,需要小心对待 e0: 3c1b817c lui k1,0x817c e4: 1000ffd0 b 28 <0x28> # k1 = 0xFFFF FFFF 817B E000, it's swapper_pg_dir e8: 277be000 addiu k1,k1,-8192 ec: 08441380 j 1104e00 <0x1104e00> # jump to tlb_do_page_fault_0, call do_page_fault(not write) f0: 00000000 nop ... </source> <br><br>
返回到
64位多核 MIPS 异常和中断内核代码分析 (1)
。
个人工具
登录
名字空间
页面
讨论
变换
查看
阅读
查看源代码
查看历史
操作
搜索
导航
首页
社区专页
新闻动态
最近更改
随机页面
帮助
工具箱
链入页面
相关更改
特殊页面