2020年10月14日 星期三

自幹OS筆記 - 01 用手寫binary生出來的OS

 開始工作後下班有些時間可以自學東西

終於可以來學之前在學校一直沒時間弄的自幹OS

所以這一系列大概就是自己的筆記加上碎碎念

寫文章紀錄下來,還順便督促自己要有進度

目標是研替新訓前寫完拉  大概到12月中左右


接下來的文章主要是根據Nick Blundell的文件 Writing a Simple Operating System —from Scratch 來開發  後續如果有其他參考文件會陸續補上

進入正題

以前只知道電腦按下開機鍵後  首先會載入主機板上燒好的BIOS(我已經不確定是Assembly還是C寫的)

BIOS會先檢查該有的硬體有沒有(沒記憶體  沒硬碟之類的會嗶嗶叫)

後面的事情就是莫名其妙OS就被載入了(X


所以在BIOS掃完硬體之後做了什麼事情?

目前的理解是 它會掃描所有它認得的儲存裝置(HDD SSD 光碟 軟碟...)

然後查看每個儲存裝置上的第一個sector (512 Bytes)

如果最後 2 Bytes 是 0xaa55 的話!  代表他是開機磁區

(但之後的grub我還不知道在那上場  有機會再補  應該吧)

所以最簡單的可以被認出來的OS(?) 就是 512 Bytes 

裡面的內容只有 最後兩個Bytes設定為 0xaa55 就好

因為要模擬的硬體是x86架構  所以要用little-endian (變成0x55aa)

實際上整個檔案內容長得下面這樣 

        0000 0000 0000 0000 0000 0000 0000 0000

        ....

        0000 0000 0000 0000 0000 0000 0000 55aa


但是!!!  我參考的文件裡面寫的不是這樣

是像下面這樣

        e9fd ff00 0000 0000 0000 0000 0000 0000

        ....

        0000 0000 0000 0000 0000 0000 0000 55aa

解釋是說 e9 fd ff 代表 endless jump (但我還是不清楚在幹麻

也許之後看完會懂吧(?  沒懂再慢慢查QAQ

------------------------------------------------------------------

2020/10/19補充:

0xe9 代表的是 jmp 指令  後面要接上跳到的位置

0xfdff 應該看成 0xfffd 代表的是 16-bit 中的數字 -3

所以整個來說就是 jmp 回 -3 bytes 的位置

等於 jmp 指令的開頭  所以會一直重複執行這個 jmp 指令

-------------------------------------------------------------------


然後因為要跑這個 OS(?)  總不可能準備一台電腦在那給我玩

所以就用 Qemu 來模擬硬體(雖然我不知道Qemu到底是啥)

總之就是用Qemu來模擬x86的硬體跑這個 OS

Ubuntu (Debian 系列的Distro) 用下面指令安裝

        sudo apt install qemu-system

然後執行的時候

        qemu-system-i386 boot.bin

(boot.bin就是我們 512 Bytes 的OS)

執行後出現 "Booting from Hard Disk..." 的字出現就代表成功了!

沒有留言:

張貼留言

Go lang 學習筆記 - 17 Pointers

``` package main import "fmt" func zeroval(n int) {         n = 0 } func zeroptr(n *int) {         *n = 0 } func main() {         ...