공부/OS

[운영체제] 가상 메모리 : two-level paging

algosketch 2021. 5. 16. 07:01

 가상 메모리 정리하는데, 가장 중요한 부분을 빼먹었다. 진짜로 가장 중요한 건 아니고 내가 발표해야할 부분이어서 가장 중요하다. 발표 내용 : IA-32 two-level paging

 paging 기법을 이용하면 두 가지 문제점이 발생한다.
1. 속도
2. 메모리 낭비

속도 문제는 TLB 를 사용해 해결했었다. 32 비트 주소와 4kb 의 페이지 크기를 사용하면 페이지 테이블 하나의 크기는 4mb 가 된다. (2^20 * sizeof(PTE, 4byte) = 4mb) 사용하지 않는 페이지의 수가 많을 경우 그만큼 메모리 낭비가 된다. 간단한 해결 방법으로 page size 를 늘릴 경우 내부 단편화 문제가 생기고, inverted page table(VPN -> PFN 매핑이 아니라 PFN -> VPN 매핑 방법)을 사용할 경우 찾는데 걸리는 시간이 문제가 된다.

page table 을 배열이 아닌 다른 자료구조를 이용하면 해결할 수 있지만 IA-32 에서는 하드웨어에서 TLB 가 구현되어 있기 때문에 자료구조를 변경하는 것은 불가능하다.

따라서 지금 살펴보게 될 multi-level page table 을 표준적으로 사용한다. 32 비트의 경우 two-level 을 사용하고 64 비트의 경우 four-level 을 사용한다. two-level 의 경우 기존의 메모리 주소 32 비트 (VPN : 20, offset : 12) 에서 VPN 을 10 + 10 비트로 쪼갠다. 앞의 10비트는 directory index 가 되고 뒤의 10 비트는 page table index 가 된다. 이렇게 구현할 경우 directory index 에서 invalid 한 table 은 메모리를 할당하지 않으므로 낭비되는 공간을 줄일 수 있다. 물론 page table 에서도 invalid 한 부분이 존재하기 때문에 약간의 낭비는 있다.

CR3 : page directory 를 가리키는 IA-32 의 특별한 레지스터

단점으로는 TLB miss 가 일어났을 때 메모리에 두 번 더 접근해야하기 때문에 느려질 수 있다. 하지만 TLB hit 나는 경우가 훨씬 많기 때문에 큰 성능저하는 일어나지 않는다.

IA-32 에서는 segmentation 과 paging 을 같이 사용하는데, 32비트에서만 이렇게 사용한다. 한 segment 는 최대 4GB 이고, 16k 개의 segment 를 가질 수 있다. 8k 는 local, 8k 는 kernel 이 사용한다. 세그멘테이션은 페이지 단위로 한다. 근데 segmentation 에서 GDT 는 하나이므로 8k 개 사용할 수 있어도 결국 1개만 쓰는 거 아닌가?

IA-32 아키텍처는 linear address 를 만들어 낸다. linear address 의 구조는 selector 13, g 1, p 2 비트로 구성되며, g : global, p : privilege 이다.
page size : 4kb, 4mb 중 선택

이해하기 굉장히 어려웠는데, 지금도 이해가 안 간다. 내가 이해한 바로는 다음과 같다.

logical address : selector + offset (32 bit)
linear address : VPN + offset (12 bit)
physical address : PFN + offset (12 bit)

주소 변환 순서는 logical address → linear address → physical address 이다. 공부하면서 가장 문제가 되는 부분은 logical address 이다. logical address 는 16 bit 의 selector 와 32 bit 의 offset 으로 이루어져 있다. selector 는 segment 의 index 를 의미하고 descriptor table 에서 이 인덱스를 이용하여 segment 의 base address 를 얻을 수 있다. 이 base address 에 offset 을 더하여 linear address 를 얻을 수 있다. (linear address = virtual address, segmentation 만 사용한다면 linear address 가 physical address 가 된다.) logical address 의 offset 은 32 bit 이기 때문에 linear address 의 offset 과는 다르다. linear address 의 offset 과 physical address 의 offset 은 같다.
 logical address 에서 linear address 를 얻어내는 방법은 먼저, GDTR + 4*LDTR 로 LDT 를 얻어낸다. 그 후 LDT + 8*index 로 segment 의 base address 를 얻어낸다.(index = selector MSB 13bit) 얻어낸 base address + offset 을 하면 linear address 가 나온다. 라는 게 내 뇌피셜이다. selector 는 cs, ds, ... 등 segment register 를 이용하여 얻는 것 같다.