X86 메모리 분할

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색

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

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

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

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

리얼 모드 에서는 메모리상에 저장된 데이터의 종류에 따라 CS, DS, SS, ES 로 나뉘는데, 코드 세그먼트 (CS)는 현재 사용중인 프로그램의 코드가 저장된 세그먼트의 주소를 가르키고, 데이터 세그먼트 (DS)는 현재 프로그램이 사용중인 데이터가 저장된 세그먼트의 주소를 가르키며, 스택 세그먼트 (SS)는 현재 프로그램에서 사용중인 스택이 저장된 세그먼트의 주소를 가르키고, 확장 세그먼트(EXTRA segment) (ES)는 프로그래머에 의해 결정된다. 1985년 발표된 Intel 80386에는 FS 와 GS 라는 사용처가 정해지지 않은 두개의 세그먼트 레지스터가 추가되었다. 세그먼트 레지스터들은 운영 모드에 따라 사용 방법이 달라진다.[1]

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

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

리얼 모드[편집]

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

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

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

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

참조[편집]

  1. 인용 오류: <ref> 태그가 잘못되었습니다; Arch라는 이름을 가진 주석에 제공한 텍스트가 없습니다
  2. Intel Corporation (2004년). 《IA-32 Intel Architecture Software Developer's Manual Volume 1: Basic Architecture

같이 보기[편집]

External links[편집]