본문 바로가기
프로그래밍/OS

A20 게이트

by 사악신 2014. 4. 20.


포트 I/O(2014/04/18 - [프로그래밍/OS] - 포트 I/O)에 이어 A20 게이트 또한 인텔 프로세스의 특징입니다. 사실, 지저분한 유산이지요.



인텔의 8086 CPU 핀을 보시면, A0 부터 A19 까지 어드레스(주소) 핀이 존재합니다. 즉, 20비트 주소 체계를 가지고 있다는 얘기입니다.


2진수 11111111111111111111 => 2^20 = 1048576


즉, 1048576 번지까지 주소 지정이 가능하며, 이를 KB 로 환산하면 1024KB 즉 1MB 가 됩니다. 하지만, 다들 아다시피 8086, 8088, 80286 은 16비트 CPU 입니다. 레지스터에 담을 수 있는 것은 16비트이며 이 레지스터를 통하여 주소 접근을 하여야합니다. 4 비트가 모자란 셈이죠. 그래서 나온 개념이 세그먼트, 오프셋입니다.


2진수 16비트, 1111111111111111 => 왼쪽으로 4비트 쉬프트 => 2진수 20비트, 11111111111111110000


2^4 만큼 좌측 쉬프트는 0x10(2^4=16) 을 곱한 것과 의미가 동일합니다. 하여, 0x10 을 곱한 기준 주소(세그먼트)에 상대적 위치(오프셋)를 조합한 방식으로 20비트 주소를 지정하였습니다. 이것이 악마의 20비트 세그먼트, 오프셋 개념입니다.(이 방식은 같은 물리 주소를 표현할 수 있는 아주 다양한 조합이 나올 수 있습니다.)


자... 시간이 흘러 80286 CPU 가 나왔습니다. 보시다시피 어드레스 핀이 A0 부터 A23 까지 존재합니다. 즉, 24비트 주소 체계를 가지고 있다는 얘기로... 이론상 16MB(2^24) 까지 메모리 주소를 가질 수 있게 되었습니다.




헌데 문제가 생겼습니다. 기존의 16비트 레지스터 2개의 조합으로 생성한 다음의 주소는...


세그먼트 0xFFFF 오프셋 0x01FF => 0xFFFF * 0x10 + 0x01FF => 0xFFFF0 + 0x00FF = 0x1001EF

=> 1049071 => 1M(1048576) 이상의 주소 => 0x1EF 가 8086/8088 에서의 주소 하지만 80286 에서는 0x1001EF 주소


즉, 기존 프로그램들이 80286 에서 정상 동작할 수 없는 상황이 발생한 것입니다. 그래서 문제를 일으키는 주소 체계를 소화하기 위하여 A20 이상의 주소 핀을 사용할지 안할지를 결정할 플래그를 키보드 컨트롤러와 조합하기로 결정하였습니다. 이렇게 하위 호환성을 위한 꼼수가 등장한 겁니다.






좀 더 자세히 얘기를 하자면, A20 핀을 8042 키보트 컨트롤러(지금은 칩셋에 포함됨)의 P21 과 AND 로 묶어서 처리하도록 하였습니다. 즉, P21 이 1로 세팅되어있어야 A20 의 값이 인정(AND 이므로)되도록한 것입니다. 포트 I/O (0x64)를 통하여 명령 0xDD, 0xDF 를 전달(OUT, 커맨드 전송) 함으로 해당 기능을 구현합니다.



이렇게... 80286 및 이후 인텔 계열 프로세서 모두 이러한 꼼수를 가져올 수 밖에 없었습니다. ^^ 어쨌든 A20 핀이 AND 로 묶여있는 관계로 32비트 주소 체계이든 64비트 주소 체계이든 A20 핀의 값 1MB 는 해당 게이트가 활성화되었느냐 아니냐에 따라 지정한 값이 나오느냐 무조건 0 이 되느냐가 결정됩니다. 그러니까 최근의 OS(MS-DOS 가 아닌) 에서는 이 녀석을 무조건 활성화 하여야합니다. 그렇지 않으면 홀수 MB 는 사용할 수 없게 됩니다.(가령, 13 MB -> 12MB 가 되어버림. 20번째 비트가 무조건 0 이 되므로...)


여담으로 아래는 80386 SX 의 핀입니다. A0 부터 A23 까지 있습니다. 80386 DX 의 경우 A31 까지 있습니다. 인텔에서 가격을 낮추는 방법으로 32 비트였던 80386 을 80286 급으로 낮춰 판매했습니다. 뭐 사기죠. ㅎ 예전에는 이런 점을 아느냐 모르느냐가 나름 컴퓨터 전문가냐 아니냐의 기준이었습니다. 참고로 80486 SX, DX 는 코프로세서(FPU)가 내장되었느냐 아니냐의 차이입니다. 사실, 내장이냐 아니냐 보다는 불량이 있느냐 없느냐가 더 정확한 표현이긴 하지만요. ^^





80386 DX 

 80386 SX

32 비트 어드레스 버스

32 비트 데이터 버스

24비트 어드레스 버스

16비트 데이터 버스 

132 핀

100 핀 (플랫) 

4 GB 메모리 어드레스

16 MB 메모리 어드레스 


아래는 8086, 80286, 80386 DX 의 시스템 버스입니다.




A20 게이트를 정리하다보니, 다시는 떠올리기 싫었던 악마의 20 비트 세그먼트, 오프셋을 살펴보게 되었네요. 그때는 정말 어렵고 작업 할 때마다 멘붕이었는데...ㅎ 지금은 레지스터가 32비트, 64비트로 어드레스 핀과 동일한 비트 체계를 가짐으로 인하여 단순해졌습니다. ^^



반응형

'프로그래밍 > OS' 카테고리의 다른 글

CentOS mongodb 2.6.1 업데이트하기  (0) 2014.05.08
FPC 로 OS 커널 만들기... - 3 -  (0) 2014.04.30
A20 게이트  (0) 2014.04.20
포트 I/O  (0) 2014.04.18
x86 CPU 메모리맵  (0) 2014.04.17
FPC 로 OS 커널 만들기... - 2 -  (0) 2014.04.11

태그

댓글0