본문 바로가기
회고록

[WIL]🙈PINTOS_KAIST : Project 3. VIRTUAL MEMORY (2) : Memory Management 🙉

by NOHCODING 2022. 12. 1.
반응형
🚫 현재 글은 정확하지 않은 정보가 있을 수 있습니다. 언제든지 틀린 부분에 대해 댓글을 달아주세요! 🚫

01.  JUNGLE_PINTOS PROJECT3: VIRTUAL MEMORY 

 

PINTOS 2 : PINTOS MEMORY LAYOUT

지금까지 우리가 구현한 PINTOS는 상단과 같은 MEMORY LAYOUT으로 구성되어 있으며,  레벨 4 페이지 테이블(pml4)를 사용하여 가상 메모리 주소와 물리메모리 주소간의 매핑 정보를 저장한다. 그런데 Page Table에 가상주소를 물리주소로 변환하는 정보와, dirty bit, acess bit 등등에 대한 정보가 있는데 이것만 가지고는 가상메모리를 구현하기 힘들다.

 

가상메모리를 구현하기 힘든 이유는 swap in, swap out등을 하려면 페이지에 해당하는 물리주소에 있어하는데 데이터가 실제 어디 존재하는지에 대한 정보를 알 수 없기 때문이다. 그래서 spt라는 테이블을 만들어서 추가로 필요한 정보들을 담게 되는 것이다!

 

항상 개떡같이 물어봐도 찰떡같이 설명해주는 천사웅니....😭

현재까지 PROJECT2 에서는 Page Fault는 항상 커널 또는 유저 프로그램의 버그를 의미했다. 하지만 이제 Page Fault가 발생하면 스왑 슬롯에서 페이지를 가져와서 Page Fault를 관리할 수 있어야 한다. 

 

 

 

  (1) Page Fault란?

Page Fault는 인터럽트의 한 종류이다. 프로그램이 자신의 주소공간에는 존재하지만 시스템의 RAM에는 현재 없는 데이터나 코드에 접근을 시도하였을 경우 발생하는 현상을 말한다. 페이지 폴트가 발생하면 운영체제는 그 데이터를 메모리로 가져와서 마치 페이지 폴트가 발생하지 않은 것 처럼 프로그램이 계속 작동하게 해줘야한다. 

 

CPU는 원하는 주소를 MMU에게 보낸다. 그러나 MMU에는 이 주소 변환 과정에서 페이지 테이블에 관한 항목이 없다면 MMU는 COU를 인터럽트 한 후 페이지 폴트가 실행되도록 한다. 

  • 원하는 페이지가 디스크 상 어디에 위치하는지 찾은 후 읽어오기(일반적으로 페이지 폴트가 코드 페이지 일 경우)
  • 원하는 페이지가 이미 RAM에 존재하지만 아직 현재 프로세스에는 할당되지 않았는지 확인 후 MMU가 그 주소를 찾도록 재설정하기

 

가상주소로 물리주소로 변환후  물리메모리에 적재 시, 해당 공간이 없거나, 동일한 주소가 없을 때 발생하는 인터럽트이다. i

 

nvalid page를 접근하면 MMU가 trap을 발생시키고, 페이지 폴트(즉 trap)가 발생하면 운영체제에서 해당 페이지 커널 모드에서 page fault handler가 invoke된다.  페이지 폴트가 발생하지 않을수록 메모리 관리가 잘 되고 있는 것이다. 

더보기

1. CPU에서 특정 데이터에 대한 가상 주소를 요청한다.

2. MMU에서 해당 가상주소를 기반으로 TLB를 조회한다.

        ▶ 조회 결과, 데이터가 있다면 바로 해당 데이터를 반환한다.

3. 조회 결과, 데이터가 없다면 메인 메모리의 page table 접근하여 해당 가상 주소의 물리주소를 검색한다.

4. 해당 물리주소가 메모리에 적재되어 있는지 없는지 확인한다. 

        ▶ 적재 되어 있다면 해당 물리주소의 데이터를 CPU에게 반환한다.

5. 해당 물리주소가 메모리에 적재되어 있지 않은 경우, page fault 인터럽트가 발생하여 운영체제에게 전달된다. 

6. 운영체제는 page fault를 전달 받고 해당 페이지를 갖고 있는 프로세스에 접근하여 해당 페이지를 물리 메모리에 적재한다. 

7.  적재된 페이지에 대한 정보를 page table에 업데이트 한다. 

8. 이 후 CPU에게 해당 가상주소에 대한 데이터 검색을 다시 진행할 것을 요청한다.

9. CPU는 다시 한번 해당 가상주소에 대한 데이터를 요청한다.

10. MMU는 해당 가상주소를 page table에서 검색하여 물리 주소를 찾아 데이터를 CPU에게 반환한다. 

 

  (2) Supplemental Page Table이 왜 필요할까?

git book에서는 Page Fault를 관리하기 위한 Supplemental Page Table을 구현하라고 한다. 그럼 우리가 구현한 page구조체를 사용하지 않고 왜 Supplemental Page Table이라는 구조체를 하나 더 만들어 복잡하게 하는 걸까?  이유는 다음과 같다. (출처 :http://black0out.egloos.com/232603)

 

  • 여러 page-table entry가 같은 하나의 physical address를 가리키고 있지만, 다른 page-table entry도 같은 physical address를 가르킬 수 있다. 왜냐햐면 page-table은 page-directory-entry마다 하나씩 가지고 있고, 서로 다른 virtual address를 가지지만 같은 physical memory를 참조하는 경우가 충분히 발생할 수 있기 때문이다. referencing하고 있는 table들은 전부 다르지만, 결국 같은 physical address를 가르키고 있는 것이다. 이러한 경우를 다루기 위해서는 하나의 프로세스가 어떠한 physical memory를 참조하고 있는지에 대한 정보가 필요하고, 이를 위해서 추가적인 page table이 필요한 것이다.
  • 기존의 page-table은 physical memory를 향한 일방적인 pointing에 불과하다. 때문에 physical-memory의 값이 바뀌어 있으면 패닉에 빠질 수 밖에 없다. 기존에 어떠한 데이터가 있는지에 대한 정보를 전혀 가지고 있지 않기 때문에 이러한 문제가 발생하면 해결할 수가 없다. 따라서 supplementary page table에는 원래 physical-memory에 들어가 있어야 할 데이터가 어떤 것인지에 대한 정보를 가지고 있어야 한다.
  • resource-free를 할 때에 어떠한 데이터를 FREE할지를 결정하는데에 사용된다. 두 번째 이유에서 설명한 것을 바탕으로 충분히 직관적인 이해를 할 수 있으리라 본다.

 

 

 

 

 

03.  JUNGLE_PINTOS PROJECT3: VIRTUAL MEMORY  질문

 (1) Q. git book에서 나오는 user pool과  kernel pool은 가상메모리영역인가요?

      A.  user pool과 kernel pool은 물리 메모리에서 나뉘는 메모리 영역입니다. Pintos의 경우 전체 physical memory를 50:50으로 나누어서 user pool과 kernel pool로 지정해 놓았습니다."Obtains a single free page and returns its kernel virtual address"에서 "kernel virtual address"를 설명하려면 우선 pintos에서 virtual memory를 설명해야 합니다. 그림에 보이듯이 virtual memory에서 KERN_BASE (PHYS_BASE라고 보이는데 이것은 구버전 pintos 기준입니다) 위의 영역은 커널만 접근할 수 있는 virtual address이며, 이 부분의 매핑은 (virtual address) - KERN_BASE = (physical address) 라는 매우 단순한 1:1 매핑이 되어 있습니다. 그러므로 palloc.c에 적혀 있는 설명에서 returns its kernel virtual address 라는 말은, physical address에서 KERN_BASE 만큼 더한 값을 리턴한다는 뜻이고, 그러므로 page in/out(swap in/out)이 필요한 virtual page를 할당하는 것이 아니라 바로 접근이 가능한 physical page를 할당해준다고 생각하시면 됩니다.

 

 Q.  palloc_get_page()로 physical page를 할당해준다고 하셨는데 그렇다면 virtual page라는 것을 어떻게 할당이 되는 것인지 궁금합니다

A. 그것은 lab3에서 구현하셔야 할 일입니다. virtual page는 말 그대로 "가상의" page 이므로, pintos 내의 어딘가에 특정 프로세스가 virtual page를 할당했다는 사실을 저장할 수 있는 구조체 (supplemental page table)를 만들어서 거기에 virtual page의 존재 여부를 기록하시는 것이 virtual page를 할당하는 것입니다. 어디까지나 "가상의" page이므로 실제로 접근 가능한 "physical" page를 할당하는 것과는 별개라는 사실에 주의하시면 좋을 것 같습니다.

Physical memory(Pintos)

 

(2) Segment register에 저장된 Segment Selector를 통해 GDT에서 해당 Segment의 BaseAddress를 확인하고 Offset을 더해 Linear Address를 계산하고 있는데, 이 과정이 언제 일어나는 것인가요? 저희가 지금 다루고 있는 virtual memory의 address는 결국 Linear Address 인 건가요??

  1. x86_64 CPU에서 64비트 코드를 실행시킬 때는 segmentation이 주소 변환 역할을 하지 않습니다.
    👉 x86 CPU에서 32비트 코드를 실행하거나, x86_64 CPU에서 32비트 코드를 호환 모드로 실행할 때는  segmentation이 의미를 가집니다. 그러나 pintos-kaist에서는 이 부분을 고려하실 필요가 없습니다.

    👉 몇 가지 메모리 보호 메커니즘을 위해 GDT에 있는 정보가 사용되기는 하는데, 이부분은 Pintos-kaist가 다루는 범위 밖에 있습니다.
  2. 따라서 x86_64에서 virtual address == linear address입니다.

https://nixhacker.com/segmentation-in-intel-64-bit/

 

Segmentation in Intel x64(IA-32e) architecture - explained using Linux

In this article we will go through Segmentation in basic and cover it for x64 (IA-32e) processors by extracting the details inside a Linux system.

nixhacker.com

 

04.  JUNGLE_PINTOS PROJECT3: VIRTUAL MEMORY  하면서 배웠던 것들

    (1) Segment ?

Segment은 접근 할 수 있는 메모리 양을 늘리기 위해서 도입되었다. CPU는 16비트 주소만 사용할 수 있어 접근할 수 있는 양이 64KB로 제한됐다. 64KB보다 더 많이 접근하기 위해 세그먼트 레지스터들이 추가 되었고, 각 세그먼트 레지스터는 오프셋 주소를 담는다. 

 

CPU는 메모리 접근 방식에 따라 세그먼트 레지스터를 자동으로 선택한다. 명령어를 가지고 올때는 코드 세그먼트를 사용하고 스택연산을 할 때에는 스택 세그먼트를 사용한다. 다른 명령어는 데이터 세그먼트나 여분 세그먼트를 사용한다. Segment Fault는 세그먼트 사용 시스템에서 불법적인 주소 접근 시 발생한다.

Pintos에서 Segment는 연속된 페이지 그룹을 뜻한다.

 

    (2) VIRTUAL MEMORY

가상 메모리는 물리적 저장장치에서 메모리 주소를 추상화하는 것이다. 하지만 아래처럼 가상메모리와 물리메모리를 매핑하게 되면, 파편화의 문제가 발생한다. 가상메모리를 할당할 충분한 공간이 있음에도 이전에 연속적으로 할당해준 메모리 때문에 사용할 수 있는 메모리를 할당하지 못하고 남은 공간을 사용하지 못하는 것이다. 

 

가상 메모리를 구현하기 위해서는 컴퓨터가 특수 메모리 하드웨어를 갖추고 있어야한다. 이 하드웨어는 MMU(Memory Management Unit)이라고 부른다. MMU가 없이는 CPU가 RAM에 접근할 때 실제 RAM의 위치가 절대 변경되지 않기 때문에 주소값은 RAM에서도 동일한 물리주소를 가지게 된다. 

 

MMU를 사용하는 경우 각 메모리에 접근하기 이전에 메모리 주소 번역 작업을 수행한다. 즉 메모리 주소 123은 한번은 물리 주소 82043으로 지정되었다가 다음에는 물리주소 20489로 지정될 수 있다는 것을 의미한다. 그러나 수억 바이트에 이르는 메모리를 하나씩 가상 주소에서 물리적 주소로 번역하게 되면 작업 부하가 너무 높아지므로 MMU는 RAM을 페이지로 나누어 각 페이지를 독립된 항목으로 처리한다, 

 

 

 

 

   (3) PAGING

세그멘테이션에서 보았듯이, 가변 크기의 조각들로 분할하는 것은 외부 단편화가 일어날 수 있다. 따라서 프로세스의 주소공간을 몇개의 가변 크기의 논리 세그먼트로 나누는 것이 아니라 고정 크기의 단위로 나눈다. 이 각각의 고정 크기의 단위를 page라고 부른다. 이에 상응하여 물리 메모리도 페이지 프레임이라고 불리는 고정 크기의 슬롯의 배열로 구성되어 있다. 이 프레임 각각은 하나의 가상 메모리 페이지를 저장할 수 있다. 

 

 각 가상페이지에 대한 물리 메모리 위치 기록을 위하여 운영체제(커널)는 프로세스마다 페이지테이블(page table)이라는 자료구조를 유지한다. 프로세스가 실행 될 때, CR3(레지스터)에 해당 페이지 테이블의 주소를 작성하면, MMU가 해당 페이지 테이블을 타고 들어가  페이지 테이블의  PTE를 찾아 물리 주소를 가져온다. 즉 PTE에는 물리주소가 적혀있고, MMU는 해당 물리주소를 찾아오는 역할을 한다.

 

  1) 페이징의 장점

페이징을 사용하면 프로세스의 주소 공간 사용방식과는 상관없이 효율적으로 주소 공간 개념을 지원 할 수 있다. 예를 들어, 힙과 스택이 어느 방향으로 커지는가, 어떻게 사용되는가에 대한 가정을 하지 않아도 된다.  또 다른 장점은 페이징이 제공하느 빈 공간 관리의 단순함이다. 

 

 (4) PML4

 

 

    (3) Swap Space

디스크에 페이지들을 저장할 수 있는 일정 공간을 스왑 공간(Swap space)라고 한다. 스왑 공간이라고 불리는 이유는 메모리에 페이지를 읽어서 이곳에 쓰고(swap out) 여기에서 페이지를 읽어 메모리에 탑재(swap in)시키기 때문이다. 스왑 공간의 입출력 단위는 페이지라고 가정한다. 운영체제는 스왑 공간에 있는 모든 페이지들의 디스크 주소를 기억해야한다. 

반응형

댓글