64bit 멀티코어 OS 원리와 구조 - Day 4

이 글은 ‘64비트 멀티코어 OS 원리와 구조 - 한승훈 저자’을 공부하며 정리한 내용을 작성했습니다.

A20 게이트를 활성화하여 1MB 이상 영역에 접근해보자

IA-32e 모드 커널과 메모리 맵

왜 1MB 이상의 메모리에 접근해야 하는가에 대해서는 앞서 부트 로더에 의해 커널 이미지가 0x10000 메모리에 로딩되고, 1MB 이하의 어드레스 중에서 비디오 메모리가 위치하는 0xA0000 이하를 커널 공간으로 사용한다고 하면, 보호 모드 커널과 IA-32e 모드 커널의 최대 크기는 0xA0000-0x10000(576KB)이 됩니다. 그리고 이후에 초기화되지 않은 영역(.bss 섹션)이 포함된다면 더 작은 크기를 사용해야 합니다. 이 처럼 별다른 기능을 하지 않는 커널을 사용하게 된다면 문제가 없지만 계속해서 이 상태로 유지한다면 이후 다양한 기능이 추가되며 커널이 커지게 되면 메모리가 부족한 현상이 발생하게 됩니다.

MINT64 OS는 이러한 문제를 해결하려고 커널 이미지를 모두 0x10000 어드레스에 복사하되, 덩치가 큰 IA-32e 모드 커널은 2MB의 어드레스로 복사하여 2MB~6MB(총 4MB의 크기)의 영역을 별도로 할당했습니다. (책 231p의 그림을 보시는게 이해하기 더 좋습니다.)

1MB 어드레스와 A20 게이트

초창기 XT PC의 최대 어드레스는 1MB였습니다. 만약 하드웨어의 한계로 1MB 이상의 어드레스에 접근하면 하위 주소만 남아 접근하게 되었습니다 (0x10FFEF -> 0xFFEF). 하지만 이후 16MB 주소까지 접근할 수 있는 AT PC가 탄생하면서 XT PC의 특수한 주소 계산법(1MB 이상의 주소를 1MB 이하의 주소로 맵핑) 때문에 문제가 발생합니다. 이 호환성 문제를 해결하기 위해 탄생한게 A20 게이트 입니다.

A20은 주소의 20번째 비트를 의미하며, 이를 활성화/비활성화 함으로 20번째 비트를 항상 0으로 고정할 수 있었습니다. A20 게이트가 비활성화된 상태에서는 20번째 비트가 항상 0을 유지하기 때문에 홀수 MB에 접근할 수 없습니다. 그래서 최초 부팅 이후 1MB4MB의 초기화를 하면 01MB, 23MB가 초기화되고 01MB 영역은 BIOS와 보호 모드 커널 영역으로 사용하고 있으므로 수행중인 부분이 초기화가 되어버립니다.

A20 게이트 활성화 방법

A20 게이트를 활성화하는 방법은 크게 세 가지가 있습니다.

  • 키보드 컨트롤러로 활성화
    • 키보드 컨트롤러에 A20 게이트를 연결하여 제어, 느리고 소스 코드가 복잡하지만 마우스와 키보드가 있는 환경에선 쉽게 접근할 수 있다.
  • 시스템 컨트롤 포트로 활성화
    • 시스템 제어에 관련된 I/O 포트를 통해 A20 게이트를 활성화한다. 키보드 컨트롤러보다 속도가 빠르고 소스 코드가 간략
  • BIOS 서비스로 활성화
    • BIOS를 활용하기에 세 가지 방법중 가장 확실하다.

이 방법중 책에서는 시스템 컨트롤러 포트, BIOS 방법을 활용합니다.

시스템 컨트롤러 포트

1
2
3
4
in al, 0x92
or al, 0x02
and al, 0xFE
out 0x92, al

BIOS

1
2
3
4
5
6
7
8
9
10
mov ax, 0x2401
int 0x15

jc .A20GATEERROR
jmp .A20GATESUCCESS
.A20GATEERROR
..error handling..

.A20GATESUCCESS
..success logic..
Share