A20 Gate

최근 OS공부를 하면서 실습을 해보고 있는데요.(github.com/Luavis/PotatOS) 가장 무난한 platform이 x86이다 보니 x86으로 작성중입니다. 아직 보호모드로의 접근밖에 안되는 만든것도 아닌상태이지만 보호모드로 접근하고 나니 A20 게이트라는 특이한 기능을 보았습니다.

A20게이트는 21번째 address bus line에 있는 and gate를 말합니다. 문제는 이곳에 왜 and 게이트가 있는가입니다. IBM이 PC를 만들던 시절인 80년대를 거슬러 올라가면,

모델 이름 모델 번호 도입 날짜 CPU 기능
PC 5150 1981년 8월 8088 플로피 디스크나 카세트 시스템
XT 5160 1983년 3월 8088 내장 하드 드라이브가 표준으로 도입된 최초의 IBM PC.
XT/370 5160/588 1983년 10월 8088 시스템/370 메인프레임 에뮬레이션
3270 PC 5271 1983년 10월 8088 3270 터미널 에뮬레이션 추가
PCjr 4860 1983년 11월 8088 플로피 기반의 가정용 컴퓨터
PC 포터블 5155 1984년 2월 8088 플로피 기반의 포터블 컴퓨터
AT 5170 1984년 8월 80286 중간 속도의 하드 디스크
컨버터블 5140 1986년 4월 8088 마이크로플로피 노트북 포터블
XT 286 5162 1986년 9월 80286 느린 하드 디스크를 장착하였지만 메인보드에 장착된 메모리의 대기 상태가 0이다.

위의 표를 보면 AT라고 하는 기종을 기점으로 80286 CPU가 들어가는데요. 이때부터 32bit로 아키텍쳐가 넘어가기 때문에 address bus line이 기존의 20bit에서 32bit로 대폭 늘어나게 됩니다. 문제는 기존 20bit address line체제를 생각하고 구현한 프로그램들 때문이였습니다. 만약 8088을 사용하고 있는 XT CPU에서는 0xFFFF:0xFFFF(0x10FFEF)로 접근하게 되면 20bit를 오버플로우하게되어 실제 메모리 접근은 0xFFEF로 접근하게 됩니다. 이런 기법을 이용한 프로그램들과의 하위호환을 위하여 20번째 address bus line에 and gate를 달고 예전과 같은 매핑이 가능하도록 구현한 것입니다.

이는 굉장히 옛날 얘기이고 이미 이런 프로그램들은 없어졌기 때문에 이는 굉장히 문제가 됩니다. 1MB이상에서는 특정 부분이 규칙적으로 접근이 안되는 현상이 일어나기 때문입니다.

해결책

문제의 해결책은 A20 게이트를 활성화 시켜주면 모든게 해결되고 이 문제를 해결하기 위해서는 세가지의 방법이 있습니다.

  • 키보드 컨트롤러
  • 시스템 컨트롤 포트
  • BIOS function call

BIOS를 이용하는 방법만 보면..

1
2
3
4
mov ax, 0x2401
int 0x15

; check error with jc

ax레지스터에 값을 넣어주는 것에 따라서 활성화 비활성화가 가능합니다.

ax 기능 상태
0x2400 A20게이트 비활성화 성공하면 AH = 0, 실패시 EFLAGS레지스터 CF비트가 1
0x2401 A20게이트 활성화 성공하면 AH = 0, 실패시 EFLAGS레지스터 CF비트가 1

후기

하지만 기본적으로 A20게이트가 활성화 되있는 경우가 많은것 같습니다. 우선 제가 실습해보고 있는 OS로 qemu에서 memory test를 해볼때 1MB 상위 메모리 접근이 A20게이트를 활성화하지 않아도 접근이 가능합니다. 굳이 A20게이트를 비활성화 했을때는 물론 접근이 불가능합니다.

Reference