A20 GATE 란?

오늘은 A20 gate에 대해서 알아보도록 하겠습니다.

어셈블리어 --> C언어로 점프를 뛰었으면 이제부턴 본격적인 커널제작을 하면 되는것이 아니냐..

맞습니다. 하지만 굉장히 치명적인 제약사항이 따릅니다.


문제점

바로 메모리 1MB이상에 접근할 수가 없다는 것입니다. (불가능한건 아니지만 괴상하게 접근됩니다)

이건 또 무슨소리인지.. 우리는 분명히 32비트 보호모드로 진입했습니다.

그렇기 때문에 4GB라는 엄청난 메모리영역을 제어할 수 있게 되었습니다.

그런데 접근할 수가 없다니요?

바로 A20 Gate때문입니다.


CPU의 역사

A20 Gate 이야기 도중 갑자기 왠 CPU역사를 들먹이느냐 하는 분들도 게실겁니다.

바로 이 CPU때문에 A20 Gate가 탄생했기 때문입니다. 무턱대고 A20 Gate는 이거야! 라고 하는 것보단 왜 탄생했는지를 먼저 알고나서 이해하는것이 훨씬 수월하다고 생각했기 때문입니다.

그래서 우리는 A20 Gate에 초점을 맞추어 CPU의 역사를 살펴 볼 것입니다. 때문에 내용은 아주 짧을것입니다.

586 -> 486 -> 386 -> 286 -> ???

지금부터 우리는 CPU의 역사를 아주 크게크게 볼 것입니다. A20 Gate를 설명하는데는 전혀 지장이 없습니다.

대상 CPU는 모두 Intel회사 제품이며, 자세한 정보는 ( Intel CPU의 종류 : 위키피디아 )에 있습니다.


586(펜티엄) 이전에 486이 있었습니다. 그렇게 역사를 살펴보면 286까지 오게됩니다.

모두 CPU이름입니다. 앞의 숫자만 바뀌지요? 그래서 80x86 CPU라고 합니다. (혹은 x86)

그렇다면 286이전 CPU이름은 무엇이었을까요?

우리는 이것을 8086 CPU라고 부릅니다.


8086 이야기

우리가 지금까지 작성했던 리얼모드가 바로 8086에서 동작합니다. 보호모드는 80286부터 작동한답니다.

물론 80x86은 8086의 기능을 모두 사용할 수 있습니다. 즉 호환이 된다는 이야기이죠.

리얼모드에서는 1MB의 메모리를 사용할 수 있습니다. 범위는 0x00000 ~ 0xFFFFF 까지이죠.

8086은 메모리 버스는 20Bit ( 2^20 = 1MB )인데 레지스터의 크기가 16Bit였습니다.

그래서 레지스터 2개를 사용 즉, Segment:Offset 방식을 사용했습니다.

만약 0xFFFF : 0x000F 로 접근하면 실제 주소는 0xFFFFF가 됩니다. 아무 이상이 없습니다.


하지만 0xFFFF : 0x0010 으로 접근한다면 어떻게 될까요?

계산해보면 실제 주소는 0x100000이 됩니다.

2진수로는 100000000000000000000 입니다. 총 21자리죠. 즉 21Bit입니다.

하지만 메모리 버스가 20Bit입니다. 맨 앞에 있는 1이 짤릴지, 아니면 CPU가 에러를 뿜어낼지, 확실한것은 사용할수 없다는 것입니다. 1이 짤리면 00000000000000000000이 되겠죠.

이게 무슨 소리냐하면 리얼모드는 정확하게 1MB까지만 인식이 된다는 뜻입니다. ( 정확히는 0xFFFFF )

1MB에서 1이라도 넘어가면 바로 위와 같은 상황이 초래됩니다.


80x86 이야기

하지만 286으로 넘어오면서 메모리 버스의 크기가 24bit로 늘어납니다.

그렇다면 286에서 0xFFFF : 0x0010 으로 접근하면 어떻게 될까요?

똑같이 2진수로 100000000000000000000입니다. (21자리)

하지만 24Bit 메모리버스로 표현하고도 남기때문에 아무 이상없이 0x100000영역에 엑세스 할 수 있습니다.

바로 이게 문제인겁니다!!



A20 Gate의 등장

아 뭔가 문제점이 있는것 같기는 하지만 이게 왜 문제가 되는지는 잘 모르겠습니다.

위에서 80x86은 8086과 호환이 되어야 한다고 말씀 드렸습니다. 실제 그렇게 설계를 했고요.

그런데 호환은 커녕 같은 Segment : Offset 방식임에도 불구하고 전혀 다른 메모리에 접근합니다.

그래서 등장한것이 A20 Gate입니다. ( 하.. 정말 등장 한번 시키기 어렵네요 )


A20 Gate의 역할

A20 Gate의 역할을 힘들게 그림으로 그려보았습니다.


저기 21번째에 보이는 빨간색 네모에 A20 Gate가 보입니다.


A0 ~ A19 까지는 모두 그대로 내려오는데


A20(0부터 시작하므로 21번째)은 A20 Gate와 AND 연산 후 내려옵니다.



즉, A20 Gate가 0일 경우 21번째 bit가 1이어도 0으로 계산됩니다.


A20 Gate에 의해 21번째 값이 결정되는 것이지요.


때문에 80286에서 0x100000에 접근되던것이 A20 Gate에 의해서 0x000000으로 접근 됩니다!


8086의 최대 메모리인 1MB가 80286에서도 호환되는것이지요.



따라서 A20 Gate를 On 시키느냐 Off 시키느냐에 따라 메모리에 접근하는 주소값이 바뀌게 됩니다.


MS-DOS는 리얼모드였지만 A20 Gate를 On 시킴으로써 0xFFFF:0x0010 ~ 0xFFFF:0xFFFF까지 사용할수 있었습니다. 총 64Kb죠. 그게 바로 HIMEM.SYS였고요. 메모리부족으로 도스게임을 돌리기 위해서 게임피아를 들여다보셨던 분들이라면 들어보셨을법한 내용입니다.



보호모드에서의 A20 Gate


보호모드에서 A20 Gate는 아주 중요합니다. 중요하다기 보단 심각한일을 만들어냅니다.


가만히 보면 A20bit(21번째)가 1이라는 것은 홀수를 의미합니다. (A20 bit는 MB단위로 1, 3, 5, 7..등일때 1이 됩니다. 2, 4, 6, 8.. 등일때는  0이 되고요)


결국 1MB접근은 0MB로 ( 홀수이므로 ), 2MB접근은 2MB로 ( 짝수이므로 ), 3MB접근은 2MB로 ( 홀수이므로 )접근됩니다.


실제로 3MB 접근을 그림으로 힘들게 그려보았습니다. 이해가 한결 쉬워질입니다.


이해가 되시나요?


엄청 길게 설명했지만 요약하면 역시나 한줄입니다.


A20 Gate를 켜지 않으면 홀수(MB단위)번지는 접근하지 못한다!




글솜씨가 없다보니 내용이 길어졌네요. 그리고 본문엔 오류도 많을 것입니다. 지적해주시면 감사하겠습니다.


다음에는 A20 Gate를 켜보겠습니다.