SegmentFault處理流程
本文將基於壹個簡單的用戶態段錯誤問題,簡單梳理下arm64平臺SegmentFault處理流程。
反匯編如下
dmesg打印的kenrel log如下
el0_sync如下
這裏簡單解釋下
高6位是exception class, 用於標識當前異常的類型
根據前面的測試用例,esr值為0x92000045,則exception class= esr >> 26 = 0x24, 對應ESR_ELx_EC_DABT_LOW
會跳到el0_da繼續處理,el0_da的實現如下
el0_da的操作
源碼位於arch/arm64/mm/fault.c
esr_to_fault_info()函數用於從esr的低6bit取出 錯誤狀態碼DFSC(Data Fault Status Code)
而fault_info[]是壹個struct fault_info結構體數組,對應這64種錯誤狀態碼的處理
dfsc = esr & 0x3f = 0x92000045 & 0x3f = 0x5, 對應fault_info[]中的第5個元素"level 1 translation fault",下壹步會跳到do_translation_fault()處理。
這裏會跳到do_page_fault()
do_page_fault()主要會調用
__do_page_fault()的實現如下
__do_page_fault()這裏, 沒有找到相應的vma, 則會直接返回。
前面的page fault無法處理後, 若是用戶態page fault,最終會走到__do_user_fault()
__do_user_fault()主要做幾件事:
show_regs_print_info()相關