Bochs (x86 에뮬레이터 ) 에서 MicroC/OS-II 실행하기 2003.9.23 이재홍 revision 1 pyrasis (at) chol.com 공개 x86 에뮬레이터인 Bochs 에서 MicroC/OS-II 를실행해봅시다. Bochs 는버전 2.0.2, Windows 용을기준으로설명하겠습니다. MicroC/OS-II 는 x86 Protected Mode( 보호모드 ) 로포팅된소스를사용하며 Microsoft Visual C++ 과 Microsoft Macro Assembly (MASM) 을사용해서컴파일하도록하겠습니다. 그리고디스켓이미지를만들어야하기때문에 1.44인치플로피디스크 1장과 WinImage라는프로그램이필요합니다. Bochs는 http://bochs.sourceforge.net 에서구할수있습니다. WinImage는 http://www.winimage.com 에서구할수있습니다. MicroC/OS-II 소스는 http://www.e2g.org 자료실의 ucosx86p.zip 을이용합니다. 이소스를중심으로설명하도록하겠습니다. MASM 은 http://www.e2g.org 에서받을수있습니다. Bochs와 WinImage를사용하는이유는번거로움을피하기위해서입니다. ucosx86p.zip이소스를컴파일해서컴파일된것을 1.44 플로피디스크에저장한뒤그디스켓으로일반 PC에서부팅을하면실행이됩니다. 하지만 x86 에뮬레이터등을사용하면사용자의 PC를재부팅하지않고손쉽게실행할수있으며 WinImage를이용하면매번플로피디스크에저장하지않아도됩니다.
1. 컴파일환경설정 ucosx86p.zip 를압축을풀면다음과같이나옵니다. 여기서 Bin 디렉토리에는 BOOTSCTR.IMG 부트섹터이미지파일 ExeToImg.exe Exe파일을 Img 파일로변환하는유틸리티파일이들어있고 Entry 디렉토리는부팅관련어셈블리소스가들어있습니다. MyTask 에는사용자태스크소스가들어있고 SOURCE 소스에는 MicroC/OS-II 소스가들어있습니다.
Visual C++ 에서 MyTask 안에 MyTask.dsw 를열면다음과같이나옵니다.
1.1 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 의경로를바로적어주어도됩니다.
2. uc/os-ii 컴파일하기 Visual C++ 의 Build (F7) 을눌러컴파일을하면다음과같이컴파일이됩니다.
ucosx86p 디렉토리의 MyTask 밑에 Release 디렉토리의화면입니다. 컴파일이다된모습이며 MyTask.exe 파일과 MyTask.img 파일이보입니다. 이두가지파일이보여야컴파일이완료된것입니다. MyTask.exe 파일은필요없는파일입니다. uc/os-ii 가운영체제입니다. 우리는운영체제를컴파일했기때문에윈도우에서실행을한다고해도실행이안됩니다. 어플리케이션이아닌또다른운영체제이기때문입니다. 윈도우와 VC++ 에서컴파일했기때문에.exe 파일이생겨난것입니다. 우리에게필요한파일은 MyTask.img 파일입니다. 위처럼아이콘이나오는이유는 WinImage를설치했기때문입니다만. 이파일은 WinImage 에서열면열리지않습니다. 이파일은 uc/os-ii의 x86용바이너리파일입니다. 예를들면리눅스를컴파일했을때생기는 zimage 와같은종류의파일입니다.
3. uc/os-ii 플로피디스켓이미지만들기 1.44 플로피디스켓없는경우 http://www.e2g.org 의자료실에 MicroC/OS-II x86 디스켓이미지 라고된것을받아서하면됩니다. 이걸받으셧으면밑의디스켓을넣어서하는과정은무시하고넘어갑니다. 만약 e2g에서자료가없어서받지못했을경우디스켓을구하여만들어야합니다. 1.44 플로피디스켓을컴퓨터에넣습니다. 디스켓을포맷하고그다음에 ucosx86 디렉토리의 MyTask 디렉토리안에 Build.bat 라는파일이있습니다. 이파일을 실행시킵니다. 위와같은창이떳다가잠시후닫힙니다. a: *.img을( 를 ) 찾을수없습니다. 라고뜬것은플로피디스켓을포맷했기때문에아무것도없기때문입니다. 플로피디스켓을탐색기로열어보시면 MyTask.img 파일이복사되어있습니다. 이디스켓이일반디스켓과다른점은부트섹터가 uc/os-ii에맞게조절되어있습니다. Build.bat 파일에서 debug.. bin Bootsctr.img < Debug.txt 를해주었기때문에부트섹터가만들어진것입니다. 포맷한일반플로피디스켓에 MyTask.img 파일을복사해넣는다고해도절대부팅이되지않습니다. 부트섹터가맞지않기때문입니다. 꼭 Build.bat로만들어주어야부팅이됩니다.
4. WinImage 설정 WinImage 를받아서설치합니다. 위에서 Build.bat 로디스켓을만들었으면다음과같이합니다. e2g 에서 MicroC/OS-II x86 디스켓이미지 를받았으면이부분도건너뜁니다. WinImage 를실행합니다. 플로피디스켓은그대로꽂아둡니다. Read disk 를누르면이미지를읽어들입니다.
다읽었으면저장버튼을눌러저장을합니다. 파일이름은 ucos-ii 파일형식은 Image file (*.IMA) 를선택하고저장합니다. 여기서만든 ucos-ii.ima 파일은 e2g 자료실에있는 MicroC/OS-II x86 디스켓이미지 와똑같은파일입니다.
5. Bochs 설정 생성한이미지파일은 x86 에뮬레이터 VMware, Virtual PC, Bochs에서도똑같이실행가능하며결과도같습니다. 이문서에서는 Bochs에서실행하는방법을설명하겠습니다. bochs-2.0.2.win32-bin.zip을받아서압축을풀어놓습니다. 압축을풀어놓은 Bochs 디렉토리안에 bochsrc-sample.txt 파일이있습니다. 이파일을 bochsrc.txt로복사합니다. 방금전만들어놓은 uc/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
6. Bochs 에서 uc/os-ii 실행 이제 bochs_start.bat 를실행하면 uc/os-ii 부팅되며실행이됩니다. 일반 PC 와똑같은 모습이라생각하면됩니다.
7. 소스수정후다시실행하기 Visual C++ 에서 ucosx86p 소스를수정해서다시컴파일하였을경우. 또 MyTask.img 파일이생깁니다. 그때는앞서만든플로피디스크이미지파일 ucos-ii.ima 을더블클릭하거나 WinImage 에서열면내용이보입니다. 이곳에서 MyTask.img 를선택하고 Del 키로지우면지워집니다.
파일추가하기. Image -> Inject Visual C++ 에서수정하고새로컴파일한 MyTask.img 를찾아서선택합니다.
예버튼을누르면추가가됩니다. 위의저장버튼을눌러저장합니다. 그리고 Bochs 디렉토리에서 bochs_start.bat 를실행하면방금새로컴파일하고저장한 uc/os-ii 가새로부팅이되어작동이됩니다. 이런방법을반복함으로서 uc/os-ii x86 Protected mode 소스를컴파일하고실행해볼 수있습니다. 다소방법이복잡할수도있습니다. 차근차근히따라해보시면그리어려운것은아닙니 다. 질문혹은잘못된점이있다면 pyrasis (at) chol.com 으로메일주시기바랍니다. 이만문서를마치겠습니다.