自制作業系統(一) 第一個作業系統

主世界發表於2020-10-03

在作業系統這一塊,以前我曾嘗試的去讀那些大作,結果發現看不太懂,後來又讀了《30天自制作業系統》,覺得簡單,就有自己的想法,但實現起來又是磕磕跘跘,然後就沒堅持下去,這次,我下定決心,要把《30…》和《orange,s一個作業系統的實現》一起看,然後慢慢探索,所以,開始吧。。。

開發環境:ubuntu20.0.4

因為我們的系統是從軟盤啟動的,所以有必要了解一下軟盤
軟盤:(1.44MB型)
0
啟動區(第一個扇區)
512
.
.
.
(共2880個扇區,所以軟盤容量=512B*2880=1.44MB)
啟動區:
電腦上電自檢後,從幾個儲存裝置中尋找作業系統,當軟盤的啟動區的最後兩個位元組為0x55,0xaa時,則認為這是一個可啟動的軟盤,於是從開頭開始執行.
不過我手頭沒有軟盤,也沒有軟碟機,所以要藉助虛擬軟盤
ctrl+alt+t開啟終端,輸入

dd if=/dev/zero of=cm.img bs=512 count=2880

dd是一個工具,if引數是寫入的源,這裡的/dev/zero可以無限的提供0,
of引數是輸出的源,cm.img就是我們要的虛擬磁碟,(順便說一下,我們的作業系統名字叫cm),bs引數是一次寫入的大小,count是寫入的次數,當然bs和count的設定不是最快的,但是是最清晰的(512*2880).
執行它,我們就得到了一個1.44MB的軟盤映像檔案
接著,我們就要寫軟盤的啟動區,所以要用一個檔案來寫入到啟動區,假如有檔案boot.bin,那麼

dd if=boot.bin of=cm.img bs=512 count=1

就能完成製作一個帶啟動區的軟盤,那boot.bin怎麼來呢?
這就要藉助程式的力量,組合語言是面向機器的低階語言,不受系統限制,所以用它來寫OS底層.
這裡用開源的編譯器nasm來開發
ubuntu上安裝:

sudo apt-get install nasm 

接著我們寫一個原始檔,boot.asm

org     0x7c00
call	begin
begin:
        mov     ax,cs
        mov     ds,ax
        mov     es,ax
        mov     ss,ax
        mov     sp,0x7c00
        mov     al,0x13
        mov     ah,0x00
        int    0x10
times 510-($-$$)        db      0
dw      0xaa55

編譯:

nasm boot.asm -o boot.bin

這樣boot.bin就有了
那怎麼讓這個作業系統執行呢?這裡要藉助虛擬機器的力量,這裡用qemu模擬電腦.
執行:

qemu-system-i386 -m 32 -fda cm.img

-m 32是指定記憶體為32MB,-fda就是虛擬的軟盤.
執行:
cm.img
沒什麼,就一個黑屏而已.

相關文章