"1: " TUSER(ldr) " %1,[%2],#0\n" \
"2:\n" \
" .pushsection .fixup,\"ax\"\n" \
" .align 2\n" \
"3: mov %0, %3\n" \
" mov %1, #0\n" \
" b 2b\n" \
" .popsection\n" \
" .pushsection __ex_table,\"a\"\n" \
" .align 3\n" \
" .long 1b, 3b\n" \
" .popsection" \
1. 向量跳轉(zhuǎn)表位于 arch/arm/kernel/entry_armv.S中的 __vectors_start與 __vectors_end間,page fault對(duì)應(yīng)的是 vector_dabt
2. early_trap_init() [arch/arm/kernel/traps.c]負(fù)責(zé)將向量跳轉(zhuǎn)表搬運(yùn)到0xFFFF0000
3. 根據(jù) CPU所處模式,page fault跳轉(zhuǎn)到對(duì)應(yīng)的 __dabt_usr, __dabt_svc, 或者 __dabt_invalid [arch/arm/kernel/entry_armv.S]
4. __dabt_usr, __dabt_svc均調(diào)用 dabt_helper [arch/arm/kernel/entry_armv.S], 注意這里 r2保存有 pt_regs
5. dabt_helper會(huì)跳轉(zhuǎn)到 CPU_DABORT_HANDLER,這個(gè)宏在 arch/arm/include/asm中根據(jù) CPU型號(hào)定義, 如 v7_early_abort() [arch/arm/mm/abort_ev7.S]
6. v7_early_abort()讀取 cpsr寄存器, 將 FAR (Fault Address Register), FSR (Fault Status Register)保存到 r0, r1; 然后調(diào)用 do_DataAbort() [arch/arm/mm/fault.c]
7. 現(xiàn)在進(jìn)入 c代碼調(diào)用鏈
do_DataAbort(): 根據(jù) fsr查詢對(duì)應(yīng)的異常處理函數(shù)表 fsr_info[]
inf->fn(): 調(diào)用該處理函數(shù)
do_page_fault()
__do_page_fault()
handle_mm_fault()
從 handle_mm_fault() [mm/memory.c]開(kāi)始脫離體系相關(guān)代碼
handle_mm_fault()
handle_pte_fault()
do_linear_fault()
do_anonymous_page()
do_nonlinear_fault()
do_swap_page()
歡迎光臨 Chinaunix (http://www.72891.cn/) | Powered by Discuz! X3.2 |