우선 페이지 테이블은 아래와 같다.
|_tablewalk
| A6F9C000[0C06]=8061140E
| A6F9C000[0C06]=8061140E
| A6F9C000[0C06]=8061140E
| A6F9C000[0C06]=8061140E
0x8061140E 이놈을 이진수로 바꾸면 10000000011000010001010000001110이다.
끝자리가 10이구만. 섹션 엔트리이므로 가상 주소는 1메가 단위라는 것을 알 수 있다. 앞에 12비트만 남기고 나머지를 0으로 비트 클리어를 하면,
10000000011000010001010000001110
11111111111100000000000000000000
10000000010000000000000000000000 (결과값) 0x80100000
0x80100000 -- 0x801F0000 요런 구간을 physical주소로 가르키겠네.
다른 명령어로 확인해봐도 아래와 같다.
C:03A0:C0100000--C0100FFF| A:80100000--80100FFF| ns| 00| 00100000| P:readwrite U:noaccess exec | yes| yes| strongly ordered | A6F9C000[0C01]=8011140E
C:03A0:C0101000--C0101FFF| A:80101000--80101FFF| ns| 00| 00100000| P:readwrite U:noaccess exec | yes| yes| strongly ordered | A6F9C000[0C01]=8011140E
C:03A0:C0102000--C0102FFF| A:80102000--80102FFF| ns| 00| 00100000| P:readwrite U:noaccess exec | yes| yes| strongly ordered | A6F9C000[0C01]=8011140E
다른 코어스 테이블에 대해서도 확인해보자.
_______________________logical|_physical_____________________|sec|_d_|_size____|_permissions____________________|_glb|_shr|_pageflags_(remapped)___________|_tablewalk
C:03A0:3FFFE000--3FFFEFFF| | | | | | | | | A6F9C000[03FF]=00000000
C:03A0:3FFFF000--3FFFFFFF| | | | | | | | | A6F9C000[03FF]=00000000
C:03A0:40000000--40000FFF| | | | | | | | | A6F9C000[0400]=9F65B831
0x9F65B831를 이진수로 바꾸면 10011111011001011011100000110001 요렇게 된다.
그런데 마지막 01로 끝나기 때문에 코어스 페이지 테이블에 있는 값을 확인해보자.
코어스 패이지 테이블에서 베이스 주소는 [31:10]이기 때문에 아래와 같이 비트 마스크를 씌워보자.
10011111011001011011100000110001
11111111111111111111110000000000
10011111011001011011100000000000 (결과 값)
10011111011001011011100000000000 이란 이진수를 16진수로 바꾸면, 0x9F65B800이다.
Level 2 Page Table 0x9F65B800 주소로 한번 가보자.
9F65B800[0000]=00000000
...
9F65B800[001A]=00000000
9F65B800[001B]=00000000
9F65B800[001C]=00000000
9F65B800[001D]=AF8BAE7E
9F65B800[001E]=00000000
9F65B800[001F]=00000000
9F65B800[0020]=00000000
9F65B800[0021]=AFD2CE7E
9F65B800[0022]=AFD2DE7E
9F65B800[0023]=AFD2EE7E
9F65B800[0024]=AFD2FE7E
9F65B800[0025]=AFD34E7E
요 0xAF8BAE7E 값을 이진수로 바꾸어 보면, 10101111100010111010111001111110 요렇게 된다.
끝이 10이구만. tiny page 1K까지이구, physical address는 하위 12번 비트까지를 clear하면 확인이 된다.
10101111100010111010111001111110
11111111111111111111000000000000
10101111100010111010000000000000 (결과) 0xAF8BA000
즉 아래와 같은 구간으로 물리 주소가 처리가 된다.
AF8BA000--AF8BAFFF
이에 매핑되는 가상 주소의 범위는 아래와 같다.
4001D000--4001DFFF
'Core BSP 분석 > 리눅스 커널 핵심 분석' 카테고리의 다른 글
MMU - 페이지 테이블 덤프 (0) | 2023.05.05 |
---|---|
Crash 명령어 스택 심볼 보기 (0) | 2023.05.05 |
MMU - 메모리 설정 (0) | 2023.05.05 |
커널패닉 - ext4 파일 시스템 (0) | 2023.05.05 |
copy_mm()함수 (0) | 2023.05.05 |