고위 메모리 영역

위키백과, 우리 모두의 백과사전.
이동: 둘러보기, 검색
IBM PC 계열의 물리 메모리 영역, 노랗게 표시된 작은 공간이 고위 메모리 영역 이다.

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

Intel 8086/8088 세그먼테이션 구조의 한계[편집]

Intel 의 8086/8088 프로세서에서 선보인 세그멘테이션 구조는, 16비트 레지스터로는 최대 65,535 bytes (2^16 bytes, 64 KiB) 밖에 접근할 수 없었던 한계를, 16비트의 세그먼트와 16비트의 오프셋의 조합으로 이루어진 세그먼트:오프셋 표기법으로, 최대 1,048,576 bytes (2^20 bytes, 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  -- 세그먼트는 왼쪽으로 한번 쉬프트 한다.(이는 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 )에 대해서도 주소지정이 가능하게 되었다.

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

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

이는 단순히 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 같은 다른 요소들은 상위 메모리 에 불러올 수 있었다.

함께 보기[편집]

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