Search

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

대분류
CS
소분류
OS
유형
메모리 관리
세그먼테이션
주요 레퍼런스
https://velog.io/@wimes/운영모드와-메모리-관리기법
https://hippogrammer.tistory.com/127
https://byuljong.tistory.com/92
http://egloos.zum.com/miooim/v/57175
최종 편집 일시
2024/10/27 15:51
생성 일시
2022/04/03 06:36
14 more properties

1. x86과 x86-64 프로세서메모리 관리 기법

세그먼테이션(Segmentation)과 페이징(Paging) 지원
→ 세그먼테이션 : 세그먼트 레지스터에 어떠한 세그먼트의 시작 주소 혹은 디스크립터(Descriptor)라고 불리는 자료구조의 위치를 설정
→ 페이징 : 컨트롤 레지스터 중에 CR3 레지스터에 페이지 디렉터리라고 불리는 자료구조의 물리 주소를 설정해야 사용 가능
세그먼테이션과 페이징의 공통점
주소 공간을 특정 영역으로 분할
세그먼테이션과 페이징의 차이점
세그먼테이션 : 전체 영역을 사람이 원하는 만큼의 크기로 나누어 관리하는 방식 (케이크를 잘라먹는 것에 비유)
페이징 : 일정한 크기로 잘라져 있는 조각들을 사람이 원하는 만큼 모아서 원하는 크기로 관리하는 방식 (미리 잘라져 있는 식빵에 비유)
메모리 관리 기법(세그먼테이션, 페이징 등)을 사용하려면 관련된 레지스터에 특정한 자료구조를 설정
모든 운영 모드에서 메모리 관리 기법(세그먼테이션, 페이징 등)을 지원 X
모드에 따라서 지원하지 않거나, 지원하더라도 일부 기능이 제한되는 경우 존재
같은 메모리 관리 기법이라 하더라도 모드에 따라 각 필드들의 의미가 달라지는 경우 존재
x86-64 프로세서가 기존의 프로세서들과의 호환성을 위해 유지되면서 발전되었기 때문

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

리얼 모드에서는 최대 1MB까지의 메모리 주소 공간을 사용할 수 있으며, 메모리 관리 기법으로는 세그먼테이션(Segmentation)만 지원, 페이징 사용 X
한 세그먼트의 크기는 64K로 고정이며, 세그먼트의 시작 주소는 세그먼트 레지스터에 직접 설정
세그먼테이션에서 세그먼트의 시작 주소는 코드나 메모리에 접근할 때 기준이 되는 주소로 사용
<그림 1> 세그먼트 레지스터와 세그먼트, 물리 주소의 관계
리얼 모드의 물리 주소로 변환하는 방식
세그먼테이션을 거쳐 나온 주소 → 물리 주소
리얼 모드의 세그먼테이션은 세그먼트 레지스터의 값에 범용 레지스터의 값(또는 상수 값)을 더하는 방식
1.
세그먼트 레지스터의 값에 범용 레지스터의 값을 더하는 것만으로는 세그먼트 레지스터와 범용 레지스터의 크기가 16bit 이기 때문에 리얼 모드에서 사용할 수 있는 최대 1MB 영역까지 접근 X
그먼트 레지스터의 값 + 범용 레지스터의 값(또는 상수 값) ≠ 물리 주소
세그먼트 레지스터의 값에 16을 곱한 값을 세그먼트의 기준 주소로 사용
세그먼트 레지스터의 값 x 16 = 세그먼트의 기준 주소
1MB에 접근할 수 있는 이유 : 16bit의 최댓값인 65535(2^16-1)   x  16(2^4) = 1048560(2^20-16)이므로 1MB에 근접
2.
리얼 모드에서 물리 주소 계산법
세그먼트 레지스터의 기준 주소 + 범용 레지스터의 값(또는 상수 값) = 물리 주소
<그림 2> 리얼 모드에서 물리 주소 계산법

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

세그먼테이션(Segmentation)과 페이징(Paging) 모두 지원
보호모드의 물리 주소로 변환하는 방식
세그먼트의 기준 주소 + 범용 레지스터의 값(또는 상수 값) 계산 이후 선형 주소(논리 주소)로 변경 후 페이징(Pagi7ng)한 결과 값 = 물리 주소
1.
세그먼트의 기준 주소 + 범용 레지스터의 값(또는 상수 값) = 선형 주소(논리 주소)
2.
선형 주소(논리 주소) -> 페이징 -> 물리 주소
보호 모드의 세그먼테이션세그먼트 레지스터에 세그먼트 기준 주소를 직접 설정하지 않고, 세그먼트 디스크립터의 위치(Offset)를 설정하는 방식
보호 모드에서 세그먼트 레지스터의 명칭은 세그먼트 디스크립터를 선택한다는 의미로 세그먼트 셀렉터로 변경
<그림 3> 세그먼트 디스크립터 필드
세그먼트 디스크립터
메모리 영역의 정보를 저장하는 자료구조, 그중 세그먼트에 관련된 정보(시작 주소와 크기권한(Privilege)타입(Type) 등)를 나타냄
최대 8192개의 디스크립터를 포함 가능, 연속된 디스크립터의 집합체이자 테이블 형태의 자료구조인 GDT(Global Descriptor Table)에 모여있고 세그먼트 셀렉터(세그먼트 레지스터)는 세그먼트 디스크립터의 위치를 가리키는데 사용
GDT는 프로세서한테 GDT의 위치를 직접 알려야 하고 GDT의 위치와 관련된 레지스터는 프로세서 내의 컨트롤 레지스터들 중 GDTR(Global Descriptor Table Register) 레지스터이며 16bit GDT 크기 필드와 32bit 기준 주소 필드로 구성된 자료 구조의 물리 주소를 넘겨받음
프로세서는 GDT의 위치를 빠르게 넘기기 위해 이를 내부에 저장해두었다가 세그먼트 셀렉터(세그먼트 레지스터)를 통해 주소에 접근할 때마다 GDT의 위치를 찾는데 이용
프로세서는 실제 메모리에 접근할 때 선형 주소(논리 주소)를 기반으로 물리 주소를 계산
보호 모드에서는 리얼 모드에서와는 달리 세그먼트의 크기가 64KB로 고정되어 있지 않아 크기 지정 가능
세그먼트의 크기는 해당 세그먼트의 주소에 접근할 때 이용되며 기준 주소에 더해질 값(범용 레지스터의 값 또는 특정 상수 값)은 세그먼트의 크기(세그먼트 디스크립터에 정의한 크기) 초과 금지
<그림 4> 보호 모드의 세그먼트 셀렉터(레지스터), 세그먼트 디스크립터, 선형 주소의 관계
보호 모드에서 세그먼테이션을 거쳐 나온 선형 주소는 물리 주소와 일치할 수도, 일치하지 않을 수도 있다.
선형 주소는 페이징 기법의 입력 값이 되며, 페이징을 사용하지 않는다면 선형 주소는 물리 주소와 1:1로 대응
작고 간단한 OS는 대부분 페이징을 사용하지 않거나, 사용은 하되 선형 주소와 물리 주소가 1:1로 대응하도록 함
선형 주소와 물리 주소가 1:1로 대응되면, OS의 관리 기능을 작고 가볍게 유지가능, 메모리 구조가 직관적 → 디버깅이 편함
<그림 5> 선형 주소와 물리 주소의 1:1 대응
32-bit offset에서 32-bit linear address(32-bit 선형 주소) = 물리 주소
페이징(Paging) 기법
<그림 6> 세그먼테이션과 페이징의 관계
물리 메모리를 페이지(Page)라고 불리는 일정한 크기로 나누고, 나눠 놓은 페이지로 선형 주소와 물리 주소를 연결하는 방식
페이징 기법을 이용 시 디버깅 난이도 상승, 하지만 실제 물리 메모리보다 선형 주소의 영역이 더 크더라도 물리 페이지만 잘 연결하면 사용이 가능하기에 공간을 더 많이 사용 가능
같은 물리 페이지를 여러 선형 주소에 연결하여 응용프로그램끼리 공유하는 메모리를 쉽게 처리
반대로 페이징 자료구조를 따로따로 생성 후 물리 메모리에 중복되지 않게 연결해줌으로써 응용 프로그램마다 독립적인 주소 공간을 보장 가능
최신 OS는 이러한 기능 이용하여 응용프로그램에 독립된 주소 공간 보장, 공유 메모리, 요구 페이징, 공유 라이브러리 등의 기능 구현
보호 모드에서 페이지 크기에 따른 페이징의 두 가지 방식
물리 메모리를 4KB 크기의 페이지로 분할 후, 선형 주소를 3단계로 구분 방식
물리 메모리를 4MB 크기의 페이지로 분할 후, 선형 주소를 2단계로 구분 방식
프로세서에서 지원하는 물리 주소 확장 기능을 사용한 4가지 방식
기존 위의 두 가지 방식
물리 메모리 4K 크기의 페이지로 분할 후, 선형 주소를 4단계로 구분 방식
물리 메모리 2MB 크기의 페이지로 분할 후, 선형 주소를 3단계로 구분 방식
※ 물리 메모리를 4KB 크기의 페이지로 분할 후, 선형 주소를 3단계로 구분하는 방식(이하 3단계 페이징)
3단계 페이징 : 선형 주소를 디렉터리, 테이블, 오프셋 이렇게 세 부분으로 분할하며 물리 메모리를 4KB 크기의 페이지로 나누어 관리하는 방식
생성되어 있는 선형 주소의 정보를 이용하여 선형 주소의 디렉터리와 테이블 부분은 각각 페이지 디렉터리와 페이지 테이블에 있는 엔트리의 위치를 나타내고
페이지 디렉터리와 페이지 테이블은 GDT와 마찬가지로 메모리 공간에 있는 자료구조이기 때문에 해당 테이블을 사용하려면 직접 위치를 알려줘야 하는데 페이징에서는 컨트롤 레지스터들 중 CR3 레지스터를 사용하고, 페이지 디렉터리의 시작 주소를 가리키며, 페이지 디렉터리 엔트리의 위치 계산에 사용
<그림 7> 페이지 디렉토리/테이블 엔트리
페이지 디렉터리 엔트리와 페이지 테이블 엔트리 크기 = 4byte
페이지 크기는 최소 4KB이기 때문에 페이지 디렉터리 엔트리페이지 테이블 엔트리 모두 bit 0 ~ bit 11까지는 속성 필드로 사용되고 bit 12 ~ bit 31까지는 기준 주소를 나타내는 데에 사용
→ 위의 속성 필드들 중 U(bit 2 ~ bit 3) 필드는 해당 페이지에 접근할 수 있는 권한을 나타내며 0과 1로 설정 가능
0 : 유저 애플리케이션 레벨(3)을 제외한 모든 레벨에서 접근 가능.
1 : 유저 애플리케이션 레벨 이상에서 접근 가능함을 의미함으로써 모든 레벨에서 접근 가능
페이지와 세그먼테이션의 보호 기능을 조합하면 메모리 모델은 단순하게 유지하면서 커널 영역과 유저 영역을 구분 가능
<그림 8> 보호 모드의 3단계 페이징과 어드레스 변환과정, 보호 모드에서 선형 주소의 구조
 최상위 비트부터 디렉터리 오프셋 10bit테이블 오프셋 10bit페이지 오프셋 12bit
디렉터리와 테이블의 오프셋이 10bit → 페이지 디렉터리와 페이지 테이블 엔트리 수는 총 1024(2^10) 개
페이지 오프셋은 4KB 크기인 페이지의 오프셋을 나타내기 위해 12bit → 최댓값이 4KB(4096, 2^12)
디렉터리 엔트리의 값 = 다음에 위치하는 페이지 테이블의 시작 주소
페이지 테이블 엔트리 값 = 다음에 위치하는 페이지의 시작 주소
페이지의 시작 주소 값 + 선형 주소의 오프셋 = 물리 주소
→ 선형 주소에서 물리 주소를 구하는 과정 (그림 8 참고)
1.
CR3 레지스터에 설정된 주소로 페이지 디렉터리의 시작 주소를 찾는다.
2.
페이지 디렉터리의 시작 주소에 선형 주소의 디렉터리 오프셋을 이용하여 해당 디렉터리 엔트리를 찾는다.
(디렉터리 엔트리에 설정된 값이 페이지 테이블의 시작 주소)
3.
페이지 테이블의 시작 주소에 선형 주소의 테이블 오프셋을 이용하여 해당 페이지 테이블 엔트리를 찾는다.
(페이지 테이블 엔트리에 설정된 값이 4KB 페이지의 시작 주소)
4.
페이지의 시작 주소에 선형 주소의 페이지 오프셋 값을 더하여 실제 물리 주소로 변환한다.

4. IA-32e 모드의 메모리 관리

IA-32e 모드의 서브 모드 중 32bit 호환 모드는 보호 모드와 동일한 동작이므로 본 글은 64bit 모드 설명이다.
IA-32e 모드의 64bit 모드(이하 IA-32e 모드)는 64Bit이므로 사용할 수 있는 메모리 최대 주소 값이 16EB(Exa Byte, 2^64)됨, 따라서 보호 모드의 2^32 보다 10억 배 이상의 공간이 사용 가능함.
IA-32e 모드의 세그먼테이션은 세그먼트 디스크립터에 설정된 기준 주소와 크기에 관계없이 모든 세그먼트가 기준 주소는 0이고, 크기는 64bit 전체로 설정됨.
≠ 보호 모드의 세그먼테이션
보호 모드에서 사용하던 세그먼트 디스크립터는 32bit 어드레스만 저장하게 설계되었기 때문에 64bit 어드레스 지원을 위해서 디스크립터를 확장하지 않고 강제로 값을 고정함.
IA-32e 모드에서는 위의 방식을 사용하지 않기에 OS를 설계할 때 IA-32e 모드에서는 선형 주소를 기준 주소가 다른 여러 개의 세그먼트로 구분할 수 없음을 고려해야 한다.
IA-32e 모드는 32bit 호환 모드와 64bit 모드 이렇게 두 가지의 서브 모드가 존재하므로 이를 구분하기 위해 코드 세그먼트 디스크립터에 L 필드(bit21)가 추가됨.
L 필드를 0으로 설정하면 32bit 호환 모드로 동작하고, 1로 설정하면 64bit 모드로 동작하기에 굳이 보호 모드로 돌아가지 않고도 32bit 코드를 실행할 수 있는 것
<그림 9> IA-32e 64bit 모드에서 세그먼트 셀렉터, 세그먼트 디스크립터, 선형 주소의 관계
※ IA-32e 모드의 서브 모드가 32bit 호환 모드일 경우에는 어드레스 변환 방식이 보호 모드와 같다.
IA-32e 모드의 페이징은 주소 공간이 64bit로 늘어났으므로 PAE(물리 주소 확장 기능, Physical Address Extension) 기능이 자동으로 활성화된다.
PAE 기능 : 4GB 이상의 물리 메모리를 32bit mode에서 사용할 수 있도록 하는 기능
주소 공간이 늘어났기 때문에 기존의 4KB 크기의 페이지는 5단계로, 2MB 크기의 페이지는 4단계로 변경
위의 과정으로 선형 주소에 새롭게 추가된 테이블
PML4(페이지 맵 레벨 4, Page Map Level 4 Tabel)
PDPT(페이지 디렉터리 포인터 테이블, Page-Directory-Pointer-Table)
<그림 10> IA-32e 모드에서 5단계 페이징과 어드레스 변환 과정
변환 과정 요약
1.
CR3 레지스터에서 PML4의 시작 주소 추적
2.
PML4의 시작 주소에 선형 주소의 PML4 오프셋을 이용하여 해당 PML4 엔트리 추적
PML4 엔트리에 설정된 값이 PDPT(페이지 디렉터리 포인터 테이블)의 시작 주소
3.
PDPT의 시작 주소에 선형 주소의 디렉터리 포인터 오프셋을 이용하여 디렉터리 포인터 엔트리 추적
디렉터리 포인터 엔트리에 설정된 값 = 페이지 디렉터리의 시작 주소
4.
페이지 디렉터리의 시작 주소에 선형 주소의 디렉터리 오프셋을 이용하여 해당 디렉터리 엔트리 추적
디렉터리 엔트리에 설정된 값 = 페이지 테이블의 시작 주소
5.
페이지 테이블의 시작 주소에 선형 주소의 테이블 오프셋을 이용하여 페이지 테이블 엔트리 추적
페이지 테이블 엔트리에 설정된 값 = 4KB 페이지의 시작 주소
6.
페이지의 시작 주소에 선형 주소의 페이지 오프셋 값을 더하여 실제 물리 주소로 변환
IA-32e 모드와 보호 모드의 변환 과정 차이점
각 테이블의 인덱스(위치)가 9bit로 줄어들어 엔트리의 개수가 512(2^9) 개로 축소
선형 주소 중 bit 48 ~ bit 63 까지는 부호 확장으로 채워지고, 실제로 변환에 사용되는 부분은 bit 48까지이며, 최대로 표현 가능한 주소 범위가 256TB(2^48) (그림 10 참고)
64bit 테이블 엔트리
<그림 11> 64bit 페이지 테이블 엔트리
<그림 11 -1> 한글
선형 주소의 48bit 모두가 물리 주소로 변환되진 않고, 프로세서가 40bit의 물리 주소를 지원하는 경우에만 최대 1TB(2^40)의 물리 메모리를 사용
bit 40 ~ bit 51 까지는 모두 0으로 예약bit 0 ~ bit 39까지 총 40bit 물리 메모리 사용가능
40bit 물리 메모리를 지원하는 프로세서는 대부분 서버용 프로세서이기 때문에 일반 PC에서 사용하는 프로세서는 보통 1TB 이하(64GB, 128GB 등)만 지원
일반 PC에서는 40bit의 어드레스만으로도 충분
IA-32e 모드의 페이지 엔트리는 64bit 어드레스 체제로 8byte로 증가 (그림 12 참고)
하위 4byte(bit 0 ~ bit 31)는 보호 모드와 구조 동일
상위 4byte(bit 32 ~ bit 63)는 기준 주소 필드(bit 32 ~ bit 39)예약된 영역(bit 40 ~ bit 51)임의로 사용 가능한 영역(bit 52 ~ bit 62)EXB(bit 63)로 구성
이 중 EXB 필드는 해당 페이지에서 명령어 실행 기능을 활성화 / 비활성화 가능