4. 운영모드와 메모리 관리기법

x86과 x86-64프로세서에서 지원하는 메모리관리 기법은 크게 두가지이다.(세그먼테이션과 페이징)

  • 세그먼테이션
    • 우리가 전체역역을 원하는 크기로 분할하여 관리하는 것
  • 페이징
    • 지정 단위로 잘린 영역을 모아 원하는 크기를 만들어 관리하는 방식

메모리 관리기법을 사용하려면 관련 레지스터에 특정한 자료구조를 설정해야 한다.
세그먼테이션은
세그먼테이션 레지스터에 시작주소 혹은 Descriptor라고 불리는 자료구조의 위치를 설정해야한다.
페이징은
컨트롤 레지스터에 CR3레지스터에 Page directory라고 불리는 자료구조의 물리주소를 설정해야 사용할 수 있다.

리얼모드의 메모리 관리방식

  • 리얼모드는 최대 1MB까지 주소공간을 사용하며 세그먼테이션만 지원한다.
  • 리얼모드에서 세그먼트 크기는 64k로 고정
  • 세그먼트의 시작 어드레스는 세그먼트 레지스터에 직접 설정해야 한다.
  • 세그먼테이션에서 세그먼트의 시작 어드레스는 코드나 메모리에 접근할 때 기준 어드레스(Base address)로 사용됨

<리얼모드의 세그먼트 레지스터와 세그먼트, 몰리주소의 관계>


그림의 세그먼트레지스터 ES와 DS가 0x0200으로 되어있음. 16을 곱하면 0x2000이 된다.
그림의 밑에서 두번째 블럭(64K데이터)의 범위를 보면 0x2000 ~ 0x2fff인데 0x2fff-0x2000=0x0fff인데 이는 64k의 크기가 안된다.
범위가 0x2000 ~ 0x2fff이면 그림의 첫번째 블럭(64k 코드)부분의 영역과 겹치게 됨
그림이 이상한건지 내가 모르는게 있는 건지

  • 리얼모드에서는 세그먼테이션을 거쳐 나온 어드레스가 바로 물리주소가 됨
  • 리얼모드의 세그먼테이션은 세그먼트 레지스터의 값에 범용 레지스터의 값을 더하는 방식으로 동작함

<세그먼트 레지스터에 0x1000, 범용 레지스터에 0x1234가 설정되었을 때 물리주소를 계산하는 방법>

  • 세그먼트의 크기가 64KB인 이유는 바로 범용 레지스터의 크기 때문
  • 16비트 프로세서에는 32비트 레지스터가 없으며 범용레지스터는 모두 16비트 크기 따라서 16비트로 접근할 수 있는 범위가 0~0xffff이므로 세그먼트 크기도 64kb가 된 것

  • 보호모드 역시 같은 방식으로 세그먼트의 기준주소에 범용레지스터를 더해 계산함.
    다만, 페이징이 추가되어서 계산 결과는 논리주소로 바뀌었고, 논리주소는 페이징을 거쳐 물리주소로 바뀌게 됨.

보호모드의 메모리 관리 방식

  • 보호모드는 세그먼테이션과 페이징을 모두 지원함
  • 보호모드의 세그먼테이션은 디스크립터 자료구조의 위치(offset)를 설정하는 방식
  • 세그먼트 레지스터의 명칭도 세그먼트 셀렉터로 변경됨
  • 디스크립터는 메모리영역의 정보를 저장하는 자료구조로 여러 종류가 있음
  • 그중 세그먼트에 대한 정보를 나타내는 디스크립터를 세그먼트 디스크립터라고 부름

  • 세그먼트 디스크립터에는 세그먼트의 시작 어드레스와 크기, 권한, 타입등의 정보가 있음

<세그먼트 디스크립터의 구조>

  • 세그먼트 디스크립터에 포함된 특권레벨(DPL, Descriptor privilege level)은 해당 세그먼트에 접근하기 위한 최소한의 권한을 나타냄 숫자가 작을 수록 높은 권한이다.
  • 보호모드에서는 세그먼트 디스크립터의 위치를 가르킴
  • 세그먼트 디스크립터는 GDT(Global descriptor table)라고 불리는 곳에 모여있다.
  • GDT는 연속된 디스크립터의 집합
  • GDT 위치와 관련된 reg. 는 GDTR이다.
    • 16bit GDT size 필드와 32bit base addr필드로 구성된 자료구조의 물리주소를 넘겨 받는다.
    • processor는 이값을 가지고 있다가 segment selector를 통해 addr에 접근할 때마다 GDT의 위치를 찾는데 참조한다.

  • 선형주소와 물리주소가 1:1로 대응하도록 설정
  • 메모리구조는 최대한 간단하게 유지하는 편이 좋다

아래그림은 세그먼테이션과 페이징을 통해 논리주소->물리주소로 변환하는 과정

  • 3단계 페이징은 선형주소(논리주소)를 directory, table, offset 3부분으로 나누며 물리메모리를 4kb 페이지로 나누어 관리하는 방식


-> 나온 선형주소에서 table(물리적인 공간, 메인메모리에 위치)에 있는 entry(32bit 주소)로 접근해서 entry로 다음 table의 기준주소를 정함

  • 프로세서가 페이징처리 과정에서 table을 사용하려면 우리가 직접위치를 알려줘야함
  • CR3 control reg.는 페이지 디렉터리의 시작주소를 가르킨다.
  • 페이지 디렉터리 엔트리의 위치계산에 사용됨

  • 선형주소는 디렉터리 오프셋 10bit, table offset 10bit, page offset 12bit로 구분
  • 2^12 = 2^2 * 2^10 = 4k

  • page directory entry = 다음에 위치하는 page table의 start address
  • page table entry = 다음에 위치하는 page의 start address
    • 선형주소의 offset = 물리주소
  • 아래 그림 참고

IA-32e 메모리관리

IA-32e모드의 segmentation은 보호모드의 segmentation과 차이가 거의없음

  1. segemnt descriptor에 설정된 기준주소와 크기에 관계없이 모든 segment가 기준주소는 0, 크기는 64bit전체로 설정.
    따라서 기준주소가 segment를 구분하지 않는다.
  2. 두가지 서브모드를 지원하므로 code segment descriptor에 L필드가 추가로 있음.
    0이면 호환모드, 1이면 64bit모드.

IA-32e모드의 페이징은 64bit 주소공간이므로 PAE기능이 기본으로 활성화
변환단계도 4kb 페이지는 5단계, 2mb페이지는 4단계
그로인해 새롭게 추가된 table: page map level 4 (PML4) table, page directory pointer table(PDPT)
PAE기능이 뭔지 모르겠다.

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

6. Bootloader 만들기  (0) 2019.07.11
5. 부팅과 부트로더  (0) 2019.07.11
3. 운영모드와 레지스터  (0) 2019.07.11
2. 운영모드  (0) 2019.07.11
1. ubuntu18.04.2 LTS개발환경 세팅  (0) 2019.07.11

+ Recent posts