1. 0xc13342c0 가상 주소가 물리주소로 변환되는 과정 확인
crash> p schedule
schedule = $1 =
{int (void)} 0xc13342c0 <schedule>
물리주소는 0x813342c0임
crash> vtop 0xc13342c0
VIRTUAL PHYSICAL
c13342c0 813342c0
PAGE DIRECTORY: c0004000
PGD: c000704c => 8131940e
PMD: c000704c => 8131940e
PAGE: 81300000 (1MB)
PAGE PHYSICAL MAPPING INDEX CNT FLAGS
c4926680 81334000 0 0 1 400 reserved
0xc13342c0 가상 주소에서 L1 Page Table Index는 c13임(0xc13342c0)
crash> p schedule
schedule = $1 =
{int (void)} 0xc13342c0 <schedule>
TTBA(Translation Table Base Address)는 0x80004000임
0x80004000-- 0x80006FB0까지 0으로 채워짐
0xc13342c0 가상 주소에 대한 PageTable Dump를 보면 아래와 같음
L1 Page Table은 0x8000704C = 0x80004000 + (0xC13 * 4 = 0x304C)
0x8131940E(*0x8000704C) = 10000001001100011001010000001110
10000001001100011001010000001110 값에서 마지막 2비트가 10이므로 Section Entry임
앞의 12비트가 Base Address임 10000001001100011001010000001110, 0x813 = 100000010011
0x813(Physical Base Address) 에서 20-Bit Left Shift + 가상 주소의 Offset 값(0xc13342c0) = 0x813342c0
공식: 0x813(PA 변환된 정보) + 342c0 오프셋 = 0x813342c0
Page Descriptor 주소는 c4926680
crash> vtop 0xc13342c0
VIRTUAL PHYSICAL
c13342c0 813342c0
PAGE DIRECTORY: c0004000
PGD: c000704c => 8131940e
PMD: c000704c => 8131940e
PAGE: 81300000 (1MB)
PAGE PHYSICAL MAPPING INDEX CNT FLAGS
c4926680 81334000 0 0 1 400 reserved
0xc13342c0 주소에 해당하는 페이지 프레임 번호는 0x1334임
(struct page *) &mem_map[0x0] = 0xC4900000
(struct page *) (struct page*)0xC4926680
0xC4926680 - 0xC4900000 = 0x26680 / 0x20 = 0x1334
2. 0xBFED1000 가상 주소가 물리주소로 변환되는 과정 확인
물리주소는 0xc893a000임
crash> vtop BFED1000
VIRTUAL PHYSICAL
bfed1000 c893a000
PAGE DIRECTORY: c0004000
PGD: c0006ff8 => a70e6811
PMD: c0006ff8 => a70e6811
PTE: a70e6344 => c893a65f
PAGE: c893a000
PTE PHYSICAL FLAGS
c893a65f c893a000 (PRESENT|DIRTY|YOUNG|WRITE)
PAGE PHYSICAL MAPPING INDEX CNT FLAGS
c5212740 c893a000 e1367001 97 1 40080068 uptodate,lru,active,swapbacked
아래 과정으로 L1 Page Table Entry에 접근
L1 Page Table entry: 0xBFE(0xBFED1000)
Page Table Address 0x80006FF8 = 0x80004000 + 0x2FF8(0xBFE*4)
A70E6811=*0x80006FF8
// 2bit가 01이니까 다음 레벨의 페이지 테이블의 베이스 주소를 가리킴
10100111000011100110100000010001(0xA70E6811)
10100111000011100110100000010001 [31:10] 비트만 살리고 나머지는 0으로 밀어버리면
10100111000011100110100000000000 --> A70E6800 (Next, 2 level 페이지 테이블)
0xA70E6B44 = 0xA70E6800 + 0x344 [where: 4*0xD1(0xBFED1000) ]
<관련 Arm 스펙 문서>
이어서 2 레벨 페이지 변환을 진행하자.
0xA70E6B44 = 0xA70E6800 + 0x344 [where: 4*0xD1(0xBFED1000) ]
PTE인 C893A45F을 2진수로 표기하면 아래와 같다.
1100 1000 1001 0011 1010 0100 0101 1111
bit[1:0]이 11이니 스몰 페이지(Small page)이다.
<스몰 페이지에 대한 Arm 스펙 문서는 아래와 같다.>
결국 아래와 같이 계산하여 물리 주소를 얻음
C893A45F(2 level PTE 값)
BFED1000(가상 주소의 offset)
C893A000 (C893A45F)
다른 주소로 테스트
crash> vtop BFED1111
VIRTUAL PHYSICAL
bfed1111 c893a111
crash> vtop BFED1ddd
VIRTUAL PHYSICAL
bfed1ddd c893addd
T32로 다시 확인
User space 가상 주소에 대한 Page Address
crash> vtop BFED1000
VIRTUAL PHYSICAL
bfed1000 c893a000
PAGE DIRECTORY: c0004000
PGD: c0006ff8 => a70e6811
PMD: c0006ff8 => a70e6811
PTE: a70e6344 => c893a65f
PAGE: c893a000
PTE PHYSICAL FLAGS
c893a65f c893a000 (PRESENT|DIRTY|YOUNG|WRITE)
PAGE PHYSICAL MAPPING INDEX CNT FLAGS
c5212740 c893a000 e1367001 97 1 40080068 uptodate,lru,active,swapbacked
Offset 계산
(struct page_address_map *) &page_address_maps[0x0] = 0xC15F71C0 = page_address_maps[0] -> (
________address|________0________4________8________C_0123456789ABCDEF
NSD:C15F7EB0| C557BBC0 BFECF000 C15F8478 C15F7C98 ..W.....x._..|_.
NSD:C15F7EC0| C570CB80 BFED0000 C15F84F8 C15F5940 ..p......._.@Y_.
NSD:C15F7ED0| C5212740 BFED1000 C15F85D8 C15F6000 @'!......._..`_.
NSD:C15F7EE0| C54A4BC0 BFED2000 C15F7F58 C15F5B00 .KJ.. ..X._..[_.
0xD10 = 0xC15F7ED0 - 0xC15F71C0
page_address_maps 전역변수는 0xBFE00000 - 0xBFFFF000 구간 가상 주소에 대한 페이지 정보를 포함
'시스템 소프트웨어 개발을 위한 Arm 아키텍처의 구조와 원리 > 19장: 메모리 매니지먼트' 카테고리의 다른 글
[Arm프로세서] MMU를 구성하는 주요 기능 (0) | 2024.01.01 |
---|---|
[Arm프로세서] 운영체제 관점에서 메모리 매니지먼트란? (0) | 2024.01.01 |
[Arm프로세서] 가상 주소와 물리 주소의 개념 (0) | 2024.01.01 |
[Arm프로세서] MMU 란 (0) | 2024.01.01 |
[Arm프로세서] 메모리 매니지먼트란? (0) | 2024.01.01 |