第 3 章 編譯與執行

3.1 編譯作業系統

編譯本作業系統需要撰寫批次檔和 MAKEFILE。批次檔是 WINDOWS 環 境下用來執行一系列指令的描述檔,MAKEFILE 是用來幫助編譯器編譯 程式碼的描述檔。透過批次檔和 MAKEFILE,編譯過程變得很便 利,只要在命令提示列上鍵入 MAKEOS.BAT 就可以完成整個編譯的過 程,並產生作業系統的映像檔。

筆者提供一般多工作業系統 FORMOSA_V1 和視窗多工作業系統 FORMOSA_V2。 這裡是以視窗多工作業系統說明編譯與執行的方法,至於一般多工作業系統的說明,只要類推即可。


3.1.1 批次檔

使用批次檔來進行編譯的工作,可以簡化編譯的過程。 把原始程式碼放在 C:\FORMOSA_V2 的目錄中,在命令提示字元的視窗中進入該目錄,並執行 MAKEOS.BAT。 如果要編譯一般多工作業系統的話,將 FORMOSA_V2 改成 FORMOSA_V1。 之後,整個編譯過程就會自動執行完畢 。如果編譯過程順利,沒有錯誤發生的話, 最後會在各個 IMAGE 的目錄中產生本作業系統的映像檔。


3.1.1.1 編譯軟碟機啟動磁區

    FORMOSA_V2\MAKEOS.BAT
01  cd bootsect_floppy
02  del bootsect_floppy.bin
03  c:\mingw\bin\mingw32-make.exe
04  cd ..

行號說明
01進入軟碟機啟動磁區的目錄。
02刪除軟碟機啟動磁區二進位檔。
03執行軟碟機啟動磁區編譯程序。
04返回原來的目錄。

3.1.1.2 編譯硬碟機啟動磁區

    FORMOSA_V2\MAKEOS.BAT
01  cd bootsect_hd
02  del bootsect_hd.bin
03  c:\mingw\bin\mingw32-make.exe
04  cd ..

行號說明
01進入硬碟機啟動磁區的目錄。
02刪除硬碟機啟動磁區二進位檔。
03執行硬碟機啟動磁區編譯程序。
04返回原來的目錄。

3.1.1.3 編譯軟碟安裝作業系統啟動磁區

    FORMOSA_V2\MAKEOS.BAT
01  cd bootsect_install
02  del bootsect_install.bin
03  c:\mingw\bin\mingw32-make.exe
04  cd ..

行號說明
01進入安裝硬碟機啟動磁區的目錄。
02刪除安裝硬碟機啟動磁區二進位檔。
03執行安裝硬碟機啟動磁區編譯程序。
04返回原來的目錄。

3.1.1.4 編譯模式轉換

    FORMOSA_V2\MAKEOS.BAT
01  cd changemode
02  del changemode.bin
03  c:\mingw\bin\mingw32-make.exe
04  cd ..

行號說明
01進入 CPU 模式轉換程式碼的目錄。
02刪除 CPU 模式轉換程式碼二進位檔。
03執行 CPU 模式轉換程式碼編譯程序。
04返回原來的目錄。

3.1.1.5 編譯視窗作業系統核心

    FORMOSA_V2\MAKEOS.BAT
01  cd oskernel
02  cd applications
03  cd desk
04  del *.o
05  cd ..
06  cd bee
07  del *.o
08  cd ..
09  cd bomb
10  del *.o
11  cd ..
12  cd calculator
13  del *.o
14  cd ..
15  cd ..
16  cd middleware
17  del *.o
18  cd font
19  del *.o
20  cd ..
21  cd gui
22  del *.o
23  cd ..
24  cd ..
25  cd ffc
26  del *.o
27  cd ..
28  cd drivers
29  del *.o
30  cd ..
31  cd os
32  del *.o
33  cd ..
34  cd system
35  del *.o
36  cd ..
37  cd tasks
38  del *.o
39  cd ..
40  del oskernel.*
41  c:\mingw\bin\mingw32-make.exe
42  exe2bin.exe oskernel.exe oskernel.bin > oskernel.log
43  cd..

行號說明
01進入作業系統核心目錄。
02進入應用程式目錄。
03~05進入 DESK 目錄,刪除 DESK 目錄目的檔,再退回應用程式目錄。
06~08進入 BEE 目錄,刪除 BEE 目錄目的檔,再退回應用程式目錄。
09~11進入 BOMB 目錄,刪除 BOMB 目錄目的檔,再退回應用程式目錄。
12~14進入 CALCULATOR 目錄,刪除 CALCULATOR 目錄目的檔,再退回應用程式目錄。
15退回作業系統核心目錄。
16~17進入中介軟體目錄,刪除所有中介軟體目錄的目的檔。
18~20進入 FONT 目錄,刪除 FONT 目錄目的檔,再退回中介軟體目錄。
21~23進入 GUI 目錄,刪除 GUI 目錄目的檔,再退回中介軟體目錄。
24退回作業系統核心目錄。
25~27進入 FFC 目錄,刪除 FFC 目錄的所有目的檔,再退回作業系統核心目錄。
28~30進入 DRIVERS 目錄,刪除 DRIVERS 目錄的所有目的檔,再退回作業系統核心目錄。
31~33進入 OS 目錄,刪除 OS 目錄的所有目的檔,再退回作業系統核心目錄。
34~36進入 SYSTEM 目錄,刪除 SYSTEM 目錄的所有目的檔,再退回作業系統核心目錄。
37~39進入 TASKS 目錄,刪除 TASKS 目錄的所有目的檔,再退回作業系統核心目錄。
40刪除多工核心二進位檔。
41執行多工核心的編譯程序。
42將多工核心的執行檔轉換成二進位檔。
43返回原來目錄。

3.1.1.6 編譯一般作業系統核心

    FORMOSA_V2\MAKEOS.BAT
01  cd oskernel2
02  cd middleware
03  del *.o
04  cd font
05  del *.o
06  cd ..
07  cd gui
08  del *.o
09  cd ..
10  cd ..
11  cd drivers
12  del *.o
13  cd ..
14  cd os
15  del *.o
16  cd ..
17  cd system
18  del *.o
19  cd ..
20  cd tasks
21  del *.o
22  cd ..
23  del oskernel.*
24  c:\mingw\bin\mingw32-make.exe
25  exe2bin.exe oskernel.exe oskernel.bin > oskernel2.log
26  cd..

行號說明
01進入作業系統核心 2 目錄,這是一個不支援視窗的多工作業系統核心。
02~03進入中介軟體目錄,刪除所有中介軟體目錄的目的檔。
04~06進入 FONT 目錄,刪除 FONT 目錄目的檔,再退回中介軟體目錄。
07~09進入 GUI 目錄,刪除 GUI 目錄目的檔,再退回中介軟體目錄。
10退回作業系統核心目錄。
11~13進入 DRIVERS 目錄,刪除 DRIVERS 目錄的所有目的檔,再退回作業系統核心目錄。
14~16進入 OS 目錄,刪除 OS 目錄的所有目的檔,再退回作業系統核心目錄。
17~19進入 SYSTEM 目錄,刪除 SYSTEM 目錄的所有目的檔,再退回作業系統核心目錄。
20~22進入 TASKS 目錄,刪除 TASKS 目錄的所有目的檔,再退回作業系統核心目錄。
23刪除多工核心二進位檔。
24執行多工核心的編譯程序。
25將多工核心的執行檔轉換成二進位檔。
26返回原來目錄。

3.1.1.7 編譯軟碟機啟動的作業系統映像

    FORMOSA_V2\MAKEOS.BAT
01  cd image_floppy
02  del floppy_os.img
03  c:\mingw\bin\mingw32-make.exe
04  copy floppy_os.img c:\sun\images
05  cd ..

行號說明
01進入軟碟機開機作業系統映像檔的目錄。
02刪除軟碟機開機作業系統映像檔。
03執行軟碟機開機作業系統映像檔編譯程序。
04複製軟碟機開機作業系統映像檔到模擬器的目錄,以方便進行模擬。
05返回原來的目錄。

3.1.1.8 編譯光碟機啟動的作業系統映像

    FORMOSA_V2\MAKEOS.BAT
01  cd image_cdrom
02  del floppy_os.img
03  del cdrom_os.iso
04  c:\mingw\bin\mingw32-make.exe
05  cdromiso.exe bcd.iso floppy_os.img cdrom_os.iso
06  copy cdrom_os.iso c:\sun\images
07  cd ..

行號說明
01進入光碟機開機作業系統映像檔的目錄。
02刪除軟碟機開機作業系統映像檔。
03刪除光碟機開機作業系統映像檔。
04執行軟碟機開機作業系統映像檔編譯程序。
05執行光碟機開機作業系統映像檔轉換程序。
06複製光碟機開機作業系統映像檔到模擬器的目錄,以方便進行模擬。
07返回原來的目錄。

3.1.1.9 編譯軟光碟機安裝作業系統映像

    FORMOSA_V2\MAKEOS.BAT
01  cd image_install
02  del install_os.img
03  del cdrom_install.iso
04  c:\mingw\bin\mingw32-make.exe
05  cdromiso.exe bcd.iso install_os.img cdrom_install.iso
06  copy install_os.img c:\sun\images
07  copy cdrom_install.iso c:\sun\images
08  cd ..

行號說明
01進入光碟機安裝作業系統映像檔的目錄。
02刪除軟碟機安裝作業系統映像檔。
03刪除光碟機安裝作業系統映像檔。
04執行軟碟機安裝作業系統映像檔編譯程序。
05執行光碟機安裝作業系統映像檔轉換程序。
06複製軟碟機安裝作業系統映像檔到模擬器的目錄,以進行模擬。
07複製光碟機安裝作業系統映像檔到模擬器的目錄,以進行模擬。
08返回原來的目錄。

3.1.2 MAKEFILE

因為所使用的編譯器都是免費的自由軟體,使用上 無法和商業軟體的便利性相比,必須使用 MAKE.EXE 和 MAKEFILE 進行編譯工作。 MAKEFILE 有點像是編譯器的智慧型輔助,簡化編譯器的編譯過程。 為了使 MAKEFILE 的描述更加簡潔,MAKEFILE 發展出一 些特別的語法,這些語法讓 MAKEFILE 的可讀性變差,可讀性變差的 情形也讓 MAKEFILE 變得不容易學。學 MAKEFILE 其實並不難,只要 掌握幾個要領,不用太花俏的語法,MAKEFILE 本身其實也是一種有趣 的程式設計。在這裡提供一個小小的範例,讓大家了解 MAKEFILE 的 基本思考方式。

編譯作業系統用到的所有 MAKEFILE共 9 個,在這裡列出 8 個。 這是因為 KERNEL 和 KERNEL2 的 MAKEFILE 很類似,所以不另外說明。


3.1.2.1 MAKEFILE 範例
01 NASM=C:\NASM\NASM.EXE
02 all:bootsect.bin
03 bootsect.bin:bootsect.asm
04 -tab- $(NASM) -f bin -o $@ $< -l bootsect.lst

#where -tab- is 'Tab' key on keyboard
02 all 是目標描述指令,
all:bootsect.bin 表示 MAKEFILE 最後要得到的結果是 bootsect.bin。
03 bootsect.bin:bootsect.asm 的意思是說,要得到 bootsect.bin 之前,要先有 bootsect.asm。
沒有 bootsect.asm 就不會編譯 bootsect.bin。有了 bootsect.asm 之後,就可以執行 LINE 4 的指令。
所以 bootsect.asm 也可以稱作 bootsect.bin 的相依檔或輸入檔。
04 當 LINE 3 的條件成立時,就要執行 LINE 4 的指令。
LINE 4 的第一個字必須是 [TAB] 鍵,這是 MAKEFILE 的規定。這也是剛接觸 MAKEFILE 時,要特別注意的事。
$(NASM) 會被換成 C:\NASM\NASM.EXE,因為 NASM 在 LINE 0 就已經被定義為 C:\NASM\NASM.EXE。
-f bin 表示輸出的檔案屬性是二進位檔,-f 是FILE FORMAT,bin 是 BINARY。
-o $@ 表示輸出的檔名是 bootsect.bin,-o 是OUTPUT FILE。$@ 的 @ 是 AT 的象形符號,表示目標檔名是 bootsect.bin。
$< 是輸入檔名 bootsect.asm 的代替符號。< 是個箭頭符號,表示輸入的意思,指的是 LINE 3 的輸入檔 bootsect.asm。
-l bootsect.lst 表示這行指令完成時,也要得到列表檔。-l 是LIST FILE,bootsect.lst 是列表檔的檔名。

3.1.2.2 軟碟機啟動磁區的 MAKEFILE
   FORMOSA_V2\BOOTSECT_FLOPPY\MAKEFILE
01 NASM=C:\NASM\NASM.EXE
02 all:bootsect_floppy.bin
03 bootsect_floppy.bin:bootsect_floppy.asm
04 -tab- $(NASM) -f bin -o $@ $< -l bootsect_floppy.lst
01指定編譯器為 NASM 的組合語言編譯器。
02指定編譯最終目標為軟碟機啟動磁區二進位檔 bootsect_floppy.bin。只要這個最終目標出現,就停止編譯。
03編譯軟碟機啟動磁區的相依條件,當條件成立時才會進行編譯動作。
04編譯動作的設定。
第 1 個字一定是 [TAB],輸出的檔案格式 (-f) 為二進位檔 (bin)。
輸出檔名為目標檔檔名($@),即 bootsect_floppy.bin。
輸入檔名是相依檔檔名($<),即 bootsect_floppy.asm。
最後產生軟碟機啟動磁區的列表檔,用來觀察組合語言的編譯結果。

3.1.2.3 硬碟機啟動磁區的 MAKEFILE
   FORMOSA_V2\BOOTSECT_HD\MAKEFILE
01 NASM=C:\NASM\NASM.EXE
02 all:bootsect_hd.bin
03 bootsect_hd.bin:bootsect_hd.asm
04 -tab- $(NASM) -f bin -o $@ $< -l bootsect_hd.lst
01指定編譯器為 NASM 的組合語言編譯器。
02指定編譯最終目標為硬碟機啟動磁區二進位檔 bootsect_hd.bin。只要這個最終目標出現,就停止編譯。
03編譯硬碟機啟動磁區的相依條件,當條件成立時才會進行編譯動作。
04編譯動作的設定。
第 1 個字一定是 [TAB],輸出的檔案格式 (-f) 為二進位檔 (bin)。
輸出檔名為目標檔檔名($@),即 bootsect_hd.bin。
輸入檔名是相依檔檔名($<),即 bootsect_hd.asm。
最後產生硬碟機啟動磁區的列表檔,用來觀察組合組合語言的編譯結果。

3.1.2.4 安裝硬碟機啟動磁區的 MAKEFILE
   FORMOSA_V2\BOOTSECT_INSTALL\MAKEFILE
01 NASM=C:\NASM\NASM.EXE
02 all:bootsect_install.bin
03 bootsect_install.bin:bootsect_install.asm
04 -tab- $(NASM) -f bin -o $@ $< -l bootsect_install.lst
01指定編譯器為 NASM 的組合語言編譯器。
02指定編譯最終目標為安裝硬碟機啟動磁區二進位檔 bootsect_hd.bin。只要這個最終目標出現,就停止編譯。
03編譯安裝硬碟機啟動磁區的相依條件,當條件成立時才會進行編譯動作。
04編譯動作的設定。
第 1 個字一定是 [TAB],輸出的檔案格式 (-f) 為二進位檔 (bin)。
輸出檔名為目標檔檔名($@),即 bootsect_install.bin。
輸入檔名是相依檔檔名($<),即 bootsect_install.asm。
最後產生安裝硬碟機啟動磁區的列表檔,用來觀察組合組合語言的編譯結果。

3.1.2.5 模式轉換的 MAKEFILE
   FORMOSA_V2\CHANGEMODE\MAKEFILE
01 NASM=C:\NASM\NASM.EXE
02 all:changemode.bin
03 changemode.bin:changemode.asm
04 -tab- $(NASM) -f bin -o $@ $< -l changemode.lst
01指定編譯器為 NASM 的組合語言編譯器。
02指定編譯最終目標為 CPU 操作模式轉換的二進位檔 changemode.bin。只要這個最終目標出現,就停止編譯。
03編譯CPU 操作模式轉換程式碼的相依條件,當條件成立時才會進行編譯動作。
04編譯動作的設定。
第 1 個字一定是 [TAB],輸出的檔案格式 (-f) 為二進位檔 (bin)。
輸出檔名為目標檔檔名($@),即 changemode.bin。
輸入檔名是相依檔檔名($<),即 changemode.asm。
最後產生CPU 操作模式轉換的列表檔,用來觀察組合組合語言的編譯結果。

3.1.2.6 軟碟機開機作業系統映像的 MAKEFILE
   FORMOSA_V2\IMAGE_FLOPPY\MAKEFILE
01 NASM=C:\NASM\NASM.EXE
02 all:floppy_os.bin
03 floppy_os.bin:image_floppy.asm
04 -tab- $(NASM) -f bin -o $@ $<
01指定編譯器為 NASM 的組合語言編譯器。
02指定編譯最終目標為軟碟機開機作業系統的二進位檔 floppy_os.bin。只要這個最終目標出現,就停止編譯。
03編譯軟碟機開機作業系統的相依條件,當條件成立時才會進行編譯動作。
04編譯動作的設定。
第 1 個字一定是 [TAB],輸出的檔案格式 (-f) 為二進位檔 (bin)。
輸出檔名為目標檔檔名($@),即 floppy_os.bin。
輸入檔名是相依檔檔名($<),即 image_floppy.asm。

3.1.2.7 硬碟機開機作業系統映像的 MAKEFILE
   FORMOSA_V2\IMAGE_HD\MAKEFILE
01 NASM=C:\NASM\NASM.EXE
02 all:hd_os.bin
03 hd_os.bin:image_hd.asm
04 -tab- $(NASM) -f bin -o $@ $<
01指定編譯器為 NASM 的組合語言編譯器。
02指定編譯最終目標為硬碟機開機作業系統的二進位檔 floppy_os.bin。只要這個最終目標出現,就停止編譯。
03編譯硬碟機開機作業系統的相依條件,當條件成立時才會進行編譯動作。
04編譯動作的設定。
第 1 個字一定是 [TAB],輸出的檔案格式 (-f) 為二進位檔 (bin)。
輸出檔名為目標檔檔名($@),即 hd_os.bin。
輸入檔名是相依檔檔名($<),即 image_hd.asm。

3.1.2.8 安裝作業系統映像的 MAKEFILE
   FORMOSA_V2\IMAGE_INSTALL\MAKEFILE
01 NASM=C:\NASM\NASM.EXE
02 all:install_os.bin
03 install_os.bin:image_install.asm
04 -tab- $(NASM) -f bin -o $@ $<
01指定編譯器為 NASM 的組合語言編譯器。
02指定編譯最終目標為安裝作業系統的二進位檔 install_os.bin。只要這個最終目標出現,就停止編譯。
03編譯安裝作業系統映像檔的相依條件,當條件成立時才會進行編譯動作。
04編譯動作的設定。
第 1 個字一定是 [TAB],輸出的檔案格式 (-f) 為二進位檔 (bin)。
輸出檔名為目標檔檔名($@),即 install_os.bin。
輸入檔名是相依檔檔名($<),即 image_install.asm。

3.1.2.9 作業系統核心的 MAKEFILE

FORMOSA_V1 和 FORMOSA_V2 中各有二個作業系統核心。 一個作業系統核心是用來開機,另一個則是使用 XMODEM 遠端下載執行。 它們的差異主要是 ENTRYPOINT 不一樣,其餘的描述都很類似。 這裡僅說明 FORMOSA_V2 中視窗多工作業系統核心 kernel 的 MAKEFILE,FORMOSA_V1 的部分則類推。


3.1.2.9.1 設定進入點

ENTRYPOINT 指定作業系統核心映像在記憶體中的起始位置。 這是一個很重要的參數值,作業系統核心要在哪一個記憶 體區段執行,就要把這個參數改到那個區段的起始位址。

   FORMOSA_V2\OSKERNEL\MAKEFILE
01 ENTRYPOINT=0x00010400
01設定進入點的位址為 0x00010400。作業系統核心映像會被複製到這個位址並執行。

3.1.2.9.2 設定編譯器路徑

編譯程式需要編譯器,編譯器有C語言編譯器和組合語言編譯器。 因為筆者比較習慣用 NASM 的組合語言編譯器,所有組合語言都是用 NASM 編譯。 編譯器編譯程式碼完成後,產生目的檔,需要連結器將目的檔連結成執行檔。

   FORMOSA_V2\OSKERNEL\MAKEFILE
01 CC=c:\MinGW\bin\gcc.exe
02 AS=c:\MinGW\bin\as.exe
03 ASM=c:\nasm\nasm.exe
04 LD=c:\MinGW\bin\ld.exe
01設定 C 編譯器路徑。
02設定組合語言編譯器。
03設定 NASM 組合語言編譯器。
04設定連結器路徑。

3.1.2.9.3 設定編譯器參數

設定 C 語言編譯器、組合語言編譯器、連結器的參數。

   FORMOSA_V2\OSKERNEL\MAKEFILE
01 CFLAGS=-I include  -c -w  
02 ASMKFLAGS=-I include -f elf
03 LDFLAGS=-s -Ttext $(ENTRYPOINT) -o kernel.exe
01 C 語言編譯器的參數。
參數 -I include 表示標頭檔都在 include 目錄內。
參數 -c 表示編譯程式碼,但不執行連結,只產生目的檔。
參數 -w 表示壓抑所有警告訊息。
02C 語言編譯器的參數。
參數 -I include 表示標頭檔都在 include 目錄內。
參數 -f elf 表示生成 elf 格式的目的檔。
03連結器的參數。
參數 -s 表示將所有符號刪除,所以輸出檔不會有任何符號。
參數 -Ttext $(ENTRYPOINT) 表示取用 MAKEFILE 中的 ENTRYPOINT 常數值,做為程式內文 text section 的起始位址。
參數 -o kernel.exe 表示輸出檔名為 kernel.exe。

3.1.2.9.4 設定 SYSTEM 目的檔

系統區程式的目的檔,內容包括入口點、C 語言入口點、中斷管理器等程式碼的目的檔。 其中,入口點目的檔必須在最前面,因為它是整個多工作業系統的開始執行處。

   FORMOSA_V2\OSKERNEL\MAKEFILE
01 SYSTEM_OBJS= system\entry.o system\main.o system\interrupt.o system\systemlib.o \
02              system\systemgui.o

3.1.2.9.5 設定 DRIVER 目的檔

驅動程式的目的檔群,內容是各硬體的驅動程式,包括中斷控制器、時間控制器 、串列埠控制器、並列埠控制器、即時時鐘控制器、彩色螢幕控制器等驅動程式的目的檔。

   FORMOSA_V2\OSKERNEL\MAKEFILE
01 DRIVERS_OBJS= drivers\pic.o drivers\pic_a.o drivers\timer.o \
02               drivers\keyboard.o drivers\uart1.o \
03               drivers\uart2.o drivers\lptport1.o drivers\lptport2.o \
04               drivers\rtc.o drivers\mouse.o drivers\vga.o

3.1.2.9.6 設定 FFC 目的檔

FORMOSA FOUNDATION CLASS 的目的檔群,包括視窗、字幕、畫板等視窗元件的目的檔。

   FORMOSA_V2\OSKERNEL\MAKEFILE
01 FFC_OBJS= ffc\caption.o ffc\board.o ffc\window.o

3.1.2.9.7 設定 MIDDLEWARE 目的檔

中介軟體的目的檔群,包括 CONSOLE、XMODEM、字型等目的檔。

   FORMOSA_V2\OSKERNEL\MAKEFILE
01 MIDDLEWARE_OBJS= middleware\console.o middleware\gfxclut.o middleware\osd.o \
02                  middleware\xmodem.o middleware\font\font.o \
03                  middleware\font\font1.o middleware\font\font2.o \
04                  middleware\gui\gui.o middleware\gui\guitext.o

3.1.2.9.8 設定 APPLICATION 目的檔

視窗應用程式的目的檔群,包括桌面、小蜜蜂、計算機、拆炸彈等應用程式的目的檔。

   FORMOSA_V2\OSKERNEL\MAKEFILE
01 APPLICATIONS_OBJS= applications\desk\desk.o applications\desk\deskwindow.o \
02                    applications\desk\deskmouse.o applications\desk\deskactivewindow.o \
03                    applications\desk\deskinactivewindow.o applications\desk\deskwork.o \
04                    applications\desk\deskworkbar.o  applications\desk\deskmenu.o \
05                    applications\desk\deskcontrolpanel.o applications\desk\deskdevice.o \
06                    applications\desk\desktable.o applications\desk\deskdebug.o \
07                    applications\desk\desktime.o  applications\desk\deskbg.o \
08                    applications\desk\desklib.o \
09                    applications\bee\bee.o applications\bee\beefighter.o \
10                    applications\bee\beebullet.o applications\bee\beebees.o \
11                    applications\calculator\calculator.o applications\bomb\bomb.o

3.1.2.9.9 設定 TASK 目的檔

任務的目的檔群,包括桌面任務、命令提示字元任務、計算機任務、小蜜蜂任務、拆炸彈任務。

   FORMOSA_V2\OSKERNEL\MAKEFILE
01 TASK_OBJS= tasks\desktask.o tasks\shelltask.o tasks\calculatortask.o \
02            tasks\beetask.o tasks\bombtask.o

3.1.2.9.10 設定 OS 目的檔

多工核心的目的檔群,包括多工管理核、任務管理器、排程器、事件管理器、資源管理器、時間管理器、記憶體管理器、根任務等。

   FORMOSA_V2\OSKERNEL\MAKEFILE
01 OS_OBJ= os\os_lib_a.o os\os_lib.o os\os_core.o  os\os_task.o \
02         os\os_scheduler.o os\os_event.o os\os_resource.o os\os_time.o \
03         os\os_memory.o os\os_roottask.o

3.1.2.9.11 設定總目地檔

將所有的目的檔群匯整在一起,其中系統區目的檔群必須在最前面,因為系統區的入口點目的檔是整個作業系統的開始執行處。 連結器會依照前後次序將目的檔連結成執行檔,而入口點就會出現在整個執行檔的最前面。

   FORMOSA_V2\OSKERNEL\MAKEFILE
01 OBJS= $(SYSTEM_OBJS) $(OS_OBJ) $(DRIVERS_OBJS) $(FFC_OBJS) \
02       $(APPLICATIONS_OBJS) $(MIDDLEWARE_OBJS) \
03       $(TASK_OBJS) 

3.1.2.9.12 設定編譯規則

編譯規則是 MAKEFILE 的特點,執行編譯的過程是先確定相依檔是否存在,再執行編譯工作,完成所要的目標檔案後,停止編譯。 目標檔案在冒號前面,相依檔是在冒號後面,執行編譯的描述是在目標檔案與相依檔案描述的下一行開始,而且必須以 [TAB] 按鍵做執行編譯的描述的開頭。

   FORMOSA_V2\OSKERNEL\MAKEFILE
01 all : oskernel.exe
02 
03 oskernel.exe : $(OBJS)
04 	$(LD) $(LDFLAGS) -o oskernel.exe  $(OBJS)
05 
06 %.o: %.c
07 	$(CC)  $(CFLAGS) $< -o $@
08 
09 %.o: %.asm
10 	$(ASM)  $(ASMKFLAGS) $< -o $@
01設定最後要產生的目的檔案名稱
03~04設定要產生OSKERNEL.EXE的相依檔和編譯指令。編譯過程中,MAKE.EXE 會去尋找所有需要用到的相依檔。 若相依檔不存在,就執行在 06.07.09.10 行的相依檔的產生規則, 看能否產生缺少的相依檔。如果還是不行,就會顯示失敗訊息。
06~07設定從 *.c 產生 *.o 的相依檔和編譯指令
09~10設定從 *.asm 產生 *.o 的相依檔和編譯指令

3.2 執行作業系統

經過編譯的過程,得到作業系統的映像檔,再來就是要執行作業系統。 執行作業系統的方法可以用模擬的方式,也可以在 IBM 相容個人電腦上執行。 摸擬的方式是使用 VISUALBOX 這套免費的模擬軟體,模擬軟碟機開機、硬碟機開機和光碟機開機。 VISUALBOX 也可以模擬軟碟機和光碟機安裝作業系統到硬碟機的過程,之後,作業系統就可以使用 VISUALBOX 的虛擬硬碟機功能開機。 在個人電腦上的實際操作,就和 VISUALBOX 上的操作大同小異,可以從軟碟機和光碟機開機。 至於硬碟機開機,必須先使用軟碟機或光碟機將作業系統安裝到硬碟機。之後,才能從硬碟機開機。


3.2.1 軟碟機開機

軟碟機開機的方式可用軟碟片開機,也可以用VISUALBOX模擬軟碟片開機。


3.2.1.1 使用軟碟片開機

用軟碟片開機時,必須先把作業系統的映像檔 C:\FORMOSA_V2\IMAGE_FLOPPY\FLOPPY_OS.IMG 寫入軟碟片。 方法是使用 C:\FORMOSA_V2\UTILITIES\RWWRTWIN.EXE 把作業系統的映像檔寫入軟碟片。 將軟碟片取出,並置入設定為軟碟機開機的電腦的軟碟機中,再重開電腦,就可以看到使用軟碟機開機的作業系統畫面。

RWWRTWIN 操作畫面:

VISUALBOX

3.2.1.2 使用 VISUALBOX 模擬軟碟機開機

打開 VISUALBOX 的主畫面,按下 [設定值] 按鈕,再點入 [系統] 視窗。 系統視窗的開機順序中勾選軟碟機,其他的勾選都取消,按確定。

VISUALBOX


點入 [存放裝置] 視窗,確定存放裝置樹的軟碟控制器上有 FLOPPY_OS.IMG 軟碟映像檔。

VISUALBOX


回到 VISUALBOX 的主畫面,按下 [啟動] 按鈕,開始執行從軟碟機開機的模擬。

VISUALBOX



3.2.2 光碟機開機

光碟機開機的方式可用光碟機開機,也可以用 VISUALBOX 模擬光碟機開機。


3.2.2.1 使用光碟機開機

光碟機開機的原理是把光碟機模擬成軟碟機或硬碟機,在光碟片中埋入 BOOTUP 描述表以及開機映像檔,開機映像檔可用軟碟開機映像檔或硬 碟開機映像檔。BOOTUP 描述表本身會敘述要模擬軟碟機開機、硬碟機 開機,或不模擬任何磁碟機開機。本書所採用的是模擬軟碟機開機的方 式,方法是使用 HTTP://WWW.NU2.NU/BOOTCD/ 中所描述的做法, 下載 BCD 和 BFD 的壓縮檔,製作第一個光碟開機映像檔。 之後,筆者寫了一支應用程式,將光碟開機映像檔中的軟碟開機映像 檔置換成目前要用的軟碟開機映像檔,因此可以在編譯作業系統的批次檔 中就可以直接產生要用的光碟開機映像檔。

用光碟機開機時,必須先把作業系統的光碟開機映像檔 CDROM.ISO 寫入 光碟片。方法是使用光碟燒錄器把作業系統的映像檔寫入光碟片。之後, 把光碟片取出,置入用來測試的電腦的光碟機中,並把電腦的 BIOS 設定 為光碟片開機,再重開電腦就可以看到使用光碟機開機的作業系統的畫面。


3.2.2.2 使用 VISUALBOX 模擬光碟機開機

打開 VISUALBOX 的主畫面,按下 [設定值] 按鈕,再點入 [系統] 視窗。 系統視窗的開機順序中勾選光碟機,其他的勾選都取消,按確定。

VISUALBOX


點入 [存放裝置] 視窗,確定存放裝置樹的軟碟控制器上有 CDROM_OS.IMG 光碟映像檔。

VISUALBOX


回到 VISUALBOX 的主畫面,按下 [啟動] 按鈕,開始執行從光碟機開機的模擬。

VISUALBOX



3.2.3 硬碟機開機

硬碟機開機的方式可用硬碟機開機,也可以用 VISUALBOX 模擬硬碟機開機。


3.2.3.1 使用硬碟機開機

硬碟機開機不同於軟碟機開機和光碟機開機,硬碟機 開機必須經過一個安裝過程,將作業系統安裝到電腦的硬碟機中,之後 才能從硬碟機開機。這個安裝過程可以用軟碟機或光碟機安裝,安裝完 成後,電腦就可以從硬碟機開機了。軟碟片的安裝映像檔是 IMAGE_INSTALL\INSTALL_OS.IMG,使用 RWWRTWIN.EXE 將映像檔寫入軟碟片中。把軟碟片取出,再置入要安裝作業系統的電腦的 軟碟機中,開機後螢幕會出現執行結果,之後再將軟碟片取出,重新開 機,此時電腦就從硬碟機開機了。

光碟片的安裝映像檔是 IMAGE_INSTALL\CDROM_INSTALL.ISO, 使用光碟燒錄器把映像檔燒入光碟片中。再將光碟片置入要安裝作業系統的電腦光碟機中, 並把 BIOS 設定為 CDROM 開機,開機後螢幕會出現安裝結果, 再取出光碟片,重新開機,此時電腦就從硬碟機開機了。


3.2.3.2 使用 VISUALBOX 模擬硬碟機開機

用 VISUALBOX 模擬硬碟機開機之前,必須先將作業系統安裝到硬碟,之後,只要設定硬碟開機就可以模擬硬碟機開機。


3.2.3.2.1 安裝作業系統到虛擬硬碟機

用 VISUALBOX 模擬硬碟機開機之前,必須先將作業系統安裝到硬碟,之後,只要設定硬碟開機就可以模擬硬碟機開機。 安裝作業系統的方法可以透過軟碟映像檔或光碟映像檔,這裡以軟碟映像檔為範例說明安裝過程,光碟映像檔的安裝過程也差不多一樣。

首先,打開 VISUALBOX 的主畫面,按下 [設定值] 按鈕,再點入 [系統] 視窗。 系統視窗的開機順序中勾選軟碟機,其他的勾選都取消,按確定。

VISUALBOX


點入 [存放裝置] 視窗,確定存放裝置樹的軟碟控制器上的是 INSTALL_OS.IMG 的軟碟映像檔。 回到 VISUALBOX 的主畫面,按下 [啟動] 按鈕,開始執行從軟碟機開機的模擬。

VISUALBOX


作業系統安裝完成後,將虛擬電腦關機,即可。

VISUALBOX



3.2.3.2.2 從虛擬硬碟機開機

完成作業系統的安裝後,VISUALBOX 必須從軟碟機開機的模式轉換成硬碟開機模式。 方法是回到 VISUALBOX 的主畫面,按下 [設定值] 按鈕,再點入 [系統] 視窗。 系統視窗的開機順序中勾選硬碟機,其他的勾選都取消,按確定。

VISUALBOX


回到 VISUALBOX 的主畫面,按下 [啟動] 按鈕,開始執行硬碟機開機的模擬。

VISUALBOX


3.2.4 USB 開機

筆者在網路上找到一個工具軟體 UNETBOOTIN,並用這套軟體在 IBM A50 上實現 USB 開機。 不知道這樣的方式是否在每台支援 USB 開機的電腦上都適用,僅在這裡提供讀者一個實現的方法。


3.2.4.1 製作 USB 開機碟

USB 開機的原理是將 USB 碟模擬成軟碟機,因此需要軟碟映像檔製作 USB 開機碟。 筆者發現有時候會寫不進去,先將 USB 碟格式化,成功的機會比較高。

製作方法是,執行 UNETBOOTIN-WINDOWS-494.EXE。

VISUALBOX

在軟體的執行畫面中,執行下列步驟。
1、點選映像檔
2、點選磁片
3、選擇 C:\formosa_v2\image_floppy\floppy_os.img
4、指定 USB 磁碟機目錄
5、按確定

VISUALBOX

如果出現詢問視窗,按 YES_TO_ALL 按鈕。

VISUALBOX


3.2.4.2 使用 USB 碟開機

首先,確定電腦支援 USB 開機,並設定主機板的 USB 磁碟為第 1 開機順位。 將製作好的 USB 碟置入電腦的 USB 槽,開機,即可。


3.2.5 使用 XMODEM 執行作業系統

作業系統的開發過程必須是便利的,在不同的階段中,需要合適的工具來協助開發。 剛開始開發作業系統的過程中,使用 VISUALBOX 來開發很便利,也很準確,讓多工核心可以開發得很快速。 基本上,可以在 VISUALBOX 上可以模擬的作業系統,也都可以在實際的電腦環境中執行。 只是 VISUALBOX 畢竟是模擬器,無法完全取代電腦的硬體環境,這時候所面對的問題就是如何在實際的電腦上便利的開發作業系統。 本書提供一個方法,就是使用XMODEM 協定,透過串列埠一下載作業系統到電腦上執行。 目前 XMODEM 使用 9600 鮑率,所以下載速度約 1 KB/SEC。 把作業系統的映像檔的體積除以 1K 就可以估計出下載的時間。這樣的方法對於開發小型作業系統來說很便利。 筆者稱這樣的方法為 XBOOT,意思是使用 XMODEM 協定的 BOOTLOADER。

如果只是想要開發多工作業系統的核心的話,不必讀懂啟動磁區,也不用管真實模式轉換成保護膜式的過程。 讀者可以直接修改 OSKERNEL2 裡面的作業系統程式碼,經過完整的編譯過程後,會產生二進位檔 OSKERNEL.BIN。 直接將此二進位檔藉由 XMODEM 上傳送到執行本作業系統的電腦上,並執行之,即可。


3.2.5.1 編譯作業系統映像

電腦中已經有作業系統在執行了,那下載的作業系統要放哪裡呢? 筆者目前將透過 XMODEM 下載的作業系統的執行位址設定在 0x00100000。 這個位址剛剛好越過真實模式的最高位址。筆者的規劃是 1 MBYTES 以 下的記憶體位址給本機作業系統使用,而 1 MBYTES 以上的記憶 體位址就給由 XMODEM 下載的作業系統使用。如此一來,本機作業系統 可以使用的記憶體空間約有 500 KBYTES,這樣的體積對本機作業系統來說 已經很大了,不用擔心這兩個作業系統會撞在一起的危險。

讀者可以觀察 OSKERNEL\MAKEFILE 和 OSKERNEL2\MAKEFILE 兩個 MAKEFILE 的內容不一樣的地方。 前者的 MAKEFILE 中的 ENTRYPOINT 為 0x0010400,後者的 MAKEFILE 中的 ENTRYPOINT 為 0x00100000。 透過 MAKEFILE 的描述,可以將作業系統映像編譯到不一樣的執行位址上。

讀者也可以自行更改這個執行位址,重新編譯並下載執行。 只是還要去修改一點程式碼,就是要把 XMODEM 的下載位址設定為新的執行位址, 修改的方式是打開 OSKERNEL\INCLUDE\SYSTEM\DEFINE.H , 修改裡面的常數定義 IMAGE_ADDRESS 成新的執行位址值,重新編譯, 即可得到支援新的作業系統核心映像。


3.2.5.2 下載作業系統映像

遠端下載作業系統核心需要一條接在串列埠上的母對母 DSUB 9 資料傳輸線。 市面上的母對母 DSUB 9 訊號線的兩端接線方式是相同的,此時需要將一端的 TD(2) 和 RD(3) 對掉,才能在兩台電腦間傳輸資料。 所以如果買不到有跳線的 DSUB 9 訊號線,讀者可以自行焊接跳線。關於串列埠的接腳定義,請參考第 25 章 串列埠控制器。 將 DSUB 9 資料傳輸線接在兩台電腦的串列埠上,接著就可以進行作業系統的下載程序。

使用 XMODEM 下載作業系統,分幾個步驟進行:

步驟 說明
1 在 WINDOWS XP 的環境下執行超級終端機,建立新的連線,並將新的連線命名為 XMODEM,再選定使用連線為 COM1,再選定鮑率為 9600。 接下來在連接埠設定中,將資料位元選定為 8,同位元檢查選定為無,停止位元選定為 1,流量控制選定為無。 完成上述的設定之後,超級終端機就可以和執行本作業系統的電腦連線了。
2 將本作業系統啟動,直等到命令列出現時,鍵入 xmodem (必須小寫),並按 ENTER。 之後,作業系統就會執行 XMODEM 的程式,並且向 WINDOWS XP 電腦傳送信號 'C'。
3 回到 WINDOWS XP 的超級終端機,到[轉送]的目錄上,執行傳送檔案。 將傳送檔案的通信協定選定為 XMODEM ,檔案名稱選為 OSKERNEL2\OSKERNEL.BIN,按下 [傳送] 按鈕,執行檔案傳送。 傳送完成後,本作業系統會在螢幕上顯示傳送完成的相關資訊。
4 完成 XMODEM 的傳輸後,鍵入 run (必須小寫),按 [ENTER],然後電腦就會執行剛剛傳過來的作業系統了。 筆者把 這個作業系統的執行位址設定為 0x00100000,而原本的作業系統執行位址是 0x00010400 ,希望讀者明白它們的差異。

3.2.5.2.1 建立新的連線

在 WINDOWS XP 的環境下執行超級終端機,建立新的連線,並將新的連線命名為 XMODEM9600。

NASM

3.2.5.2.2 連線使用 COM1

設定連線使用的串列埠為 COM1。

NASM

3.2.5.2.3 設定 COM1 參數

設定鮑率為 9600,資料位元數為 8 位元,同位元檢查為無,停止位元為 1,流量控制為無。

NASM

3.2.5.2.4 傳送作業系統核心

將本作業­系統啟動,等到命令列出現時,鍵入 xmodem (必須小寫),並按 ENTER。 在 WINDOWS XP 的超級終端機上,進入 [轉送] 目錄,執行傳送檔案。 將傳送檔案的通信協定選定為 XMODEM ,檔案名稱選為 OSKERNEL2\OSKERNEL.BIN,按下 [傳送] 按鈕,執行檔案傳送。

NASM

傳送的訊息視窗會顯示傳送的封包數。

NASM

3.2.5.2.5 傳送完成畫面

傳送完成後,本作業系統會在螢幕上顯示完成訊息。

NASM

01  $xmodem
02   TotalBlockCount:00000200
03   ByteCount:00010000
04   pData:00110000
05   xmodem transfer done
06  $

01執行 xmodem 指令。
02~05執行完畢的訊息。
02所有封包數目 0x200 個封包。
03所有資料數目 0x10000 位元組。
04記憶體位址指標值 0x110000。

3.2.5.3 執行作業系統

傳送完畢,在本作業系統的命令列上鍵入 run 指令,執行從 XMODEM 上傳的作業系統。

01  $xmodem
02   ....
03   xmodem transfer done
04  $run

另一個作業系統的執行畫面:

NASM

3.3 安裝作業系統

為了在硬碟上執行本作業系統,必須經過一個安裝過程。這個安裝過程可以使用軟碟機安裝 ,也可以使用光碟機安裝。無論使用哪一種安裝方式,安裝完成的畫面都是一樣的。 筆者直接取用 VISUALBOX 的虛擬硬碟安裝畫面,因為實際上的硬碟安裝畫面也是如此。

作業系統安裝完成畫面。

VISUALBOX

3.3.1 軟碟機安裝

使用軟碟機安裝的方式是使用 RWWRTWIN.EXE 把 IMAGE_INSTALL\INSTALL_OS.IMG 寫到軟碟 片,再置入要安裝作業系統的電腦的軟碟機槽中,並設定 BIOS 為軟碟機開機,再重新開機後,作業 系統就會從軟碟機安裝到硬碟機中了。


3.3.2 光碟機安裝

使用光碟機的安裝方式是把 IMAGE_INSTALL\CDROM.ISO 燒寫至光碟片中,再將光碟片置入 要安裝作業系統的電腦光碟機中,並設定 BIOS 為光碟機開機,再重新開機後,作業系統就從光碟機 安裝到硬碟機中了。