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 구간 가상 주소에 대한 페이지 정보를 포함

 

+ Recent posts