CodePoetry 2015. 8. 23. 00:03

출처 : http://recipes.egloos.com/5232056

MMU는 물리 주소와 가상 주소의 맵핑을 가지고 장난을 친다.

이것의 장점은 Task마다 혹은 프로그램 마다 똑같은 주소를 사용해도 되게 만들어 준다. 또한 흩어진 물리 주소도 연속된 것인양 사용할 수 있게 해준다.

Memory 영역의 특성을 나눠주기도 하는데, Cache영역과 Non Cache영역, 그리고 쓰기 관련해서는 Write Bufferable과 Non Write Bufferable 영역으로 나눌 수 있다. 심지어 어떤 여역은 Write를 못하게 Read only 영역으로 지정할 수도 있다.


CPU에게서 받은 가상 주소를 물리 주소로 바꾸면 뭐가 필요할까?

1) 가상주소와 물리 주소를 연결해주는 Table! = 페이지 테이블
2) Table이 존재하는 위치! = TTB (Translation Table Basic Address), MMU의 region 중 하나에 지정되어 있다.

알아두어야 할 점은 페이지테이블은 외부 메모리에 존재한다는 것이다. 외부 메모리란 느린 외부 main memory일 수도 있고, 빠른 성능을 위해서 MCU 내부에 TCM Memory에 위치시킬 수도 있다.


가상 메모리로부터 물리주소를 알아내어 접근 후 데이터를 가져오는 과정은

1) CPU는 메모리의 어딘가에 접근하기 위해 가상주소를 발생시킨다.
2) MMU는 이 가상주소를 받아서 메모리의 TTB(페이지테이블이 존재하는 위치)에서부터 시작해서 존재하는 페이지테이블에 접근한다.
3) 찾아간 페이지테이블 안에 물리주소를 찾아내어 주소 신호를 발생시키고
4) 메모리는 해당 물리주소 안에 data를 출력해서 CPU에 전달한다.
5) data가 CPU에 전달된다.

32비트 시스템에서는 register의 크기가 32bit이므로 2^32 = 4GB만큼의 가상 주소를 가질 수 있다. 그럼 페이지테이블은 당연 4GB를 나타낼 수 있어야 한다. 페이지테이블 한 개의 entry (테이블 가로 한 칸)는 1MB씩을 가리킬 수 있다 (entry 하나는 32bit로 구성되어 있으며 1MB씩 가리킨다는 건 그냥 딱 정해 놓은 것이다). 그러므로 4GB/1M = 4*1024/1 = 4096개의 entry가 필요한 셈이다. 4096개의 32bit entry의 크기는 16KB, 이것이 페이지 테이블의 기본 크기이다.

가상주소는 1MB 단위로 기본 설정이 되어 있다. (섹션이라 부름). 이 상태에서 더 잘게(level증가) 쪼갤 수 있도록 옵션이 있는데 64KB로 쪼개면 Fine 페이지테이블. 4KB로 쪼개면 Coarse 페이지테이블이라고 한다.

  • 1MB씩 쪼갠 것 = Level 1 페이지 테이블
  • 코어스나 파인도 level1 페이지 테이블이다.

섹션 엔트리의 각 비트의 의미에 대해 알아보자.

  • AP[11:10] : Access Permission. 11이 Read/Write
  • Domain[8:5] : DACR(Domain Access Control Register)에서 정의한 값들 중 하나에 해당한다. client에 속하면 AP에 의한 Access 권한이 주어진다.
    DACR은 16개의 도메인을 가지고 있다.
    만약 DACR이 0x00400001 이라면 이것을 2진수로 바꿔 2bit씩 자른다. 결국 00/00/00/00/01/00/00/00/00/00/00/00/00/00/00/01이니까 11번째와 0번째가 01이다.
    / 00 : No Access / 01 : Client / 10 : Reserved / 11 : Manager, 무조건 Access /
  • Cache[3] : Cached 혹은 Uncached
  • WriterBuffer[2] : Writer Bufferble 혹은 Write Unbufferable


  • 코어스나 파인 페이지테이블이 가리키는(더 잘게 쪼개는) 페이지 테이블을 level 2 페이지 테이블이라 한다.


level1, level2 페이지테이블까지 전체 그림으로 보면 아래와 같다.

TLB(Translation Lookaside Buffer)

페이지테이블 entry를 저장하는 캐시 메모리.

가상주소를 MMU에 입력했을 때 main memory의 페이지 테이블에 접근하는 건 너무 느리다. 그래서 entry 자체도 cache memory를 마련해 놓고 저장하는데 이 캐시가 바로 TLB이다.

TLB와 연관지어 MMU의 동작을 살펴보면,

1) CPU가 가상주소를 발생시키면
2) TLB에 가상주소의 페이지테이블 entry가 올라와 있는지 확인해보고
3) 있으면 곧바로 memory에 접근하여 data를 가져온다. 끝. // TLB에 있을 때는 한번의 memory 접근으로 끝.
4) 없으면 memory의 TTB부터 위치해있는 페이지 테이블에서 물리주소를 구해와서 // TLB에 없을 때 첫번째 memory 접근
5) 다시 memory에 접근해서 data를 가져온다. // 두번째 memory 접근