임베디드/임베디드 레시피

MMU : Memory Management Unit ( 다시보기)

twoweeks-within 2025. 1. 16. 17:24

MMU : CPU의 memory 주소 접근 > 주소를 속임

  > physical address, virtual address (logical address) 의 mapping 을 자기가 가지고 놈  (CPU모르게)

 >>

모든 Task, program 마다 똑같은 주소를 사용해도 되게 만들어줌 

+

두개의 CS를 사용하는 RAM의 물리적 주소가 

CS1 : 0x000000~0x10000 , CS2 : 0x20000 ~ 0x300000 나뉘어있어도

0x000000~0x20000으로 연속적인것처럼 할 수 있음

+

physical address 상에서는 쓰고남은 조각난 memory들을 한데 모아서 연속적인 memory처럼 사용할 수 있음

 

 

 

CPU : virtual > MMU :physical > 실제 memory access 

 

MMU> Memory 영역 특성 조작가능

특성) cache, non cache  ,,  Write bufferable , non write bufferable , read only ( write X)

 

CPU에게 받은 virtual memory를 physical memory로 Mapping 하려면?

1. Virtual Address와 Physical Address를 연결해 주는 Table ( Page Table) 

2. Table이 존재하는 위치 ( TTB : Translation Table Base Address ) > MMU 의 레지스터중 하나에 저장

// virtual > physical 로 바꿔주는 table 은 외부 memory에 존재

>>


① CPU는 Memory의 어딘가를 Access하기 위해서 Virtual Address를 발생
② MMU는 이 Virtual Address를 받아서 Memory의 TTB에서부터 시작해서
   존재하는 Page Table을 Access
③ 찾아간 Page Talbe안에 Physical 주소를 찾아내어 주소 신호를 발생
④ Memory는 해당 Physical 주소안에 Data를 출력해서 CPU에게 전달
⑤ Data가 CPU에 전달 됨.

 

 

 

virtual address : 32bit address system (regi : 32bit) > 2^32 = 4GB

    > Page Table 도 4GB씩 나타냄

       한개의 Entry( 32bit ) : 1MB 씩을 가르킴 > 4096개의 Entry 필요

// 1개의 Entry : 32 bit 

   >> Page Table 의 기본크기 : 4096 * 32bit = 16KB 

 

>

Section : virtual address 가 1MB 단위로 기본설정

Fine, Coarse Page Table : 64KB, 4KB단위로 나눔

 

Level 1 Page Table : 1MB 단위로 4096개로 나누어진 page table

Level 1 Page Table Entry : 각 32bit 씩의 단위

/*

32bit 이며, 4byte크기

1MB 라는 크기가 아니라 1MB 의 공간을 가르키는 주소

:  4096개의 공간을 가르킴 !

 

section enrty : 1MB 마크 

 Coarse Page Table,  Fine Page Table :그 1MB를 더 나눌 수 있게 해줌

    > 또 다른 Page Table을 가리킴

      >  Level 2 Page Table

 

Level 2 Page Table

 

 

>> 끝에 bit 2 잘 봐두길

 

ex) TTB : 0x00A24000 

 : 1MB, 4096개의 Page Table이 있음. 그럼, 이 MMU Table을 어떻게 해석할 것이냐 하면 한 칸당 1MB라고 보시면 됩니다요. 아래는 실제 PageTable이 어떻게 Virtual Address와 Physical Address를 Mapping 하는지를 한눈에 결과를 미리 알 수 있을 거에요. (Size 포함 되어 있어요)
 
 (MCU page table)
Virtual address_______|_physical_____________|_size____|
  C:00000000--008FFFFF|                                                                    // 실제 Mapping X
  C:00900000--009FFFFF|  A:00900000--009FFFFF| 00100000  // Size 1MB 로 물리주소에 가상주소가 Mapping
  C:00A00000--00B00FFF|                
  C:00B01000--00B0FFFF|  A:00B01000--00B0FFFF| 00001000|
  C:00B10000--00BFFFFF|  A:00B10000--00BFFFFF| 00010000|
  C:00C00000--014FFFFF|  A:00C00000--014FFFFF| 00100000|
  C:01500000--0153FFFF|  A:01500000--0153FFFF| 00010000|
  C:01540000--01546FFF|  A:01540000--01546FFF| 00001000| 
  C:01547000--01EFFFFF|                     
  C:01F00000--01FFFFFF|  A:01F00000--01FFFFFF| 00100000|
  C:02000000--16CFFFFF|           
  C:16D00000--177FFFFF|  A:16D00000--177FFFFF| 00100000|
  C:17800000--178BFFFF|  A:17800000--178BFFFF| 00010000| 
  C:178C0000--178CFFFF|  A:178C0000--178CFFFF| 00001000| 
  C:178D0000--1790FFFF|  A:178D0000--1790FFFF| 00010000| 
  C:17910000--1791EFFF|  A:17910000--1791EFFF| 00001000| 
  C:1791F000--B0053FFF|                      
  C:B0054000--B0055FFF|  A:00AC2000--00AC3FFF| 00001000| 
  C:B0056000--B005FFFF|   
  C:B0060000--B006FFFF|  A:01550000--0155FFFF| 00010000| 
  C:B0070000--B007CFFF|   
  C:B007D000--B007DFFF|  A:0156A000--0156AFFF| 00001000
  C:B007E000--B007FFFF|               
  C:B0080000--B00FFFFF|  A:01580000--015FFFFF| 00010000
 --------------------------------------------------------------------------
(TTB : 0xA24000 ~ Memory내용) 
___address__|________0_0123
ASD:00A24000|>00000000 ....  ①
ASD:00A24004| 00000000 ....
ASD:00A24008| 00000000 ....
ASD:00A2400C| 00000000 ....
ASD:00A24010| 00000000 ....
ASD:00A24014| 00000000 ....
ASD:00A24018| 00000000 ....
ASD:00A2401C| 00000000 ....
ASD:00A24020| 00000000 ....
ASD:00A24024| 00900D62 b...   ② → 00000000100100000000110101100010
ASD:00A24028| 00000000 ....
ASD:00A2402C| 00A41561 a...   ③ → 00000000101001000001010101100001
ASD:00A24030| 00C00D6A j...   ④ → 00000000110000000000110101101010
ASD:00A24034| 00D00D6A j...  
ASD:00A24038| 00E00D6A j...
ASD:00A2403C| 00F00D6A j...
ASD:00A24040| 01000D6A j...
ASD:00A24044| 01100D6A j...
ASD:00A24048| 01200D6A j. .
ASD:00A2404C| 01300D6A j.0.
ASD:00A24050| 01400D6A j.@.    ⑤ ~ 요기까지~
ASD:00A24054| 00A41961 a...
ASD:00A24058| 00000000 ....
ASD:00A2405C| 00000000 ....
ASD:00A24060| 00000000 ....
ASD:00A24064| 00000000 ....
 

 

1.   1번부터 9칸 (10MB) : Fault page : Mapping 안되어있는 영역 > 접근시 Abort 

2.   10번째 Entry : 끝에 2글자가 10 이므로 > Section Entry !  > Level 1 > 1MB 크기 가르킴

             > 앞의 12bit : base 주소 빼고 나머지 bit 를 0 으로 clear > Physical address Base 가 나옴

 >  00000000100100000000000000000000 == 0x900000 : 9MB부터 1MB를 가르킴.

 

>> 
Virtual address_________|_physical_____________|_size____|
  C:00900000--009FFFFF|  A:00900000--009FFFFF| 00100000   

-------------------------------------------------------------------------

③  11번째 Entry는 비었음 > 12번째 Entry 확인
 
ASD:00A2402C| 00A41561 a...  → 00000000101001000001010101100001

 > 끝 2bit : 01 coarse page [31:10] 까지가 base 주소 >   0000000010100100000 == 0xA41400 

                                                                                                                           > Level 2 Page Table

 

 

___address__|________0_0123
ASD:00A41400|>00000000 ....    ⓐ 여기는 비어 음
ASD:00A41404| 00B01FFA ....    ⓑ → 00000000101100000001111111111010
ASD:00A41408| 00B02FFA ./..
ASD:00A4140C| 00B03FFA .?..
ASD:00A41410| 00B04FFA .O..
ASD:00A41414| 00B05FFA ._..
ASD:00A41418| 00B06FFA .o..
ASD:00A4141C| 00B07FFA ....
ASD:00A41420| 00B08FFA ....
ASD:00A41424| 00B09FFA ....
ASD:00A41428| 00B0AFFA ....
ASD:00A4142C| 00B0BFFA ....
ASD:00A41430| 00B0CFFA ....
ASD:00A41434| 00B0DFFA ....
ASD:00A41438| 00B0EFFA ....
ASD:00A4143C| 00B0FFFA ....    ~ 요기까지~
ASD:00A41440| 00B10FF9 ....    ⓒ → 00000000101100010000111111111001
ASD:00A41444| 00B10FF9 ....
ASD:00A41448| 00B10FF9 ....
ASD:00A4144C| 00B10FF9 ....
ASD:00A41450| 00B10FF9 ....
ASD:00A41454| 00B10FF9 ....
ASD:00A41458| 00B10FF9 ....
ASD:00A4145C| 00B10FF9 ....
ASD:00A41460| 00B10FF9 ....
ASD:00A41464| 00B10FF9 ....
ASD:00A41468| 00B10FF9 ....
ASD:00A4146C| 00B10FF9 ....
ASD:00A41470| 00B10FF9 ....
ASD:00A41474| 00B10FF9 ....
ASD:00A41478| 00B10FF9 ....
ASD:00A4147C| 00B10FF9 ....
ASD:00A41480| 00B20FF9 ....
ASD:00A41484| 00B20FF9 ....     주으으으욱~
 
 
ⓑ  : 00000000101100000001111111111010 : 끝이 10

          > small page 4KB ( coarse page table 에서)

Physical Address : 하위 11번째 bit 까지를 clear : 00000000101100000001000000000000 → 0xB01000

0xB01000에서부터 4K 만큼 차지

  > 그 뒤로  0xB01000에서부터 0xB0FFFF까지 모두 4KB로 차지.
 
Virtual address_________|_physical______________|_size____|
 C:00B01000--00B0FFFF|  A:00B01000--00B0FFFF| 00001000| //
 
ⓒ : 끝이 01 :  Large page 16KB 이거는 [15:0]을 0으로 clear : 00000000101100010000000000000000= 0xB10000

    >   0xB10000부터 16KB씩 늘어남
>
 Virtual address_________|_physical_______________|_size____|
  C:00B10000--00BFFFFF|  A:00B10000--00BFFFFF| 00010000|
 
>>

0xB00000 의 1MB 영역을 다봄,

 

다시 Level 1의 ④번 :

00A24030 : 00C00D6A ④ → 00000000110000000000110101101010: 끝이 10 > Section : 1MB짜리.

     >  ⑤까지 계속 비스므리한 값들이 연속되어 있음
       >  0xC00000~0x14FFFFF까지 계속 1MB 단위로 Mapping
 
  C:00C00000--014FFFFF|  A:00C00000--014FFFFF| 00100000|
 
--------------------------------------------------------------------------------

 

Cache관련한 설정 값들

  Virtual ↔ Physical Address Mapping +  Cache설정도 같이 있음 +  MMU관련한 Permission도 표기

 

Permission : read/write가

acceess :  uncached , unbuffered , write_through/ bufferred 뭐

    >>  cache와 MMU memory protection 기능에 대한 표기

> MMU page 단위로  설정 가능

 

____address______|_physical___________|_size___|permission|_access______________
00000000-008FFFFF|                    |        |          |                         
00900000-009FFFFF|A:00900000--009FFFFF|00100000|readwrite |uncached/unbuffered   ⓐ
00A00000-00B00FFF|                    |        |          |                     
00B01000-00B0FFFF|A:00B01000--00B0FFFF|00001000|readwrite |write-through/buffered
00B10000-00BFFFFF|A:00B10000--00BFFFFF|00010000|readwrite |write-through/buffered
00C00000-014FFFFF|A:00C00000--014FFFFF|00100000|readwrite |write-through/bufferedⓑ
01500000-0153FFFF|A:01500000--0153FFFF|00010000|readwrite |write-through/buffered
01540000-01546FFF|A:01540000--01546FFF|00001000|readwrite |write-through/buffered
01547000-01EFFFFF|                    |        |          |                   
01F00000-01FFFFFF|A:01F00000--01FFFFFF|00100000|readwrite |uncached/buffered 
02000000-16CFFFFF|                    |        |          |           
16D00000-177FFFFF|A:16D00000--177FFFFF|00100000|readwrite |write-through/buffered
17800000-178BFFFF|A:17800000--178BFFFF|00010000|readwrite |write-through/buffered
178C0000-178CFFFF|A:178C0000--178CFFFF|00001000|readwrite |write-through/buffered
 
 ⓐ 의 원래  page table Entry

 

 

 

자리 10987654321098765432109876543210
값    00000000100100000000110101100010

     > Section Entry

[11:2]까지의 bit 의미?

  AP(Access Permission)는 [11:10] = 11

   :  접근 권한.  ( 11 : ReadWrite Domain)

[8:5] = 1011

 Cache: [3] = 0 :  Uncached,

Write Buffer: [2] = 0 : Unbufferable 

>> 
C:00900000--009FFFFF|A:00900000--009FFFFF|00100000|readwrite |uncached/unbuffered      ⓐ      

 
두번째 ⓑ
  Page Table의 내용 :  00C00D6A 이었고요,
자리 10987654321098765432109876543210
값 00000000110000000000110101101010
 
AP는 [11:10] = 11  : ReadWrite

Domain : [8:5] = 1011 

Cache: [3] = 1 , 

Cached Write Buffer : [2] = 0 

    > Cache를 쓰고 있음 > Write-through Buffered

(만약에 Cache가 1인데, B도 1이면 Write-back buffer)
 
C:00C00000--014FFFFF|A:00C00000--014FFFFF|00100000|readwrite |write-through/buffered   ⓑ
 
C와 B의 의미
C B
0 0 : Cache Off, Write Buffer Off
1 0 : Cache On (Write Through), Write Buffer On
1 1 : Cache On (Write Back) Write Buffer On
 
Domain : 16개의 Domain으로 정해져 있음

ACR : 이런 Domain에 관해 2bit씩 16개의 Domain의 속성을 각각 가리킴
 
DACR : 0x00400001 2bit씩 자르면 > 8*4 / 2 = 16개의 Domain

  > 00/00/00/00/01/00/00/00/00/00/00/00/00/00/00/01 (binary)

 11, 0번째 : 01값을 갖음 ( Client) 

 (00 : No Access, 01 : Client, 10 : Reserved, 11 : Manager,   Master : 무조건 Access가능)

 

 Client 이외는  no access >Access 할 시 Fault

 

D15 no access  D14 no access  D13 no access  D12 no access
D11 client D10 no access  D9  no access  D8  no access
D7  no access  D6  no access  D5  no access  D4  no access
D3  no access  D2  no access  D1  no access  D0  client
 
위에서 본 Domain은 4bit로 이루어짐( Domain : [8:5] = 1011 == 11  )

 그러니까 Entry를 16개의 Domain중 하나의 Domain에 속하게 할 수 있음

그 중에 client에 속하면 > AP (Access Permission)에 의한 Access권한이 주어짐

     > 이 경우 : 둘 다 1011 == 11번째 Domain에 속함

  11번째 Domain :  Client

>

 Domain에 대한 access 권한 : System Design하는 Engineer가 잘 정해줘야함

 

TLB(Translation Look Aside Buffer) :  Cache :Entry에 대한 Cache
 
Virtual Address > MMU에 입력 > MMU) 일단 느린 Main Memory의 Page Table을 Access >곤란... 

        // Page Table에 갔다 오는 거 자체가 너무 느림

     > Entry자체도 Cache Memory를 마련해 놓고 거기다가 캐싱

   >>  Cache Memory : TLB

>>>

Page Table이 Entry안에 있으면 >  Main Memory까지 갔다 오지 않고 > TLB안에 있는 Entry를 가져다 씀
 
TLB안에 Entry가 없는 경우

  > Main Memory에 가서 Page Table을 가져옴
① CPU가 Virtual Address를 발생
② TLB에 Virtual Address Entry가 올라와 있는지 확인
③ 있으면 곧바로 Memory에 Access해서 Data 가져옴
④ 없으면 Memory의 TTB부터 위치해 있는 page table에서 Physical Address구해옴
⑤ 다시 Memory에 Access해서 Data를 가져옴
 >
if) TLB가 없다면?

    느려터진 Memory를 2번은 꼭 Access해야 Data를 가져올 수 있음!

CPU > TLB > Cache > DATA ( Hit ) 

 

 

실은 꺼꾸로 Page Table을 만들 수 있어야함..

남이 만든 System은 이렇게 분석을 하겠지만, 내가 만드는 System은 내가 꾸며줘야함

 

+ MMU 사용하면,, > 이제부터 Memory Map, 특히 Scatterloading도 무조건 Virtual Address 기준으로 만들어야함

 

 

'임베디드 > 임베디드 레시피' 카테고리의 다른 글

Art of Debugging  (0) 2025.01.17
JTAG interface  (0) 2025.01.17
Cache, Cash  (0) 2025.01.16
PLL , M/N:D  (0) 2025.01.15
Wait State  (0) 2025.01.15