BasicOS - A Minimal Operating System - Day1

BasicOS - A Minimal Operating System

Overview

心血來潮,準備寫一個操作系統(tǒng),記錄一下學(xué)習(xí)過程。主要參考著名的《恐龍書》。從bootloader開始,逐步實現(xiàn)一個最小的操作系統(tǒng)。
既然是操作系統(tǒng),那么就避免不了匯編語言。之后會使用C語言來實現(xiàn)。最后如果有余力的話,會使用Rust來實現(xiàn)。

環(huán)境

  • Ubuntu 24.04
  • qemu
  • nasm
  • gcc
  • make

安裝環(huán)境

sudo apt-get update
sudo apt-get install nasm qemu gcc gcc-multilib

安裝debug工具

sudo apt-get install xxd gdb

GitHub地址

https://xxxxx。xxx/toronto-andrew/BasicOS.git

先寫一個最簡單的bootloader

BIOS (Basic Input/Output System) 我們每個人都最熟悉了。當然,新的計算機都使用 UEFI(Unified Extensible Firmware Interface)了。
UEFI 和單純使用 BIOS 的區(qū)別在于加載內(nèi)核的方式、準備工作和高級功能等。這里為了方便起見,我們暫時只考慮 BIOS(因為最簡單)。

電腦剛一開機,BIOS 的作用是告訴計算機從哪里加載操作系統(tǒng)到內(nèi)存。于是,有人規(guī)定了,操作系統(tǒng)應(yīng)當放在存儲設(shè)備最開始的 512 字節(jié)(例如磁盤第 0 柱面第 0 磁頭第 0 扇區(qū))。這個區(qū)域就是我們的引導(dǎo)扇區(qū)。也就是說,操縱系統(tǒng)運行的第一行代碼就是在引導(dǎo)扇區(qū)中。
然而,一臺計算機可能有多個存儲設(shè)備,BIOS 依然不知道哪個設(shè)備存儲了引導(dǎo)扇區(qū)。但不知道誰又規(guī)定了,引導(dǎo)扇區(qū)的最后兩個字節(jié)必須是 0xaa55。于是,BIOS 只需要遍歷所有存儲設(shè)備,檢查他們的第 511 和 512 字節(jié)是否是 0xaa55。如果是,就說明找到了操作系統(tǒng)的位置,把這一段數(shù)據(jù)加載到內(nèi)存中,然后跳轉(zhuǎn)到這段代碼的第一個字節(jié)開始執(zhí)行。
因此,對于手動編寫一個引導(dǎo)扇區(qū)來說,只需要:
1 首先把最后兩個字節(jié)設(shè)置為 0xaa55;
2 然后從第一個字節(jié)開始寫上想要的代碼;
3 最后把其它的字節(jié)填充為 0,補滿 512 字節(jié)。

代碼如下boot.asm:

[bits 16]             ; 告訴匯編器我們是在 16 位下工作

jmp $                 ; $ 表示當前地址,跳轉(zhuǎn)到當前地址就是死循環(huán)

times 510-($-$$) db 0 ; $ 表示當前地址,$$ 表示當前段的開始地址
                      ; 510-($-$$) 計算出當前位置到 510 字節(jié)的距離,然后全部填充為 0

dw 0xaa55             ; 最后兩個字節(jié)是 0xaa55

編譯

nasm boot.asm -f bin -o boot.bin

運行

qemu-system-x86_64 boot.bin

你會看到窗口中顯示 Booting from Hard Disk...,然后它就開始執(zhí)行死循環(huán)了。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容