A20 혹은 addressing line 20는 x86 컴퓨터 시스템에서 전자적인 시스템 버스로 이루어져있습니다.
8086에는 어드레스 라인이 20개 뿐이여서 0xFFFF:FFFF에서 최상위 1비트를 표현할 수 없었습니다.( 0xFFFF:FFFF, 즉 0x10FFEF가 100001111111111101111로 21자리이기 때문에)

따라서 8086에서 1MB(0x100000) 초과 범위의 주소는 0번지부터 다시 시작되어야 하고 주소가 겹치게 됩니다.

80286때부터 CPU에 Protected Mode가 도입되고, 어드레스 라인이 늘어나게 됩니다. 8086과 호환하게 위해, REAL 모드를 만들고, 20번을 8042(8086 당시의 키보드 컨트롤러)와 AND 게이트로 접속시킵니다.

 

 

A20과 연결된 키보드 컨트롤러의 핀이 0이 라면 항상 0이 되어, 주소가 제대로 전달되지 않을 것이며, 홀수 값인 주소(단위 MB)는 제대로 전달 되지 않아 사용할 수 없을 것입니다.

예) 키보드 컨트롤러의 A20 GATE가 항상 0일 때

0x100000 -> 100000000000000000000(2) -> 000000000000000000000(2) -> 0x0

0x200000 -> 1000000000000000000000(2) -> 1000000000000000000000(2) -> 0x200000

주소값의 20번째 비트를 0으로 바꿔보면 다음과 같이 값이 변경되는 것을 볼 수 있습니다. 짝수 MB 단위의 주소의 경우 20번째 비트가 항상 0이므로 변화가 없습니다.

 

따라서 32비트 커널에서 A20 게이트를 켜 주어야, 제대로 주소 전달을 할 수 있습니다.

 

A20 게이트를 켜 주기 위하여, 먼저 1)int 0x15를 사용하여 BIOS 함수를 호출하거나 2)8042 키보드 컨트롤러를 제어하거나 3) I/O 포트를 제어하는 방법이 있습니다.

+ Recent posts