2012年3月8日

【DIY Kernel】環境建置



這學期修了一門 "作業系統工程" 的課
教的是自己製作一個OS Kernel
這是一門有趣又好玩但是很難的課程!!
以後每個禮拜都要把筆記寫下來
免得太困難的部分未來會忘掉

先補上第一次上課的內容
也就是環境建置
這篇有可能會用到的工具可以在此下載

首先要熟悉電腦開機流程
可參考
http://people.cs.nctu.edu.tw/~huangmc/works/web/Boot_x86/Boot_x86.html

實際上
不可能真的修改boot loader
一直重開機會很耗時
所以用虛擬的環境bochs來模擬x86環境
http://bochs.sourceforge.net/
選擇GRUB當boot loader

並且使用VFD(Virtual Floopy Disk)來製作與修改磁碟片映像檔

還需要一個已經具有GRUB開機管理程式的印象檔
來製作自己的印象檔(這步驟可省略,可直接拿已有寫入MBR的Image來修改)

並使用cygwin模擬Linux環境
並選擇安裝
gcc
nasm
automake
用來編譯kernel

工具都準備好之後
就可以開始建置開發環境了

製作自己的可開機印象檔

首先將bochs和vfd解壓縮與安裝好
開啟vfd(Vista以上請使用管理員身分執行)
建立一個空的image檔案


這時可以打開A磁碟
發現裡面是空的
之後將GRUB解壓縮丟進去


然後存檔


之後開啟Bochs
Edit Option 選擇 Disk & Boot
再選旁邊的Edit

Floopy Option 選擇已經可開機 Image (floopy.img)


然後按OK和Start
順利的話可看見grub commend line


按左上角A磁碟的圖示
修改掛載的A磁碟 Image 為我們剛製作的Image


就可以看見bochs出現掛載的訊息
這時我們在grub輸入 setup (fd0)
這樣就完成自己製作的可開機印象檔了




製作menu.lst

menu.lst可說是grub的開機選單
方便我們可以製作多個kernel並選擇要用哪個kernel啟動
首先掛載剛剛製作好的Image
並在A:\boot\grub
下建立一個純文字檔案
並輸入
title MyOS
root (fd0)
kernel /boot/kernel.elf
boot

title就是要顯示的名稱
root 是kernel 所在的根目錄
kernel 是以root為基礎的 kernel 相對位置

可以依據自己的喜好來設定

編譯Kernel

老師對我們很好
提供了一個最基礎的kernel
以後就方便在上面加東西啦
用管理員身分打開cygwin(這樣就等於有root權限)
進入放著原始kernel的資料夾


發現已經有Makefile
所以直接輸入指令 make
即可編譯
(kernel的source code細節略過)
編號成功後發現多了一個檔案叫kernel.elf
把這個kernel.elf丟進掛載好的Image裡
對應menu.lst的路徑
重新啟動bochs就可以用自己編譯的kernel開機了!

建立自動執行檔

目前為止,整個流程大致如下
編譯完kernel
複製kernel.elf到印象檔裡
然後儲存印象檔
開啟bochs
選擇disk&boot
選擇我們的印象檔
開機

如果每次編譯完都要執行這一串步驟
肯定會很累
所以要寫一個屬於自己的自動執行檔
簡化以上的步驟
首先在make完之後直接將kernel.elf複製到A磁碟
所以修改Makefile
在objcopy下一行加入
cp -a kernel.elf /cygdrive/a/boot/kernel.elf

再另外寫一個run.sh
要做的事有
1. 存檔
2. 用bochs開啟印象檔

#!/bin/bash
/your/vfd/path/vfd.exe save
/your/bochs/path/bochs -f bochsrc.bxrc -q

而bochsrc.bxrc則是從bochs選擇完你的Image
之後左邊有個Save
可以把設定儲存起來

這樣就完成自動執行的腳本了

沒有留言:

張貼留言