반응형

이전에 내용에서 C 언어로 커널을 작성하는 방법makefile을 수정하여 Source 디렉터리의 소스 파일을 자동으로 검색한 뒤, 빌드하는 방법에 대해 알아봤습니다.

 

이제 IA-32e 모드 커널을 실행하기 위한 준비 작업으로 PC에 설치된 메모리가 64MB 이상인지 검사하고, IA-32e 모드 커널이 위치할 영역을 모두 0으로 초기화하는 작업을 수행하며

부팅 과정을 완료하고 나서 1MB 이상의 메모리에 정상적으로 접근되는지 확인하고, 이를 위해 어떤 작업이 필요한지 알아봅니다.

 

부트 로더에 의해 커널 이미지가 메모리에 로딩되는 주소는 0x10000입니다.

 

만약 1MB 이하의 주소 중에서 비디오 메모리가 위치하는 0xA0000 이하를 커널 공간으로 사용한다고 가정하면, 보호 모드 커널과 IA-32e 모드 커널의 최대 크기는 576KB(0xA0000 - 0x10000) 정도입니다.

 

커널 이미지(보호 모드 커널과 IA-32e 모드 커널 포함)에는 초기화되지 않은 영역(.bss 섹션)이 포함되지 않으므로 커널 이미지의 크기로 환산하면 이보다 더 작은 크기여야 하며, 이후 멀티 태스킹과 파일 시스템과 같은 기능이 추가되어 커널이 커지면 576KB의 공간은 부족합니다.

 

FS64 OS는 이 문제의 해결책으로 커널 이미지를 모두 0x10000 주소에 복사하되, 덩치가 큰 IA-32e 모드 커널은 2MB의 주소로 복사하여 2MB ~ 64MB 영역을 별도로 할당하기 때문에 IA-32e 모드의 커널 영역은 모든 섹션을 포함하여 총 4MB의 크기가 되며, 이는 충분한 크기입니다.

 

아래는 이러한 메모리 맵을 나타낸 것입니다.

 

FS64 OS의 메모리 맵

 

 

미리 IA-32e 모드 커널이 위치할 영역을 초기화하는 이유

 

IA-32e 커널 이미지가 초기화 되지 않은 영역을 포함하고 있지 않기 때문1MB 이하의 공간에서 IA-32e 모드 커널 이미지를 2MB의 주소로 복사하면 미리 초기화 한 부분이 커널 이미지로 덮어씌워짐에도 불구하고 미리 IA-32e 모드 커널이 위치할 영역을 0으로 초기화해야 합니다.

 

비록 커널은 초기화되지 않은 영역을 사용하지만, 커널 이미지에는 초기화 되지 않은 영역이 제외되어 있습니다.

 

그렇기에 커널 이미지를 옮길 때도 이 영역은 해당되지 않으며, 이미지를 옮길 영역을 미리 0으로 초기화하지 않으면 쓰레기 값이 들어있을 것이므로 이러한 상태에서 IA-32e 모드 커널을 실행하면 0으로 참조되어야 할 변수들이 0이 아닌 값으로 설정되어, 무한 루프에 걸리거나 잘못된 조건문이 실행되는 등의 문제가 발생할 수 있어서 미리 방지 차원에서 0으로 초기화하는 것입니다.

 


→ IA-32e 모드 커널을 위한 메모리 초기화

 

IA-32e 모드 커널이 위치할 영역을 초기화하는 방법커널 영역을 초기화하는 코드를 추가하여 빌드한 뒤 OS를 실행했을 때 발생하는 문제와 그 원인에 대해 알아봅니다.

 


→ 메모리 초기화 기능 추가

 

이전에 Main.c(01.Kernel32/Source) 파일을 추가하여 C 언어로 작업할 수 있는 환경을 마련했었습니다.

 

1MB부터 6MB 영역까지 모두 0으로 초기화 하는 기능은 C 코드로 구현하는데, 1MB 영역은 IA-32e 모드 커널이 위치할 곳이 아니지만 IA-32e 모드 커널을 위한 자료구조가 위치할 영역이므로 같이 초기화합니다.

 

초기화 코드Main() 함수 내에 추가해도 되지만 kInitializeKernel64Area() 함수를 추가하여 호출하여 사용하겠습니다.

 

kInitializeKernel64Area() 함수루프를 수행하면서 0x100000(1MB) ~ 0x600000(6MB) 영역을 모두 0으로 채우는 단순한 코드입니다.

 

아래는 변경된 Main.c(01.Kernel32/Source) 파일입니다.

 

IA-32e 모드 커널이 위치할 공간을 0으로 초기화 하는 코드(01.Kernel32/Source/Main.c) 1

 

IA-32e 모드 커널이 위치할 공간을 0으로 초기화 하는 코드(01.Kernel32/Source/Main.c) 2

 


 

→ 빌드와 실행

코드를 다시 빌드하여 OS 이미지를 생성하고 나서 QEMU와 실제 PC에서 실행합니다.

 

먼저, 생성된 이미지를 QEMU에서 실행하면 아래와 같이 정상적으로 초기화가 수행되었다는 "IA-32e Kernel Area Initialization Complete" 메시지를 확인할 수 있습니다.

 

FS64 OS를 QEMU에서 실행한 결과

 

하지만 실제 PC에서 FS64 OS를 실행하면 QEMU와는 다르게 메시지가 출력되지 않거나 PC가 리부팅됩니다.

(책에서는 NTRawrite 프로그램으로 플로피 디스크에 이미지를 복사한 후 실행하므로 이 글에서는 글로만 설명합니다.)

 

QEMU는 실제 PC처럼 동작하지 않는다는 것을 알 수 있고, 이는 QEMU 한계라고도 볼 수 있으므로 실제 PC를 사용하여 테스트하는 게 가장 좋습니다.

 

PC에서 정상적으로 실행되지 않은 이유PC가 하위 기종에 대한 호환성을 유지하기 위해 주소 라인을 비활성화했기 때문입니다.

반응형

+ Recent posts