이것저것/Windows CE

MMU의 등장

우담바라 2007. 9. 18. 14:30

MMU의 등장 배경

초창기의 프로그래머는 물리주소를 직접 사용하여 프로그래밍을 하였었죠.
우리가 아는 OS 중에 DOS와 같은 것은 논리주소를 사용하지 않죠. 현재는 대부분의 OS가 가상메모리를 제공하므로 논리주소가 필요합니다.
가상메모리의 개념이 만들어지게 된 과정은 역시 효율적 자원의 활용이라는 인간의 욕구가 시발입니다. 컴퓨터의 프로그램은 결국 CPU에 의해서 순차적으로 실행이 되므로 CPU가 필요로 하는 프로그램의 코드는 한 시점에 일부만 메모리에 존재해도 된다는 것을 인식하게 되었죠. 이는 물리적으로 작은 메모리를 설치한 컴퓨터에서 이 메모리보다 큰 프로그램을 실행시키고 싶은 필요에 의해 나왔죠.
메모리 가상화를 위해 나온 기술이 페이징이라는 기술입니다. 한 시점에 실제 필요하지 않은 프로그램 코드(물론 데이타도 포함)는 메모리에 미리 적재하지 않고 디스크와 같은 저렴한 기억장치에 적재해 놓은 것입니다. 그러면 물리적 메모리가 작다 하더라고 논리적인 메모리는 이론상 원하는 만큼 크게 만들어서 사용할 수 있는 것입니다.
그래서 페이징을 위해 CPU의 구조도 변화되어 메모리 폴트 처리를 위한 인터럽트 핸들링 기술이 등장하기도 했죠. 컴퓨터 내부에 DAT(동적 주소 변환)와 같은 개념도 도입이 되어 논리 주소를 실시간으로 물리 주소로 해석해 주는 기술도 나왔고요.
이제는 메모리가 16MB 밖에 되지 않는다 하더라도 512MB 짜리 프로그램을 실행할 수 있게 되었으니 참 좋은 세상이지요.
이와 비슷하게 다중 작업 기술도 병행해서 발전하게 되었답니다. 한 사람만 사용할 수 있었던 컴퓨터가 이제는 여러사람이 동시에 사용할 수 있는 기술이죠.
Security에 관련되어서는 가상 메모리를 사용하므로 물리메모리에 특정한 기능을 접근하지 못하게 할 수가 있습니다. 가상 메모리 매핑 정책에 설정만 되면 접근을 차단할 수 있으니 말입니다.
예를 들면 특정 메모리를 접근하면 전원이 나가게 설계되어 있는 컴퓨터가 있을 수도 있겠죠. 이럴 경우 권한을 갖지 않은 프로그램은 해당 메모리를 가상 메모리에 매핑할 수 없으니 접근을 제어할 수가 있죠.
다중 사용자의 경우 서로의 프로그램이 사용하는 메모리 영역을 서로 인지하지 못하게 하여 상호 보호하게 됩니다. 이러한 기능을 지원하기 위해 역시 CPU도 이 기능을 지원하는 기술이 채택이 되어 있어야 하지요. 예를 들면 Intel의 80286부터 protected mode라는 형태의 작동 방식을 지원하였기에 단일 사용자 OS인 DOS에서 다중 작업이 가능한 Windows라는 OS가 설치가 가능하게 되었답니다.

 

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

※ TLB(Translation Lookaside Buffer)

TLB는 가상 어드레스를 물리 어드레스로 변환하는 것과 접근 권한을 캐싱하고 있다. 만약 TLB가 가상 어드레스에 대한 변환된 엔트리를 갖고 있다면 접근 제어 로직은 접근이 가능한지 판별한다. 접근이 허용된다면 MMU는 가상 어드레스에 대한 물리 어드레스를 출력해준다. 접근이 허용되지 않는 경우엔 MMU가 CPU에서 abort 시그널을 보낸다.

TLB가 없다면(가상 어드레스에 대한 변환된 엔트리를 갖고 있지 않다) 하드웨어를 움직이는 변환 테이블은 물리 메모리 내에 있는 변환 테이블에서 정보를 읽어온다. 일단 읽어온 후엔 그 정보가 TLB에 저장된다. 이 때 원래 있던 엔트리는 지워질 수도 있다.

page(01)의 경우는 메모리 접근의 횟수가 많아지므로 시간이 오래걸림. 그래서 캐쉬에 TLB를 두어서 참조하는 방식을 사용한다.


Level 1 Translation Table : 4Gbyte의 공간(32bit)을 1M의 단위로 나누어서 관리

상위 12bit : 가상 주소 위치 정보 나타나는데 사용.(Adress Translation Infomation)

하위 20bit : Access Permission,Domain Select,Cacheable Bufferable,Discripter Type

 - Discripter Type : 00(falut), 10(section), 01(page), 11(reserved)

     section discripter : 주소 정보가 가시적으로 바로 보임.

     page discripter : section dicripter가 나타날때까지 이중(l2 table)으로 따라가야함.



Level 2 Translation Table : 1Mbyte의 공간을 1Kbyte의 단위(256개)로 나눈 똑같은 매핑정보를 가진 주소변환 테이블.(64k, 4k, 1k단위)

상위 20bit : 물리 주소 위치 정보 저장.

하위 12bit : ap, ds,cb,dt


cp15:

- 어디에 있던지 메모리 매핑 주소를 알아냄.

c1 : control register

c2 : translation table base register

c3 : domain access control register

 

cb(Cacheable, Bufferable)

ROM의 경우 Cacheable : 1, Bufferable : 0으로 세팅.

IO의 경우 Cacheable : 0, Bufferable : 0으로 세팅.

  1,0(write-through)

  1,1(write-back)


ap(Access Permission)

ap비트가 0일때 s(system)비트와 r(rom)비트에 의해서 권한이 결정된다.


ds(Domain Select) - 4bit

MMU는 도메인이란 기능도 제공한다. 이 것은 개별적 접근 권한을 갖도록 정의된 메모리 영역을 말한다. DACR(Domain Access Control Register)를 사용해 16개 까지의 도메인을 지정할 수 있다.

MMU가 off 상태일 때(프로세서가 리셋된 직후가 이렇다) 가상 어드레스의 출력은 직접 물리 어드레스를 가리키고 메모리 접근 권한 검사는 하지 않는다.

두 TLB 엔트리가 중첩된 메모리 영역을 가리는 경우는 예측할 수 없는 일이 발생한다. 이런 경우는 다른 크기의 페이지로 재 매핑된 후 TLB를 갱신하지 않아 발생할 수 있다.


테이블에 대한 접근은 총 16개의 ds을 참조한후 그후에 ap를 통해 결정된다.


- MMU설정 -

MOV r0,=TTbase

MCR p15,0,r0,c2,c0,0

MRC p15,r0,c1,c0,0

ORR r0,r0,#0x1

MCR p15,r0,c1,c0,0 //가상주소 활성화->MMU동작


※ TCM : 속도는 cache와 같으나 데이터나 코드가 차면 계속 머물러 있는 차이가 있음.

             (handler등 저장) ->ITCM,DTCM


Image에서 읽어와서 TCM에 저장.

stmia r0!,{r2-r9}


http://blog.naver.com/morsola714.do?Redirect=Log&logNo=60016337789

출처 : Tong - 통동이님의 프로그램밍 일반통