|
|
|
|
| 问一个MIPS结构的LINUX的TLB异常处理程序问题,急急急!!! |
|
|
|
[Original]
[Print]
[Top]
|
bnn兄,你好,久仰大名,想问你一些问题:
我看了MIPS的TLB异常处理程序,
看懂了一些,但还有一些没有看懂,想请教你一些问题:
linux初始化时,把页目录表项都初始化成invalid_pte_table,
当访问一个32位的虚拟地址时,出现TLB refill 异常,
进入异常处理程序except_vec0_r4000处理,把invalid_pte_table
加进TLB表里,因为invalid_pte_table的值是0,所以再次访问这个
虚拟地址时,会产生tlbinvalid异常,进入异常处理程序handle_tlbl
处理,handle_tlbl处理程序如下:
NESTED(handle_tlbl, PT_SIZE, sp)
.set noat
invalid_tlbl:
#ifdef TLB_OPTIMIZE
/* Test present bit in entry. */
LOAD_PTE(k0, k1) //根据出现异常的虚拟地址得到页表项的内容
R5K_HAZARD
tlbp
PTE_PRESENT(k0, k1, nopage_tlbl)//判断该页表项是否为空,也就是说虚拟地址和物理地址对应关系是否建立,
//如果为空,就是说虚拟地址和物理地址对应关系没有建立,就跳到nopage_tlbl,
//调用do_page_fault()分配物理内存并建立对应关系
PTE_MAKEVALID_HIGH(k0, k1)
PTE_MAKEVALID(k0, k1)//如果该页表项不为空,就修改页表项的一些标记位
PTE_RELOAD(k1, k0)//把页表项的内容加入TLB表
nop
b 1f
tlbwi
1:
nop
.set mips3
eret
.set mips0
#endif
nopage_tlbl:
DO_FAULT(0)
END(handle_tlbl)
我想问的问题是:
1。既然是tlbinvalid异常,执行PTE_PRESENT(k0, k1, nopage_tlbl)判断该页表项是否为空,肯定为空,
所以会跳到nopage_tlbl,执行DO_FAULT(0),进而调用do_page_fault()分配物理内存并建立对应关系,
那什么时候执行下面的两句PTE_MAKEVALID(k0, k1),PTE_RELOAD(k1, k0)啊??
2。是不是出现TLB refill异常,就一定执行异常处理程序except_vec0_r4000,
出现TLB invalid异常,就执行异常处理程序NESTED(handle_tlbl, PT_SIZE, sp)呢?而且只有
TLB invalid异常,才会执行异常处理程序NESTED(handle_tlbl, PT_SIZE, sp)呢?
我记得MIPS可以出现嵌套异常,是不是出现嵌套的TLB refill异常时,也执行NESTED(handle_tlbl, PT_SIZE, sp)
异常处理程序呢??
既然页目录表项里的内容是KSEG0的虚拟地址,那应该不会出现嵌套异常啊??什么时候出现嵌套异常的呢??
谢谢!!!!
|
|
|
[Original]
[Print]
[Top]
|
|
|