個人資料
正文

BasicOS - A Minimal Operating System - Day 1

(2024-12-09 13:19:07) 下一個
# BasicOS - A Minimal Operating System
 
## Overview
心血來潮,準備寫一個操作係統,記錄一下學習過程。主要參考著名的《恐龍書》。從bootloader開始,逐步實現一個最小的操作係統。
既然是操作係統,那麽就避免不了匯編語言。之後會使用C語言來實現。最後如果有餘力的話,會使用Rust來實現。
 
## 環境
- Ubuntu 24.04
- qemu
- nasm
- gcc
- make  
 
## 安裝環境
```bash
sudo apt-get update
sudo apt-get install nasm qemu gcc gcc-multilib
```
 
## 安裝debug工具 
```bash
sudo apt-get install xxd gdb
```
## GitHub地址
https://github.com/toronto-andrew/BasicOS.git
 
##先寫一個最簡單的bootloader
BIOS (Basic Input/Output System) 我們每個人都最熟悉了。當然,新的計算機都使用 UEFI(Unified Extensible Firmware Interface)了。
UEFI 和單純使用 BIOS 的區別在於加載內核的方式、準備工作和高級功能等。這裏為了方便起見,我們暫時隻考慮 BIOS(因為最簡單)。
 
電腦剛一開機,BIOS 的作用是告訴計算機從哪裏加載操作係統到內存。於是,有人規定了,操作係統應當放在存儲設備最開始的 512 字節(例如磁盤第 0 柱麵第 0 磁頭第 0 扇區)。這個區域就是我們的引導扇區。也就是說,操縱係統運行的第一行代碼就是在引導扇區中。
然而,一台計算機可能有多個存儲設備,BIOS 依然不知道哪個設備存儲了引導扇區。但不知道誰又規定了,引導扇區的最後兩個字節必須是 0xaa55。於是,BIOS 隻需要遍曆所有存儲設備,檢查他們的第 511 和 512 字節是否是 0xaa55。如果是,就說明找到了操作係統的位置,把這一段數據加載到內存中,然後跳轉到這段代碼的第一個字節開始執行。
因此,對於手動編寫一個引導扇區來說,隻需要:
1 首先把最後兩個字節設置為 0xaa55;
2 然後從第一個字節開始寫上想要的代碼;
3 最後把其它的字節填充為 0,補滿 512 字節。
 
代碼如下boot.asm:
```
[bits 16]             ; 告訴匯編器我們是在 16 位下工作
 
jmp $                 ; $ 表示當前地址,跳轉到當前地址就是死循環
 
times 510-($-$$) db 0 ; $ 表示當前地址,$$ 表示當前段的開始地址
                      ; 510-($-$$) 計算出當前位置到 510 字節的距離,然後全部填充為 0
 
dw 0xaa55             ; 最後兩個字節是 0xaa55
```
##編譯
nasm boot.asm -f bin -o boot.bin
 
##運行
qemu-system-x86_64 boot.bin
 
你會看到窗口中顯示 Booting from Hard Disk...,然後它就開始執行死循環了。
[ 打印 ]
閱讀 ()評論 (0)
評論
目前還沒有任何評論
登錄後才可評論.