고위 메모리 영역

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색
IBM PC 계열의 물리 메모리 영역

고위 메모리 영역 (High Memory Area, HMA)은 80286 이상의 시스템에서 FFFF:0010 ~ FFFF:FFFF 사이의 ( 64 KiB - 16 바이트 ) 의 크기를 가지는 물리 메모리 공간이다.[1]

이 공간은 리얼 모드(8086 에뮬레이션)로 동작하는 80286 이상의 시스템에서 21번째 주소선(A20)을 활성화시켰을때 접근할 수 있다.

8086 에서 선보인 세그멘테이션 구조는 16비트의 세그먼트와 16비트의 오프셋의 조합으로 이루어져 있으며, 세그먼트:오프셋 과 같이 표현된다. 이렇게 표현된 논리주소를, (세그먼트) x 16 + (오프셋) 의 식으로 계산하여 메모리의 특정 물리주소를 가르킬 수 있다.

8086 (혹은 80x86 이후의 프로세서의 리얼모드) 에서의 세그먼트 크기는 64 KiB 로 동일하다. 여기서 오프셋이 64 KiB 사이를 지정할 수 있기 때문에, 세그먼트와 오프셋의 단위는 다르다. (세그먼트는 64 KiB 단위, 오프셋은 1 byte 단위)

본래 세그먼트 주소 지정방식은 8086 에서 16비트 레지스터와 20 비트의 주소선을 가지고 1 MiB 이내의 메모리 영역( FFFF:000F, 0xFFFFF, 1,048,575 ) 에 접근하기 위해 설계되었는데, 8086 은 20 비트의 주소선만을 가지고 있었기 때문에 20비트를 초과하는 영역에 대해서는 상위비트가 버려졌다. 이때문에 8086에서 접근 가능한 최대의 비트는 FFFF:000F 였다.

FFFF:000F 를 초과하는 FFFF:0010 를 예로 들면 다음과 같이 물리주소가 계산된다.

            0xFFFF0  -- 세그먼트는 왼쪽으로 한번 쉬프트 한다.(이는 0x4 를 곱한것과 같다.)
          +  0x0010  -- 오프셋
          ---------
           0x100000  (혹은 십진수 1,048,576)

이때 계산된 0x100000 에서, 20비트를 넘어가는 최상의 비트인 1 을 빼면 0x0, 즉 0000:0000 과 같게 된다.

8086 (혹은 A20 주소선이 비활성화 된 리얼 모드의 80x86 시스템에서) 세그먼트:오프셋 주소지정 방식으로 20비트의 절대주소를 넘어갈 경우, 이 한계를 넘는 번지는 처음으로 되돌아 가는 것이다. (이를 wrap around 라고 한다)

이후 출시된 80286 프로세서는 24 개의 주소선을 가지고 있었는데, 24개의 주소 버스가 제공되는 IBM_PC/AT 시스템에 장착될 경우, 21번째 주소선(A20)을 활성화하여 1 MiB 를 초과하는 영역( FFFF:0010, 0x100000, 1,048,576 )에 대해서도 주소지정이 가능하게 되었다.

이런 방식으로 20비트 이상의 메모리 영역을 지정할수 있게 되기 때문에, 그동안 8086 에서 버려졌던 FFFF:0010 이후부터 FFFF:FFFF 까지의 영역을 주소선이 20개 이상인 80x86 이후의 프로세서들은 리얼모드에서 모두 사용할 수 있게 되는것이고, 이렇게 사용 가능해진 HMA 의 공간에서 16비트가 빠지는 이유는, 굳이 A20 주소선을 활성화 시키지 않더라도 이미 FFFF:000F 까지는 접근이 가능했기 때문이다.

그래서 FFFF:0010 ~ FFFF:FFFF 까지의 크기는 ( 64 KiB - 16 bytes ) 가 된다.


이는 단순히 CPU 만 충족되는 문제가 아니었고, 메인보드의 주소 버스 크기와도 상관이 있었기 때문에 24개의 주소 버스가 제공되는 IBM_PC/AT 이후 기종에서 제대로 동작했다. 물론 기존 8086에서 동작하던 프로그램의 하위 호환성을 위해 20비트 주소선을 사용 할 수 있게 하였는데, 이것이 21번째 주소선인 A20 주소선 이다.

키보드 컨트롤러를 활용하여 A20 주소선을 제어하는 도식도

A20 주소선을 제어하기 위해 A20 게이트 회로가 존재했는데, 초기에는 키보드 컨트롤러를 활용하여 A20 주소선을 제어할 수 있었다. A20 핸들러라고 불리운 컨트롤러가 주소지정 모드를 동적으로 바꿀 수 있었는데, 리얼모드에서 프로그램이 1024–1088 KB 에서 실행될 수 있었다.

이 기법을 처음 차용한곳은 마이크로소프트 의 1988 년에 발표된 Windows/286 2.1 이었는데, HIMEM.SYS 장치 드라이버가 소개되었다.

1990년 발표된 DR-DOS 5.0 과 1991년 발표된 MS-DOS 도 운영체제의 일부를 HMA 공간에 올릴 수 있어 기본 메모리(혹은 상용 메모리라고 불리움) 에서 46 KiB 정도를 절약할 수 있었다. 장치 드라이버나 TSR 같은 다른 요소들은 상위 메모리 에 불러올 수 있었다.

함께 보기[편집]

  1. Overview of Memory-Management Functionality in MS-DOS