정보공간_1

[6기 강북 홍진우] 64비트 멀티코어 OS#5 - Boot Loader(2) 본문

IT 놀이터/Elite Member Tech & Talk

[6기 강북 홍진우] 64비트 멀티코어 OS#5 - Boot Loader(2)

알 수 없는 사용자 2014. 11. 9. 13:26

엘리트멤버 6기, 강북멤버십 23-1기 홍진우입니다.


 지난 시간에 분석한 64비트 운영체제의 부트로더 개념을 바탕으로, 이번엔 직접! 부트로더를 제작하는 방법론을 소개하고, 가상으로 에뮬레이션 해보는 시간을 갖도록 하겠습니다. 개발을 위해 필요한 프로그램 및 툴은 첫번째 포스팅을 참고하시고 설치하시면 되겠습니다. 


 * 필요한 툴은 Eclipse CDT, NASM, QEMU 입니다.



1. Eclipse CDT 프로젝트 디렉토리 구조 생성 및 Build



[그림 1] Eclipse CDT 프로젝트 생성



  Eclipse CDT를 실행하고 [File] - [New] - [C Project]를 클릭하여 지정된 workspace 경로에 프로젝트를 생성합니다.





  그림과 같이 프로젝트 관련 디렉토리들을 생성합니다. 부트로더를 위해 작성할 각각의 파일의 내용은 다음과 같습니다. 

(BootLoader.bin, Disk.img 는 최종 빌드 후 바이너리를 실행시 자동 생성되는 파일로, 프로젝트 생성시에는 없어도 무관합니다.) 



   - 64os : OS 이미지가 생성되는 최상위 디렉토리입니다.


   - 00.BootLoader : 부트 로더가 저장되는 디렉토리입니다.


   - 01.Kernel32 : 보호 모드 커널, Source는 소스 파일, Temp는 빌드 과정에서 생성되는 임시 파일이 저장됩니다.


   - 02.Kernel64 : IA-32e 모드 커널, Source는 소스파일, Temp는 빌드 과정에서 생성되는 임시 파일이 저장됩니다.


   -  03.Application : IA-32e 모드 응용프로그램과 관련된 디렉토리, 00.HelloWorld는 예시 응용프로그램이 저장됩니다.


   - 04.Utility : OS와 관련된 유틸리티 디렉토리로, 00.ImageMaker는 예시 유틸리티가 저장됩니다.




 1.1 00.BootLoader \ BootLoader.asm



 위 그림과 같이 부트로더용 어셈 파일을 작성합니다. 각 코드 라인의 의미는 다음과 같습니다.



  [ORG 0x00] - 코드의 시작 어드레스를 0x00으로 설정


  [BITS 16] - 이하의 코드를 16비트 코드로 설정


  SECTION .text - text 섹션(세그먼트)를 정의


  jmp $ - 현재 위치에서 무한 루프를 수행


  times 510 - ( $ - $$ ) db 0x00 -  


  $ : 현재 라인의 어드레스      $$ :  현재 섹션(.text)의 시작 어드레스    $ - $$ :  현제 섹션을 기준 오프셋


   현재 어드레스부터 어드레스가 510이 되는 시점까지 반복


  db 0x55 - 1바이트를 선언하고 값은 0x55


  db 0xAA - 1바이트를 선언하고 값은 0xAA




  1.2 64os \ 00.BootLoader \ makefile


 부트로더 이미지 생성을 담당하는 makefile입니다. bootloader.bin 을 만들기 위해, 위에서 작성한 asm파일을 NASM으로 컴파일하여 부트로더 이미지용 bin 파일을 생성합니다.



  1.3 64os \ makefile


  전체 os 이미지 빌드 정보를 담고있는 makefile입니다. bootloader 빌드와 관련된 메시지를 출력하고, 00.bootloader의 메이크 파일 실행한후, Disk.img를 NASM을 통해 생성된 bin파일을 참조해 지정된 경로에 생성합니다.


코드 작성을 마치고 Build 하게 되면 다음과 같은 메시지가 콘솔에 출력되고 Disk.img 파일이 workspace 경로에 생성됩니다.




2. QEMU 부트로더 디스크 Emulation

   앞서 설치한 QEMU에 Eclipse 빌드를 통해 생성한 Disk.img를 부팅 이미지로 하여 Emulation 해보겠습니다.


 2.1 QEMU 옵션 설정 및 Boot





 커맨드 입력창(cmd)를 실행한후 qemu가 설치된 디렉토리로 이동하여 다음과 같은 명령문을 입력합니다.

     qemu-system-x86_64.exe -L . - m 64 -fda <이미지파일 경로>

 여기서 명령 옵션을 간단히 설명하자면,  -m 64는 64MB의  물리 메모리를 할당한다는 것을 의미하고, -fda 는 가상의 플로피 디스크 이미지로 부터 OS 이미지를 블러오겠다는 옵션 입니다.



 2.2 QEMU Emulation 동작 화면

 


커맨드 입력창에서 위와 같이 입력하게되면 QEMU가 해당 이미지를 바탕으로 부팅을 진행하게되고, Booting from Floppy... 에서 멈춰 있다면 성공입니다. 멈춰이는 이유는 맨 위의 NASM 에센 부트로더 코드에서 무한루프를 주었기 때문입니다.



 지금까지 64비트 용 부트로더를 어떠한 방법과 어떠한 툴을 사용하여 작성하는지, 또한 가상으로 어떻게 Emulation하는 지 살펴 보았습니다. 


다음 포스팅에서는 실제 OS와 커널과 관련하여, 성공적으로 부팅후, OS환경을 더욱 풍부하게 만들어 보도록 하겠습니다.



* 참조 자료 : 64 비트 멀티코어 OS 원리와 구조 - 한승훈 저