관리 메뉴

개발자비행일지

MMU(Memory management unit) 가상메모리, 물리메모리 변환 과정 본문

▶ Computer Science

MMU(Memory management unit) 가상메모리, 물리메모리 변환 과정

Cyber0946 2020. 6. 30. 22:29

Memory management(메모리관리)는 cpu가 가상주소체계를 통해 실제물리주소에 존재하는 프로그램을 읽고 실행시키기 위해 필요한 과정을 관리해주는 알고리즘을 말한다. 만약 MMU가 지원되지 않으면 물리메모리에 직접 접근해서 프로그램을 동작시켜야 되기 때문에, 가상메모리만으로도 물리 메모리를 신경쓰지 않고 해결할 수 있도록 해주는 것이 MMU이다. 

MMU를 이해하기 위해서 가장 중요한 핵심 개념은 가상메모리(Virtual memory)이다.

가상메모리를 통해서 우리는 우리에게 실제로 할당된 물리메모리 이상을 사용할 수 있고, 또한 메모리를 어떻게 할당해주어야 할지에 대한 고민 없이 프로그래밍을 할 수 있다.  즉, 아래 3가지 가능해진다.

1.사용자가 기억장소를 일일히 할당하는 불편을 없애준다.
2.프로세스의 크기가 실제 메모리의 용량을 초과해도 실행될 수가 있다.
3.설사 물리적 메모리의 용량이 충분히 크다하더라도 다중 프로그래밍이 가능하다.
 논리적 주소(logical address)와 물리적 주소(physical address)에 대해 아라보자.

논리적 주소란 만약 운영체제가 32bit 시스템일 경우 2 32승 즉 4G address space를 가지는 것을 의미한다. 허나 실제적으로 물리적 메모리 용량 비트수 만큼의 주소가 있지만, 실제로 BYTE당 주소가 할당되기 때문에 4G의 논리적 주소를 가지는 각각의 프로그램을 다중 동작하기에 어렵다. 

그런데 실제로 우리는, 4G의 공간이 필요한 여러 개의 프로세스 혹은 대량의 프로세스를 동시에 동작시키고 있다. 이걸 가능하게 해주는 것이 바로 가상주소체계이다. 이것은 우리가 메모리에 접근할 때, 가지는 국부성을 활용한 것으로 프로그램이 보조기억장치에서 프로세스(메모리로 올라오는)상태로 전이란 것은 실행될 때 필요한 국부적인 코드가 올라가는 것이다.

그러니깐, 실제적으로 각 프로그램의 일부만이 메모리로 계속적으로 올라가는 것이므로, 어느시점에 보면 프로세스의 개수는 많다고 하지만, 실제적으로 메모리로 올라가는 크기의 총합은 결코 메모리를 초과하지 않는다. 그렇게 만들지 않는다. 설사 메모리가 가득차(실제로 fragmentation이 있다.)게 된다하여도 swapping기술이 적용되어 해결된다.

또한 MMU는 일일이 모든 물리적 주소를 사용하는 것이 아니라 논리적 주소를 사용하여 실행에 필요한 영역만 그때 그때 읽어오는 방식으로 관리해 줌으로써 프로그래머가 메모리의 제한적인 환경에 신경쓰지 않을 수 있게 해준다. 

이렇게도 생각해 볼수가 있다. hdd를 하나의 메모리 그리고 main memory(dram)을 하나의 cache로 보아 cache가 조금씩 data를 가져오듯이 main memory에서 조금씩 data hdd로부터 가져와도 된다는 것이다.

정확히 virtual address라는 것은 cpu가 만들어 내는 주소이며 우리가 프로그래밍시에 쓰는 주소가 바로 이것이다. 

자 이제 페이지 테이블(page table)에 대해 알아보자. 예를 들어 논리적 주소가 최대 8k 2 13승으로 만들어진다고 할 때, 그리고 1개의 페이지는 1kbyte라 하면, 페이지 테이블은 논리적 주소를 페이지에 매핑시켜 주는 것이다. 

논리적 주소가 8k라고 하였으므로 8k/1k 8개의 page가 된다. 그리고 8k 2 13승으로 이는 13bit의 주소 space를 가진다.

그러면 어떻게 logical addressphysical address mapping되어지는가?

앞서 8개의 page가 만들어졌는데 이들은 각각 page number를 가진다. Page 0부터 000 page7까지 111이다.

위 그림의 에서는 page 5가 물리적 주소로 어떻게 mapping되는지를 보여준다. virtual address에서 처음 3bit 13 12 11 bit 101로 채워진다. 근데 memory에 특정부분에 보면 memory map이 존재하고 그 중에 memory page table이라는게 있다.

이는 os에 의해 운영되며 이는 logical page tablephysical address page table과의 mapping에 관한 정보가 기록되어 있다. 

위의 page 5의 tuple을 보면 01이라 나와있네요 근데 한가지 더 주목할 점은 Page table에서 보면 모든 tuple에 값이 있진 않다는 점이다. 이는 논리적 주소 space가 크고 물리적 주소가 적으므로 mapping되는 양이 적은것이다.

 

또한 이 page  table은 실행과정에서 생성되어 지기 때문이다. 즉 진행형이다. 그래서 presence를 나타내는 bit가 하나 있다. 지금 위 시점에서 현존하는 page(물리적 공간에서) 4개이고 이는 page table에서 모두 1로 셋팅되어 있습니다.

여기서 01이라는 정보가 physical address의 최상위 2bit의 값이 된다그리고 논리적 주소부분에서 나머지 즉 위 최상위 3bit를 제외한 나머지는 page offset이라는 것으로 바로 physical address에 바로 mapping됩니다.

01 이것은 실제적으로 물리적 page table에서 두번째 page를 가리키며

00 -> 01 -> 10 -> 11

이런식으로 physical address가 만들어진다.

그럼 실제 현재 주 시스템인 32bit시스템의 예를 함 들어보면 위 그림과 같다. 여기서 하나 중요한 포인트는 page table register이라는 것입니다.

이 레지스터는 physical page table의 base address를 기록하는 역할을 한다. 32bit시스템이므로 2 32이승이고 이는 앞서 애기한 것처럼 4G영역의 주소공간을 가진다. VIRTUAL ADDRESS구조를 보면 앞에 virtual page number를 가리키는 부분이 20bit입니다. 그럼 page크기는 얼마인가? 20bit 를 제외한 나머지 부분이다. 12bit 4k를 하나의 page로 한다

4k의 page에는 총 2 12승개의 physical page number의 총 가지수가 될수가 있는 것입니다. 하지만 우리는 최상위 3bit를 제외한 비트만 썻던 것을 기억하고 그 중에 하나가 page의 존재여부를 알기위한 presence 1bit였으므로 2bit가되고 2 2승 즉 총 4가지의 값이 memory page table에 기록되는 것이다. 이 경우에는 12bit중에 2개 빼고 10개 즉 2 10승 개의(1M) 경우의 수중에 어느 한값이 memory page table에 값이 있다는 애기가 됩니다.

viurtual adress의 경우 20개의 bit값들이 memory page table mapping되 지는데 그 값들에 대해서 memory page table에서는 2개의 valid bits를 두고 18 bit로 이루어지는 값들이 mapping이 이루어 지도록 하고 있다.

그럼 해당 tuple mapping되어진 18 bit들이 바로physical address에 보내져서 최상위부터 시작해서 18개의 bit를 채웁니다.그리고 virtual address에서 나머지 부분이었던 Page offset들이 역시 마찬가지로 바로 전해져서 총 29bit physical address를 만들어낸다. 즉 우리가 잘못 알고 있는 상식으로 32bit시스템이니 당연히 32bit주소겠거니 하겠지만 실제로 이런식의 29bit주소가 물리적 메모리 주소가 된다. 

우리가 printf(%#010x -- %d\n,aa,sizeof(aa)); 이를 통해 마주하는 4byte 주소는 virtual address이.

그리고 이처럼 page라는 기본단위에서 생각해서 이루어지는 것을 paging이라한다.

32bit시스템이고 PAGE의 크기를 4K라고 할 때, 2 32승을 4K 2 12승으로 나누어보면 2 20승이 됩니다.

이는 MEMORY PAGE TABLE의 크기가 즉, TUPLE수가 2M개가 있어야 한다는 애기다. 이렇게 되면 Mapping table이 너무 커지고 탐색하는 데 시간이 너무 오래걸린다. 

이를 방지하기 위해 다단계(Multy Level) page table이라는 것으로 MMU를 구성한다. 

쉽게말하면 가상 주소 공간 즉, logical address space 4G 주소영역에서 실제 프로세스가 쓰는 영역은 극히 제한적이기 때문에 일부분만을 담아서 사용해도 충분하다는 애기입니다.

즉 위 그림처럼, 3단계 정확히는 mapping table자체가 2중 구조로 이루어진다.

위 그림은 이렇게 보시면 되는데 처음 31-22 10bit page directory라는 첫번째 mapping table의 한 주소를 알려준다. 더 정확히 애기하면, 앞서 말씀드린 page register에는 page directory base addres가 있는데 base address에서 위로 얼마다 이런 값이 바로 이 10bit다. 그리고 이때 해당 값에 해당하는 page directory의 값은 다음 page table base address를 가리킨다. 그리고 또 같은 패턴으로 21-12 10bit의 값은 이 base address에서 +얼마다 하는 상대적인 위치값이된다. 

마찬가지로 이 값은 역시 page frame에서 base address를 가리키고 있죠 그리고 이를 offser만큼 +하여  실제 physical page number 값을 알아냅니다. 이는 다시 offset값과 더해져 드디어 physical address를 만들어 낸다.

실제 정리해 보면 위의 그림과 같다. 처음 page address register에서 top level page directory table base address를 알아내고 여기서 앞의 10bit값만큼 +하여 다음 2nd level page table base address를 알아내고 다시 그 다음 10bit값에 따라 다음 page frame base address를 알아내고 여기서 +offset만큼 해서 드디어 physical page number를 알아내고 여기에 offset값을 뒤에 바로 붙여 physical address를 만들어 냄으로써, 실제 memory access에 들어가는 것입니다.

, 4M 가상주소으 4M정도를 커버하는 TABLE 1024개가 있어야 하는거죠 4G영역을 커버해야 하니깐요 허나 실제 사용되는 주소는 한정적이고 따라서 위 그림에서 각 ENTRY즉 한의 TUPLE 들에는 다 일일이 값이 들어 있지는 않다.