본문 바로가기

Core BSP 분석/리눅스 커널 핵심 분석

MMU 페이지 테이블 확인

우선 페이지 테이블은 아래와 같다.
|_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