Linux API/linux

Unhandled fault: external abort on non-linefetch

구차니 2021. 5. 25. 15:00

mmap()으로 특정 메모리 영역을 접근하는데

이상한 순서로 에러 메시지가 뒤죽박죽 되어 나와서 겨우겨우 복구(?) 해봤더니 더 멘붕오는 듯한 용어만 잔뜩 -_-

Unhandled fault: external abort on non-linefetch (0x1818) at 0x70000000
pgd = cdbbc000
Error: [70000000] *pgd=0dbc3831, *pte=70000743, *ppte=70000c33

 

ppte는 약어를 못 찾음 (느낌은 pte에 대한 pointer 아닐까 싶긴 하지만..)

PGD : Page Global Directory
PTE : Page Table Entries

[링크 : https://www.kernel.org/doc/gorman/html/understand/understand006.html]

 

(0x1818) 음.. 딱 적절한 나의 마음을 나타내는 값은 ifsr 레지스터 라는데

The values in parenthesis are the ifsr (instruction fault status) register

[링크 : https://stackoverflow.com/questions/15889483/what-do-these-kernel-panic-errors-mean]

 

레지스터값의 의미를 요약하면 다음과 같은데

AXI Slave error로 인해서 abort가 발생,
write access가 abort를 발생
D1 domain?
precise external abort, nontranslation

도대체 무슨 말이야!!!

 




SD
Indicates whether an AXI Decode or Slave error caused an abort. This bit is only valid for external aborts. For all other aborts this bit Should Be Zero:
0 = AXI Decode error caused the abort, reset value
1 = AXI Slave error caused the abort.

RW
Indicates whether a read or write access caused an abort:
0 = read access caused the abort, reset value
1 = write access caused the abort.

Domain
Indicates which one of the 16 domains, D15-D0, is accessed when a data fault occurs. This field takes values 0-15.

Status
Indicates the type of exception generated. To determine the data fault, bits [12] and [10] must be used in conjunction with bits [3:0]. The following encodings are in priority order, 1 is the highest:

0b000001 alignment fault
0b000100 instruction cache maintenance fault
0bx01100 L1 translation, precise external abort
0bx01110 L2 translation, precise external abort
0b011100 L1 translation precise parity error
0b011110 L2 translation precise parity error
0b000101 translation fault, section
0b000111 translation fault, page
0b000011 access flag fault, section
0b000110 access flag fault, page
0b001001 domain fault, section
0b001011 domain fault, page
0b001101 permission fault, section
0b001111 permission fault, page
0bx01000 precise external abort, nontranslation
0bx10110 imprecise external abort
0b011000 imprecise error, parity or ECC
0b000010 debug event.

[링크 : https://developer.arm.com/documentation/.../c5--data-fault-status-register]

 

[링크 : https://github.com/brgl/busybox/blob/master/miscutils/devmem.c]