Bochs(x86 에뮬레이터)에서 MicroC/OS-II 실행하기

이재홍 http://www.pyrasis.com 2003.9.23 ~ 2004.1.28

오픈소스 x86 에뮬레이터인 Bochs에서 MicroC/OS-II를 실행해봅시다.
Bochs는 버전 2.0.2, Windows용을 기준으로 설명 하겠습니다.

MicroC/OS-II는 x86 Protected Mode(보호모드)로 포팅된 소스를 사용하며 Microsoft Visual C++ Microsoft Macro Assembly (MASM)을 사용해서 컴파일 하도록 하겠습니다.

WinImage라는 프로그램이 필요합니다.

Bochs와 WinImage를 사용하는 이유는 번거로움을 피하기 위해서 입니다. ucosx86p.zip 이 소스를 컴파일 해서 컴파일 된 것을 1.44 플로피 디스크에 저장한 뒤 그 디스켓으로 일반 PC에서 부팅을 하면 실행이 됩니다.

하지만 x86 에뮬레이터 등을 사용하면 사용자의 PC를 재부팅 하지 않고 손쉽게 실행 할 수 있으며 WinImage를 이용하면 매번 플로피 디스크에 저장하지 않아도 됩니다.

컴파일 환경 설정

ucosx86p.zip를 압축을 풀면 다음과 같이 나옵니다.

여기서 Bin 디렉터리에는

BOOTSCTR.IMG - 부트섹터 이미지 파일

ExeToImg.exe - EXE 파일을 Img 파일로 변환하는 유틸리티 파일이 들어있고

Entry 디렉터리는 부팅관련 어셈블리 소스가 들어있습니다.

MyTask에는 사용자 태스크 소스가 들어있고

SOURCE 소스에는 MicroC/OS-II 소스가 들어있습니다.

Visual C++ 에서 MyTask 안에 MyTask.dsw를 열면 다음과 같이 나옵니다.

Microsoft Macro Assembly 환경 설정

Microsoft Macro Assembly 를 받고(MASM611.zip) 압축을 해제합니다.
저는 C:\MASM611에 해제하였습니다.

Visual C++에서 Tools -> Options -> Directoris

Show directories for: (빨간색 사각형)부분을 Executable files 로 바꿉니다. 검은색 동그라미 부분을 누르면 새로 경로를 만드는 곳이 나옵니다. 파란색 사각형 오른쪽에 … 버튼을 누르면 경로를 찾는 창이 뜹니다.

그곳에서 아까전에 MASM611.zip(Microsoft Macro Assembly)를 압축 푼 곳의 BIN 디렉터리로 설정하고 OK를 누릅니다.

Visual C++에서 Project -> Settings -> os_cpu_a.asm -> Custom Build 로 갑니다.

위에서 빨간색 사각형 부분(Commands)을 아래 그림과 같이 고칩니다. 앞에 있는 C:\masm32\bin 부분을 지웁니다. 방금전에 MASM의 경로를 설정해 주었기 때문에 이렇게 하는 것입니다. 아니면 이곳에서 MASM의 경로를 바로 적어주어도 됩니다.

MicroC/OS-II 컴파일 하기

Visual C++의 Build (F7) 을 눌러 컴파일을 하면 다음과 같이 컴파일이 됩니다.

ucosx86p 디렉터리의 MyTask 밑에 Release 디렉터리의 화면입니다. 컴파일이 다 된 모습이며 MyTask.exe 파일과 MyTask.img 파일이 보입니다. 이 두가지 파일이 보여야 완전히 완료 된 것입니다.

MyTask.exe 파일은 필요없는 파일입니다. MicroC/OS-II는 운영체제 커널입니다.

우리는 운영체제 커널울 컴파일 했기 때문에 윈도우에서 실행을 한다고 해도 실행이 안됩니다.

어플리케이션이 아닌 또다른 운영체제이기 때문입니다. 윈도우와 VC++ 에서 컴파일 했기 때문에 .exe 파일이 생겨난 것입니다.

우리에게 필요한 파일은 MyTask.img 파일입니다.

위처럼 아이콘이 나오는 이유는 WinImage를 설치 했기 때문입니다만. 이 파일은 WinImage 에서 열면 열리지 않습니다.

이 파일은 MicroC/OS-II의 x86용 바이너리 파일입니다.

예를 들면 리눅스를 컴파일 했을 때 생기는 zImage 와 같은 종류의 파일입니다.

MicroC/OS-II 플로피 디스켓 이미지 만들기

ucos-ii_floppyimage.zip MicroC/OS-II x86 디스켓 이미지 받기

이 파일을 받아서 할 경우 밑의 디스켓을 넣어서 하는 과정은 무시하고 넘어갑니다.

1.44 플로피 디스켓을 컴퓨터에 넣습니다. 디스켓을 포맷하고 그 다음에 ucosx86 디렉터리의 MyTask 디렉터리 안에 Build.bat 라는 파일이 있습니다. 이 파일을 실행시킵니다.

위와 같은 창이 떳다가 잠시후 닫힙니다.

“a:*.img을(를) 찾을 수 없습니다.” 라고 뜬 것은 플로피 디스켓을 포맷했기 때문에 아무것도 없기 때문입니다.

플로피 디스켓을 탐색기로 열어 보시면 MyTask.img 파일이 복사되어 있습니다. 이 디스켓이 일반 디스켓과 다른점은 부트섹터가 MicroC/OS-II에 맞게 조절 되어 있습니다.

Build.bat 파일에서 debug ..\bin\Bootsctr.img < Debug.txt를 해주었기 때문에 부트섹터가 만들어 진 것입니다.

포맷한 일반 플로피 디스켓에 MyTask.img 파일을 복사해 넣는다고 해도 절대 부팅이 되지 않습니다. 부트섹터가 맞지 않기 때문입니다. 꼭 Build.bat로 만들어 주어야 부팅이 됩니다.

WinImage 설정

WinImage 를 받아서 설치합니다. 위에서 Build.bat로 디스켓을 만들었으면 다음과 같이 합니다.

위에서 “MicroC/OS-II x86 디스켓 이미지”를 받았으면 이 부분도 건너 뜁니다. WinImage를 실행합니다. 플로피 디스켓은 그대로 꽂아 둡니다.

Read disk를 누르면 이미지를 읽어들입니다.

다 읽었으면 저장 버튼을 눌러 저장을 합니다.

파일이름은 ucos-ii

파일형식은 Image file (*.IMA)를 선택하고 저장 합니다.

여기서 만든 ucos-ii.IMA 파일은 위에서 받을 수 있는 “MicroC/OS-II x86 디스켓 이미지” 와 똑 같은 파일입니다.

Bochs 설정

생성한 이미지 파일은 x86 에뮬레이터 VMware, Virtual PC, Bochs에서도 똑같이 실행 가능하며 결과도 같습니다.

이 문서에서는 Bochs에서 실행하는 방법을 설명합니다.

bochs-2.0.2.win32-bin.zip을 받아서 압축을 풀어 놓습니다.

압축을 풀어놓은 Bochs 디렉터리 안에 bochsrc-sample.txt 파일이 있습니다.
이 파일을 bochsrc.txt로 복사합니다.

방금전 만들어 놓은 MicroC/OS-II 플로피 디스크 이미지 파일 ucos-ii.IMA 파일을 Bochs 디렉터리로 이동 합니다.

그리고 bochsrc.txt 파일을 편집 합니다.
#은 주석이므로 프로그램은 인식하지 못합니다 #이 없는 부분만 인식합니다만
알아보기 쉽게 하기 위해서 주석 처리 된 것도 같이 표시하였습니다.

file=bios/ BIOS-bochs-latest 부분을 file= BIOS-bochs-latest 로 다음과 같이 고칩니다.

#romimage: bios/BIOS-bochs-970717a
#romimage: file=bios/BIOS-bochs-latest, address=0xf0000 #변경 전
romimage: file=BIOS-bochs-latest, address=0xf0000      #변경 후
#romimage: file=bios/BIOS-bochs-2-processors, address=0xf0000
#romimage: file=bios/BIOS-bochs-4-processors, address=0xf0000
#romimage: file=bios/rombios.bin, address=0xf0000

아래도 위와 같이 bios/를 지웁니다.

#vgaromimage: bios/VGABIOS-lgpl-latest
#vgaromimage: bios/VGABIOS-elpin-2.40 #변경 전
vgaromimage: VGABIOS-elpin-2.40       #변경 후

디스켓 설정.

아래와 같이 고칩니다. 맨 마지막 줄에 ucos-ii.IMA 파일 설정 부분을 주의 하시기 바랍니다.

조금전에 만들어서 이동해 온 디스켓 이미지 파일의 경로 입니다.

#floppya: 1_44=/dev/fd0, status=inserted
#floppya: file=../1.44, status=inserted
#floppya: 1_44=/dev/fd0H1440, status=inserted
#floppya: 1_2=../1_2, status=inserted
#floppya: 1_44=a:, status=inserted
floppya: 1_44=ucos-ii.IMA, status=inserted

하드디스크 설정내용인데 하드디스크는 필요 없으므로 모두 주석처리 합니다.

#ata0-master: type=disk, path="30M.sample", cylinders=615, heads=6, spt=17
#ata0-slave: type=cdrom, path=D:, status=inserted
#ata0-slave: type=cdrom, path=/dev/cdrom, status=inserted
#ata0-slave: type=cdrom, path="drive", status=inserted

부팅 디스크 설정. 플로피로 부팅 할 것이기 때문에 floppy로 하고 disk는 주석처리 합니다.

boot: floppy
#boot: disk

아래 부분이 주석처리 되어 있는데 주석을 제거 합니다.

pit: realtime=1

파일을 만듭니다. 일반 텍스트 파일이며 이름은 bochs_start.bat로 만듭니다. 앞으로 실행을 할 때 이 파일로 Bochs를 시작합니다. 내용은 아래와 같이 합니다.

bochs -qf bochsrc.txt

Bochs에서 MicroC/OS-II 실행

이제 bochs_start.bat를 실행하면 MicroC/OS-II 부팅되며 실행이 됩니다. 일반 PC와 똑 같은 모습이라 생각하면 됩니다.

소스 수정 후 다시 실행하기

Visual C++ 에서 ucosx86p 소스를 수정해서 다시 컴파일 하였을 경우. 또 MyTask.img 파일이 생깁니다. 그때는 앞서 만든 플로피 디스크 이미지 파일 ucos-ii.IMA을 더블클릭 하거나 WinImage에서 열면 내용이 보입니다.

그리고 Bochs 디렉터리에서 bochs_start.bat를 실행하면 방금 새로 컴파일하고 저장한 MicroC/OS-II가 새로 부팅이 되어 작동이 됩니다. 이런 방법을 반복 함으로서 MicroC/OS-II x86 Protected mode 소스를 컴파일 하고 실행해 볼 수 있습니다.

다소 방법이 복잡 할 수도 있습니다. 차근 차근히 따라 해보시면 그리 어려운 것은 아닙니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

23 September 2003