고위 메모리 영역

고위 메모리 영역 (High Memory Area, HMA)은 80286 이상의 시스템에서 FFFF:0010 ~ FFFF:FFFF 사이의 ( 64 KiB - 16 바이트 )의 크기를 가지는 물리 메모리 공간이다. 이 공간은 리얼 모드(8086 에뮬레이션)로 동작하는 80286 이상의 시스템에서 21번째 주소선(A20)을 활성화시켰을 때 접근할 수 있다.

인텔 8086/8088 세그먼테이션 구조의 한계 
인텔의 8086/8088 프로세서에서 선보인 세그멘테이션 구조는, 16비트 레지스터로는 최대 65,535 바이트 (2^16 바이트, 64 KiB) 밖에 접근할 수 없었던 한계를, 16비트의 세그먼트와 16비트의 오프셋의 조합으로 이루어진 세그먼트:오프셋 표기법으로, 최대 1,048,576 바이트(2^20 바이트, 1 MiB) 영역까지 확장하기 위한 메모리 관리기법이다. 이렇게 표현된 논리 주소를 (세그먼트) x 16 + (오프셋)의 식으로 계산하여 메모리의 특정 물리 주소에 접근할 수 있다.

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

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

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

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

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

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

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

따라서 FFFF:0010 ~ FFFF:FFFF 까지의 크기는 ( 64 KiB - 16 바이트 ) 가 된다.

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

A20 주소선을 제어하기 위해 A20 게이트 회로가 존재했는데, 초기에는 키보드 컨트롤러에서 사용되지 않는 핀을 활용하여 A20 주소선을 제어하도록 하였다. A20 핸들러라고 불리는 컨트롤러가 주소 지정 모드를 동적으로 바꿀 수 있었는데, 리얼모드에서 프로그램이 고위 영역 메모리에서 실행될 수 있게 하였다.

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

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

같이 보기 
 언리얼 모드
 기본 메모리
 상위 메모리 영역
 중첩 확장 메모리 규격 (EMS)
 연속 확장 메모리 규격 (XMS)

각주 

기억 장치
x86 메모리 관리