X86 메모리 분할

x86 메모리 분할(x86 memory segmentation)은 인텔 x86 명령어 구조를 사용하는 컴퓨터에서 구현된 메모리 분할기법을 말한다.

메모리 분할은 1978년 발표된 인텔 8086에서 도입되어 프로그램이 메모리상의 640 KiB 이상을 사용할 수 있도록 하였다. 1982년 출시된 인텔 80286에서는 개량된 메모리 분할 기법이 도입되어, 가상 메모리와 메모리 보호를 지원할 수 있게 되었고, 이 시점부터 기존 8086에서 사용되던 기본 운영 모드는 리얼 모드로 이름이 바뀌고, 새롭게 보호 모드가 추가되었다.

이후에도 8086 프로세서의 하위 호환을 위해 리얼 모드에서 분할 기능을 제공하다가, 2003년에 발표된 인텔 x86-64 구조부터는 64 비트 모드에서 더 이상 분할 기법을 지원하지 않게 되었다.

리얼 모드와 보호 모드 둘다 실제 메모리 주소를 계산하기 위해 16 비트의 세그먼트 레지스터를 사용하였다.

리얼 모드에서는 메모리상에 저장된 데이터의 종류에 따라 CS, DS, SS, ES 로 나뉘는데, 코드 세그먼트 (CS)는 현재 사용 중인 프로그램의 코드가 저장된 세그먼트의 주소를 가리키고, 데이터 세그먼트 (DS)는 현재 프로그램이 사용 중인 데이터가 저장된 세그먼트의 주소를 가리키며, 스택 세그먼트 (SS)는 현재 프로그램에서 사용 중인 스택이 저장된 세그먼트의 주소를 가리키고, 확장 세그먼트(EXTRA segment) (ES)는 프로그래머에 의해 결정된다. 1985년 발표된 인텔 80386에는 FS 와 GS 라는 사용처가 정해지지 않은 두 개의 세그먼트 레지스터가 추가되었다. 세그먼트 레지스터들은 운영 모드에 따라 사용 방법이 달라진다."Intel 64 and IA-32 Architectures Software Developer's Manual", Volume 3, "System Programming Guide", published in 2011, Page "Vol. 3A 3-11", the book is written: "Every segment register has a “visible” part and a “hidden” part. (The hidden part is sometimes referred to as a “descriptor cache” or a “shadow register.”) When a segment selector is loaded into the visible part of a segment register, the processor also loads the hidden part of the segment register with the base address, segment limit, and access control information from the segment descriptor pointed to by the segment selector. The information cached in the segment register (visible and hidden) allows the processor to translate addresses without taking extra bus cycles to read the base address and limit from the segment descriptor."

세그먼트의 선택은 일반적으로 실행되는 기능에 따라 프로세서에 의해 결정된다. 예를 들면 명령어들은 코드 세그먼트에서 가져오는데(fetch), 스택에 넣고(push) 빼거나(pop) 스택의 데이터를 참조할때는 스택 세그먼트를 참조한다. 그 외에 모든 데이터에 대한 참조는 데이터 세그먼트를 사용한다. 확장 세그먼트는 문자열과 관련한 동작을 위해 사용된다.(예를 들면 MOVS 나 CMPS) FS 와 GS는 특별히 지정된 용도가 없다.

보통 명령어에 정해진 세그먼트가 기본으로 선택되지만, 사용하기를 원하는 세그먼트가 있을 경우, 명령어 형식에 세그먼트 접두사 바이트를 붙여 사용할 수 있다.

 리얼 모드 
섬네일|right|300px|리얼 모드의 메모리에서 세 개의 세그먼트 예시. 두 번째 세그먼트와 세 번째 세그먼트 사이에서 중첩이 발생한것을 알 수 있다.; 옥색으로 표시된 구간이 두 개의 세그먼트 셀렉터가 접근할 수 있는 구간이다.

리얼 모드나 가상 86모드에서는 세그먼트의 크기가 언제나 65,536 바이트이다. (16 비트 오프셋을 사용)

세그먼트 레지스터의 16비트 세그먼트 셀렉터(segment selector)는 20비트로 이루어진 선형주소의 최상위 16비트를 해석한 것이며, 나머지 네 개의 최하위 비트들이 모두 0인 부분까지 포함하여 세그먼트 주소라고 부른다.

세그먼트 주소는 리얼 모드 내에서 물리 주소와 동일한 선형 주소를 얻기 위해 16비트의 오프셋을 더하는데, 예를 들면, 세그먼트 주소 06EFh:1234h(접미사 "h"는 16진수를 의미)에서 세그먼트 셀렉터인 06EFh를 세그먼트 주소로 표현하면 06EF0h이고, 여기에 오프셋을 더하면 06EF0h + 1234h = 08124h(16진수) 와 같은 식으로 선형주소가 계산된다.

 같이 보기 
 인텔 메모리 모델

 각주 

 외부 링크 
  Home of the IA-32 Intel Architecture Software Developer's Manual
  The Segment:Offset Addressing Scheme

분류:x86 메모리 관리