티스토리 뷰

Study/OS

[Memory] Sample Memory System

생각많은 소심남 2014. 9. 3. 16:28

*이 글은 Coursera에 공개되어 있는 HW/SW Interface 강의를 요약한 내용입니다.


이전에 다뤘던 내용을 토대로 간단한 메모리 구조를 살펴보려고 한다.



위와 같은 Virtual Memory와 Physical Memory 형태가 있다.Virtual Memory는 14 bit으로 되어 있고, Physical Memory는 12bit으로 되어 있다. 이전 포스트에서 언급한 내용이기도 하지만 Page Table에서 찾은 base address에 offset만 더한 형태로 Page Table Entry를 찾게 되므로 실제로 Virtual Page나 Physical Page가 가지는 Offset은 같다. 지금의 예시에선 Offset이 6bit으로 되어있는 것으로 보아서 Page size는 2^6 = 64byte라는 것을 알 수 있다. 

 이제 MMU에 있는 Page table에서 Virtual Page Number를 Physical Page Number로 바꾸는 과정이다.

Page Table이 하는 역할은 virtual page number에 대해 정의되어있는 Physical Page Number를 찾는 것이며, 이전 그림에서 본 것처럼 Virtual Page Number에 해당하는 bit은 8 bit이기 때문에 Page Table Entry는 총 0 부터 2^8 -1 까지 총 256개가 있다는 것을 알 수 있다. 위의 예시는 그 중에 16개만 보여주고 있는 상태이다. 


다음은 MMU의 Memory Access를 줄이기 위해 hardware로 구현된 TLB의 구조다. TLB도 일종의 cache이고, 위의 형태는 4-way set-associative 이다. 그리고 각각의 way에는 4개씩 총 16개를 담을 수 있는 아주 작은 TLB인데 일반적으로는 256 / 1k의 TLB 크기를 가진다고 한다. cache와 마찬가지로 set내의 주소를 찾기 위한 Index bit(2bit)과 tag bit(6bit)이 존재하며 page table을 대신하기 위한 valid bit이 있다. 이처럼 TLB에 포함되어 있는 모든 정보는 Memory의 Page Number에서만 가져온다. 앞에서 설명했던 것처럼 Offset은 따로 translation 할 필요 없이 바로 이용하기 때문이다.

다음은 MMU와 Memory 사이에 있는 System Cache다. 위의 구조는 16line direct mapped cache로 되어있는데 여기서부터는 실제의 Physical address를 통해서 memory에 전달되기 때문에 Offset이 나눠진다. 엄밀히 말하면 이것도 일종의 cache이기 때문에 내부적으로 tag / index / valid bit이 존재하고, block size내의 내용을 가져오기 위한 offset bit이 또 존재한다. 참고로 지금 시스템은  block size를 4 byte라고 가정한 상태이고 이때문에 offset bit 도 2개 있다.


그럼 virtual Address가 physical Address로 변환되는 과정을 살펴보려고 한다. CPU로부터 얻은 Virtual Address가 0x03D4라고 가정해보자.

여기서 맨 처음 TLB를 거치게 될 것이다. 그러면 Offset부분은 신경쓸 필요없이 Page Number부분만 보고 과연 이안에 들어있는 게 TLB안에 있는 지를 확인해야 되는 게 먼저 할 일이다.

그럼 Page Number 영역을 Index와 Tag 영역으로 나눴을 때 우리는 Index가 3이고 Tag가 0x03인 data를 찾으면 될 것이다. 



앞에서 언급한 TLB table을 가져오면 Page number가 가리키는 영역이 TLB가 0x0D라는 값을 가지고 있고, 이게 valid하다는 것을 알 수 있다. 그래서 따로 Page Table을 볼 필요도 없고,Page Fault같은 exception이 발생하지 않고 바로 이 값을 Physical Page Number로 반환하게 된다. 이렇게 얻은 값을 이용해서 이제 Physical Address를 구하는 게 목적이 된다. 그러면 이전에 virtual address에서 가져온 Offset과 Physical Page Number를 붙이면 되겠다.


이 중에서도 앞에서 언급했던 것처럼 Tag / Index / Offset bit으로 구분지어야 한다.


이제 이 값이 system cache안에 있는지를 확인해야 된다. 우리가 cache에서 찾아볼 값은 Tag는 0x0D를 가지고 Index는 0x05이며 그중에서 offset이 0인 것이다. 잘 찾아보면 있다.


결국 반환할 값은 0x36이 되겠다.


이제는 예외가 발생하는 case에 대한 예시이다. 받은 virtual Address가 0x0B8F라고 하고 이전에 사용했던 TLB, Page Table, Cache를 가진다고 가정해보자.


역시 앞과 마찬가지로 TLB만 읽을 영역만 빼서 확인해보면 TLB Index는 2, Tag가 0x0B인 값을 찾아보면 되는데 실제로 보면 값이 없다.. 이 같은 경우는 사실 모른다.지금 우리가 알고 있는 사실은 TLB miss가 발생했다는 것이고, 이 값이 실제로 memory에 들어있을 지를 알 수가 없다. 따라서 이런 경우에는 TLB가 miss되었기 때문에 우선 Page Table 을 살펴보고 Page Table Entry를 가져와야 한다. 지금 우리가 알고 있는 Virtual Page Number는 0x2E이기 때문에 0x2E에 대한 Physical Page Number를 알기 전까진 할 수 있는 게 아무것도 없다.

세번째 예제는 virtual Address가 0x0020인 경우이다.

이때는 TLB Index가 0, Tag가 0인 상태인데 TLB를 살펴보면 해당 영역이 비어있는 것을 알 수 있다.


따라서 TLB miss가 발생하고, 결국 Page Table에서 VPN이 0x00인 값을 찾아보면 여기에 맵핑되어있는 Physical Page Number가 0x28인 것을 알 수 있다.


이걸 통해서 Physical Address를 만들게 되면

와 같이 되고, 우리는 System cache에서 Tag = 0x28, Index = 0x08 Offset = 0x00인 값을 찾으면 된다.


그런데 cache의 tag값과 우리가 알고 있는 tag값이 다른데 이렇게 되면 결국 우리가 얻고자 하는 데이터를 Memory에서 읽어오고 그 값을 해당 영역에 써주게 될 것이다.


지금까지 몇 개의 포스트를 걸쳐서 virtual memory에 대해서 정리해보았다. 간단히 요약하면 process는 각각의 virtual memory 를 가지면서 목적에 따라서 자신의 영역을 보호하거나 공유하는 등 physical memory를 그냥 바로 쓰는 것보다 효율적으로 쓸 수 있게끔 할 수 있고, 일종의 cache 처럼 동작하면서 중간에 VA<-> PA같은 Address translation도 이뤄지는 것을 확인했다.


옛날에 한번 봤던 내용인데 가물가물해서 계속 정리를 해보고 있다. 

참고로강의 뒤에 문제가 있었는데 위와 같은 TLB, Page Table, Cache를 가진 상태에서 0x15D의 virtual Address를 받으면 어떤 값이 return 될까 였다. 한번 풀어보면 조금 더 이해하는데 쉽지 않을까 싶다. 답은 0xc2

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

[Memory] Dynamic Memory Allocation  (0) 2014.09.05
[Memory] Address Translation  (1) 2014.09.02
[Memory] Virtual memory caches  (5) 2014.09.01
[Memory] Indirection  (0) 2014.09.01
[Process] Fork-exec Model  (0) 2014.08.29
[Process] Creating New Processes  (0) 2014.08.29
[Process] What is a process?  (2) 2014.08.29
댓글