2011年8月21日 星期日

自製開發BenOS支援Windows+Cygwin


vmplayer_bos_run
繼上篇"自製作業系統原始碼公佈"後,發現讀者們使用Windows系統比例高達7成。
筆者便在想,讓自製的小系統也能直接在Windows 裡編繹並使用其虛擬機器執行。
1. 安裝Cygwin
(但Cygwin 所附的bash login console 介面,限制頗多,不太方便,所以下載mintty來使用 (它以putty程式碼修改而來)。
在安裝過程中,請記得選取並安裝gcc 和nasm套件,用來編繹主程式及組合語言部分。
2. 安裝mtools
在Bos v0.2後,使用了mcopy。可參考 英文原文此文下載安裝。
3. 安裝 git + pagent.exe
因為要使用github,而其中需要使用上傳檔案的key,
所以利用pagent.exe 將key提供給git 使用。(試過使用ssh,但不能正常工作)
目前筆者在使用github 前,使用下列命令將key載入,
bash file: load_pagent_with_key
/cygdrive/c/yourpath/pageant.exe "c:\\youpath\\your_key_generate_by_puttygen.ppk" &
接著pagent.exe 會跳出輸入密碼的視窗,輸入後便載入完成。
記得使用完github,要將下列PAgent 圖示,按滑鼠右鍵,選Exit結束程式。




4. 下載 BOS v0.2 原始碼
使用git 前,請確認GIT_SSH環境變數:
$ export | grep GIT
declare -x GIT_SSH="C:\\yourpath\\plink.exe"
註:可在Windos 系統內容->進階->環境變數->系統變數 中修改GIT_SSH。
請下載最近原始碼
$ git clone git@github.com:benwei/bos.git
Initialized empty Git repository in C:/src/
github/bos/.git/
remote: Counting objects: 65, done.
remote: Compressing objects: 100% (58/58), done.
remote: Total 65 (delta 5), reused 63 (delta 3) KiB/s
Receiving objects: 100% (65/65), 32.73 KiB | 31 KiB/s, done.
Resolving deltas: 100% (5/5), done.
5. 編繹Bos
$ make
… ignored
nasm -f elf32 kernel/main.s -o kernel/main.o -Iinclude/ # -l kernel/main.lst
nasm -f elf32 kernel/osfunc.s -o kernel/osfunc.o -Iinclude/ # -l kernel/osfunc
.lst
ld -nostdlib -static -e _start --no-undefined -X -T ld-script.lds -Map MYOS.map
-o myos.elf kernel/init.o kernel/kthread.o lib/describtbl.o lib/fifo.o lib/file.
o lib/floppy.o lib/interrupt.o lib/keyboard.o lib/memory.o lib/mtask.o lib/timer
.o blibc/screen.o blibc/stdio.o blibc/string.o apps/bshell.o kernel/main.o kerne
l/osfunc.o
ld: cannot perform PE operations on non PE output file 'myos.elf'.
make: *** [myos.elf] Error 1
在編繹過程發現原本由CYGWIN所安裝的gcc 只支援PE 格式,所編繹出來的obj file 格式為 Windows coff @.@。
但main.s同時包含16位元與32位元程式碼用以進入32位元保護模式, 所以會產生下列錯誤。
$ make CYGWIN=1
nasm -f win32 kernel/main.s -o kernel/main.o -Iinclude/ # -l kernel/main.lst
begdt.inc:24: error: COFF format does not support non-32-bit relocations
kernel/main.s:75: error: COFF format does not support non-32-bit relocations
kernel/main.s:89: error: COFF format does not support non-32-bit relocations
make: *** [kernel/main.o] Error 1
目前編繹obj檔案格式參照
$ file bos/kernel/init.o
bos/kernel/init.o: MS Windows COFF Intel 80386 object file
$ file bos/kernel/main.o
bos/kernel/main.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
目前解決方法有二:
1. 改寫main.s 將進保護模式部分移到開機程式中,使其能順利使用 nasm –f win32 編繹。
2. 使用cross compiler, 參考OSDev.og文章GCC Cross Compiler
筆者選擇使用方法二,主因是BOS可能會支援ARM或其他平台。看了此篇Cross-Compiler Successful Builds
使用binutils-2.20 + gcc-4.4.3 的組合,編繹了一版ToolChain,由此下載。
cygwin_toolchain4_bos0821.tgz (md5sum: e06bdccb2c44c4cc65097399e8722d95)
$ cd /
$ tar zxvf <your download path>/cygwin_toolchain4_bos0821.tgz
已修改使用新的Toolchain, 下列為編繹成功範例。
$ make
nasm -o bootldr.elf boot/bootldr.s -I include
nasm -f elf32 kernel/main.s -o kernel/main.o -Iinclude/ # -l kernel/main.lst
nasm -f elf32 kernel/osfunc.s -o kernel/osfunc.o -Iinclude/ # -l kernel/osfun
.lst
building [kernel/init.c] -> [kernel/init.o]
building [kernel/kthread.c] -> [kernel/kthread.o]
building [lib/describtbl.c] -> [lib/describtbl.o]
building [lib/fifo.c] -> [lib/fifo.o]
building [lib/file.c] -> [lib/file.o]
building [lib/floppy.c] -> [lib/floppy.o]
building [lib/interrupt.c] -> [lib/interrupt.o]
building [lib/keyboard.c] -> [lib/keyboard.o]
building [lib/memory.c] -> [lib/memory.o]
building [lib/mtask.c] -> [lib/mtask.o]
building [lib/timer.c] -> [lib/timer.o]
building [blibc/screen.c] -> [blibc/screen.o]
building [blibc/stdio.c] -> [blibc/stdio.o]
building [blibc/string.c] -> [blibc/string.o]
building [apps/bshell.c] -> [apps/bshell.o]
/usr/local/cross/bin/i586-elf-ld -nostdlib -static -e _start -s -Ttext 500 -Map
MYOS.map -o myos.elf kernel/main.o kernel/osfunc.o kernel/init.o kernel/kthrea
.o lib/describtbl.o lib/fifo.o lib/file.o lib/floppy.o lib/interrupt.o lib/keyb
ard.o lib/memory.o lib/mtask.o lib/timer.o blibc/screen.o blibc/stdio.o blibc/s
ring.o apps/bshell.o
echo "convert myos.elf MYOS.BIN"
convert myos.elf MYOS.BIN
/usr/local/cross/bin/i586-elf-objcopy -I elf32-i386 -O binary -R .pdr -R .note
R .note.gnu.build-id -R .comment -S myos.elf MYOS.BIN
$ make package
dd if=./bootldr.elf of=bos.img seek=0 count=1
1+0 records in
1+0 records out
512 bytes (512 B) copied, 0.000172887 s, 3.0 MB/s
dd if=/dev/zero of="bos.img" seek=1 count=2879
2879+0 records in
2879+0 records out
1474048 bytes (1.5 MB) copied, 0.011148 s, 132 MB/s
mcopy -i "bos.img" "MYOS.BIN" ::
mdir -i "bos.img"
Volume in drive : has no label
Volume Serial Number is A0A1-A2A3
Directory for ::/
MYOS BIN 19576 2011-08-21 21:07
1 file 19 576 bytes
1 437 696 bytes free
在windows 上使用VMware Player來執行, 請建立一新的虛擬機器,
在使用磁片檔部分填入所產生的bos.img 的檔案路徑及名稱,如下所示,
vmplayer_bos
接著執行,便可看到本文開頭的執行畫面。
讀者們若對編繹及執行BOS系統在windows+cygwin上有任何問題?
另外筆者最近寫了許多新文章,這裡有個小問題,請問一下讀者們,有什麼想看的技術主題?
歡迎留言交流。
註:此次9/6活動已加入TOSSUG行程(請參閱http://www.tossug.org/2011)

沒有留言: