티스토리 뷰

Study/Architecture

[Architecture] Building the MMU (1)

생각많은 소심남 2016. 6. 30. 00:49

이번 포스트에서는 MMU를 어떻게 설계하는지에 대해 다뤄보려고 한다.

MMU의 동작에 있어서 주요한 역할을 하는 변수는 크게 P, V, M으로 볼 수 있다.

P는 virtual address, physical address에서 해당 page map의 index를 가리키는 offset을 구성하는 address의 bit 수이다. V는 virtual page number로 쓰이는 bit수이고, M은 physical page number로 쓰이는 bit 수이다. 아마 지난 포스트에서도 봤었겠지만, 이 P, V, M을 이용해서 page의 크기를 구할 수도 있고, 또는 page의 갯수도 도출할 수 있다. 위 변수로 구할 수 있는 정보는 다음과 같다.


 보통 CPU를 고를 때 32bit니, 64bit니 하고 구분을 지어놓은 것을 들어봤을텐데, 바로 virtual address를 구성하는 bit 수가 바로 그걸 나타내는 것이다. 그리고 이게 ISA (Instruction Set Architecture)를 구분짓는 하나의 요소이기도 하다. 그래서 32bit architecture를 사용하는 경우는 2^32 byte 만큼의 memory 영역을 사용할 수 있는 것이고, 반면 64bit architecture를 사용하는 경우는 2^64 byte 만큼의 영역을 사용할 수 있는 것이다. 전자의 경우를 변환시키면 4GB, 후자의 경우는 16EB(SI prefix에 따르면 Exa는 10^18을 나타낸다.)인데, 보통 시중에 나와있는 DDR4 4GB를 놓고 따져보면 얼마나 차이가 나는지를 알 수 있을 것이다.


 위 그림과 같은 상황이 있을 때 우리는 어떤 정보를 얻을 수 있을까? 서두에서 언급한 내용과 같이 여기서 p, v, m을 구하면 계산이 편하다. 우선 offset p는 12, virtual page number v는 20, physical page number m은 18인 것을 알 수 있다. 이를 통해


 - virtual address (v+p) = 32 bit

 - physical address (m + p) = 30 bit

 - page size (2^p) = 4KB 


임을 알수 있다. 이외에도


 - # of physical pages (2^m) = 256K

 - # of virtual pages (2^v) = 1M = # of page map entries


등을 구할 수 있다. 한가지 계산이 조금 복잡한 것이 있는데, 바로 한 page map을 구성하는 bit수를 구하는 것이다. 이걸 계산하려면 한 page entry를 구성하는 bit수를 구하고 거기에 page map entries의 갯수를 곱하면 되겠다. 그런데 우리가 이전 포스트에서 다뤘던 예제속에서 page entry의 구성요소를 보면 dirty bit / resident bit / physical page number bit 으로 구성되어 있던 것을 기억할 수 있었을 것이다. 이 값을 계산해보면 20(1+1+18)이 되고, 결국 한 page map을 구성하는 bit수는 20 *2^20 = 20M가 되는 것임을 알 수 있다. page map이라는게 memory access를 하면서 당연히 거쳐야 할 과정 중 하나인데, 만약 SRAM과 같이 빠르고 비싼 memory를 이런 page map 으로 쓰는게 효율적일까? cache로 쓰이는 RAM의 크기가 4GB이고 과장하면 16EB 라고 상상해보면 무척 비효율적임을 알 수 있다. 결국 이런 page map으로 쓰이는 것들은 CPU에 있는 SRAM들이 갖고 있을게 아니라 DRAM과 같은 main memory쪽으로 할당시키는 것이 조금 더효율적이다. 

 그래서 첫번째로 생각할 수 있는 MMU의 형태는 


위 이미지와 같이 physical memory의 일정 영역을 page map에게 할당해서 여기 map을 통해 그 나머지 부분에 대한 영역을 찾게 하자는 것이다. 이를 위해서 CPU는 physical memory에 있는 page map을 찾기 위해서 page map pointer 같은 것을 쓸 것이다. 그런데 위와 같은 구조도 문제는 있다. 적어도 실제 할당된 physical address로 접근하기 위해서는 


CPU -> 

address traslation 을 위해 page map 할당 영역 접근 -> 

해당 page map에서 찾고자 하는 physical address 탐색

 

과 같은 경로를 거쳐야 하는데, 이때 불필요하게 physical memory에 두번씩 접근하게 된다. 가뜩이나 SRAM보다 DRAM이 성능이 느린데, 공간적인 문제로 인해 physical memory에 page map을 할당하면 이로 인한 performance 저하가 심해지는 것이다.


 이를 해결하고자 하는 방법이 일종의 cache와 같은 것을 쓰는 것이다. 그래서 만약 cache를 거쳐서 virtual page number를 읽어갈 때 해당 데이터가 있으면 굳이 page map에 접근할 필요없이 바로 physical memory로 접근하는 것이다.



그래서 이런 cache를 보통 TLB (Translation Look-aside Buffer)라고 한다. 그대로 해석하면 미리 변환해놓은 정보를 담아놓은 buffer라는 뜻이다. 일반적으로 TLB는 최대한 miss가 나는 case를 방지하기 위해서, 다르게 말해서는 hit ratio를 극대화하기 위해서 fully associative로 구성되는데, 그랬거나 말거나 TLB는 매우작고 빠르다..

 다음 포스트에서는 위와 같은 TLB가 있으면서 physical memory에 page map이 있는 형태의 architecture에서 어떤식으로 translation이 이뤄지는지 살펴보고자 한다.

'Study > Architecture' 카테고리의 다른 글

[Architecture] MMU improvements  (0) 2016.07.06
[Architecture] Contexts  (0) 2016.07.05
[Architecture] Building the MMU (2)  (1) 2016.07.04
[Architecture] Page faults  (0) 2016.06.29
[Architecture] Basics of Virtual Memory (2)  (0) 2016.06.26
[Architecture] Basic of Virtual Memory (1)  (1) 2016.06.16
[Architecture] Memory Hierarachy  (0) 2016.06.12
댓글