- 論壇徽章:
- 0
|
本帖最后由 alexhak2004 于 2014-08-25 15:53 編輯
感謝回復,又仔細debug了一下代碼,發(fā)現(xiàn)問題,但是還是覺得奇怪。
現(xiàn)在初步的結論是由于data abort后返回的地址不對,引起data abort的指令沒有能夠正常執(zhí)行,
所以導致返回值判斷出錯。
繼續(xù)上一帖子,說明一下我看到的執(zhí)行流程。
1.在地址 0xc0109078處(屬于函數(shù)__clear_user_std,函數(shù)的返回地址在0xc00d2ac8),存在指令“strbt r2, [r0], #1”,
此時SP_SVC=0xc482be58,
2.在執(zhí)行這條指令后,產生data_dataabort異常,切換到dabt模式,此時SP_DABT=0xc0ed288c,而引起異常的指令地址
0xc0109078被存到了dataabort模式下的棧中0xc0ed2890=0xc0109078
3.程序跳轉到vector_dabt,最后跳轉到__dabt_svc,由于最后是通過"movs pc, lr"進行跳轉的,所以進行了狀態(tài)切換,又
切換到了SVC模式,此時的SP_SVC為0xC482BE58。在__dabt_svc中,首先保存了r1~r12,接下來,由于r0剛好指向了
dabt模式下的棧,所以"LDM r0, {r3-r5}",使得r3保存了__clear_user_std中的線性地址,r4保存了出錯指令地址,r5保存
了之前SVC的處理器CPSR(=0x60000013)。此時lr=0xc00d2AC8,剛好是__clear_user_std的返回地址。
4.調用v6_early_abort->do_DataAbort進行處理,沒有錯誤
5.函數(shù)返回后,最后通過ldmib sp, {r1-r15}跳到 “pop {p0,pc}”
問題是,此時SP為0xc482be58,還是屬于SVC模式的棧,并沒有回到DABT模式的棧,所以,PC回到了0xc00d2ac8,而不是
出錯指令地址0xc0109078,并沒有重新執(zhí)行,所以這會引起后面的判斷失敗,F(xiàn)在不知道應該如何處理。。。
回復 2# humjb_1983
|
|