当前位置 - 股票行情交易網 - 股票交易 - SegmentFault處理流程

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()相關