메모리 세그먼트

메모리 세그먼트 방식(Memory segmentation)은 메모리 보호를 수행하는 가장 일반적인 방법 가운데 하나이다. 또다른 방식으로는 페이징이 있다. 세그먼트를 사용하는 컴퓨터 시스템에서 메모리 위치를 참조하는 명령어 피연산자는 세그먼트와 그 세그먼트 안의 오프셋을 증명하는 값을 포함하고 있다.

이러한 이용은 인텔 8086, 인텔 8088과 같은 초기 x86 프로세서에 쓰인 메모리 세그먼트의 이용과 혼동해서는 안 된다.
왜냐하면 이들은 어떠한 보호 기능도 제공하지 않았기 때문이다. (어떠한 프로그램도 제한 없이 세그먼트에 쉽게 접근할 수 있었고 세그먼트는 64 KiB라는 고정 길이와 시작 위치로만 구성되어 있었다.) 인텔 80286 이후의 메모리 세그먼트 방식에는 보호 기능이 제공된다.

세그먼트 번역 
프로세서가 Logical Address를 번역하여 원하는 Linear Address에 참조하기 위해 사용하는 자료구조는 다음과 같다:

 Descriptors
 Descriptor Tables
 Selectors
 Segment Registers

Descriptors 
세그먼트에 대한 정보를 가지고 있는 64비트 크기의 자료구조이며, 세그먼트의 시작 주소, 세그먼트의 크기, 접근 권한, 세그먼트의 유형 등의 정보를 담고 있다. 전체 64비트 중 32비트는 세그먼트의 시작 주소(0~0xFFFFFFFF)를 가리킨다. 20비트는 세그먼트의 크기(0~4GiB)를 가리키며, 옵션에 따라 단위를 1Byte로 설정할 경우 최대 1MiB, 단위를 4KiB로 설정할 경우 최대 4GiB까지 설정할 수 있다.

Descriptor Tables 
8192(213)개의 Descriptors를 모아 둔 테이블이며, 이 테이블의 시작 주소는 GDTR(Global Descriptor Table Register) 또는 LDTR(Local Descriptor Table Register)에 저장된다.

Selectors 
Descriptor를 가리키는 16비트 크기의 자료구조이며, 전체 16비트 중 13비트는 Descriptor의 Index를 가리킨다. 1비트는 GDT(Global Descriptor Table)인지 LDT(Local Descriptor Table)인지를 결정한다(1이면 LDT, 0이면 GDT). 2비트는 접근 권한을 가리킨다. Segment Registers에 저장된다.

Linear Address에 접근 
Descriptors, Descriptor Tables, Selectors를 이용해 프로세서가 Linear Address에 접근하는 과정은 다음과 같다:

 Selector에 있는 Descriptor의 Index에 8을 곱한 후 GDTR 또는 LDTR 값을 더해 Descriptor의 주소를 얻는다.
 Descriptor에 있는 Base Address(세그먼트의 시작 주소)를 사용해 세그먼트의 시작 주소를 얻는다.
 세그먼트의 시작 주소에 Offset을 더해 원하는 데이터 주소를 얻는다.
 (페이징이 활성화되어 있는 경우 페이지 해석을 추가로 실행한다. 비활성화되어 있는 경우 바로 데이터에 접근한다.)

참고 문헌 
 IA-32 Intel Architecture Software Developer’s Manual Volume 3A: System Programming Guide
Copyright © 1997–2008 Intel Corporation
http://www.intel.com/products/processor/manuals/index.htm

 Intel 80386 Programmer's Reference Manual 1986
 Operating Systems: Internals and Design Principles by William Stallings
Publisher: Prentice Hall

같이 보기 
 데이터 세그먼트
 가상 주소 공간
 가상 메모리
 x86 메모리 세그먼트
 세그멘테이션 오류
 평면 메모리 모델

메모리 관리