繼上篇"自製作業系統原始碼公佈"後,發現讀者們使用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" & |
記得使用完github,要將下列PAgent 圖示,按滑鼠右鍵,選Exit結束程式。
4. 下載 BOS v0.2 原始碼
使用git 前,請確認GIT_SSH環境變數:
註:可在Windos 系統內容->進階->環境變數->系統變數 中修改GIT_SSH。
請下載最近原始碼
5. 編繹Bos
在編繹過程發現原本由CYGWIN所安裝的gcc 只支援PE 格式,所編繹出來的obj file 格式為 Windows coff @.@。
但main.s同時包含16位元與32位元程式碼用以進入32位元保護模式, 所以會產生下列錯誤。
目前編繹obj檔案格式參照
目前解決方法有二:
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)
已修改使用新的Toolchain, 下列為編繹成功範例。
在windows 上使用VMware Player來執行, 請建立一新的虛擬機器,
在使用磁片檔部分填入所產生的bos.img 的檔案路徑及名稱,如下所示,
接著執行,便可看到本文開頭的執行畫面。
讀者們若對編繹及執行BOS系統在windows+cygwin上有任何問題?
另外筆者最近寫了許多新文章,這裡有個小問題,請問一下讀者們,有什麼想看的技術主題?
歡迎留言交流。
註:此次9/6活動已加入TOSSUG行程(請參閱http://www.tossug.org/2011)
使用git 前,請確認GIT_SSH環境變數:
$ export | grep GIT declare -x GIT_SSH="C:\\yourpath\\plink.exe" |
請下載最近原始碼
$ 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. |
$ 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 |
但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 |
$ 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 |
$ 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 |
在使用磁片檔部分填入所產生的bos.img 的檔案路徑及名稱,如下所示,
接著執行,便可看到本文開頭的執行畫面。
讀者們若對編繹及執行BOS系統在windows+cygwin上有任何問題?
另外筆者最近寫了許多新文章,這裡有個小問題,請問一下讀者們,有什麼想看的技術主題?
歡迎留言交流。
註:此次9/6活動已加入TOSSUG行程(請參閱http://www.tossug.org/2011)
沒有留言:
張貼留言