本系列筆記來自狄泰未來 - 操作系統專題
基於x86架構從零開始編寫操作系統內核,旨在通過實踐的方式掌握操作系統原理
目錄
1、BIOS
什麼是操作系統?
- Windows,UNIX,Linux,Mac OS,Android,iOS.…
- 操作系統是直接運行於硬件之上的計算機程序
- 操作系統用於管理和控制計算機的硬件與軟件資源
- 操作系統爲用戶軟件的開發提供必要的服務和接口
現代計算機系統架構
BIOS - Base Input & Output System
- BIOS是計算機上電後第一個運行的程序
- BIOS首先檢測硬件狀態,檢測通過後立即進行硬件初始化
- BIOS會在內存中建立中斷向量表(提供硬件訪問的方法)
- BIOS 最後將控制權交由主引導程序執行
注意:BIOS不是軟件(Software),而是固件(Firmware)!
(固件是固化於硬件中的程序,在硬件出廠前已經燒寫固定)
系統啓動流程(×86架構)
BIOS 是如何被運行起來的?
BIOS的運行機制
- BIOS 存儲於ROM中,地址映射爲0xF0000-0XFFFFF(實地址)
- BIOS的入口地址爲:0XFFFF0
- 硬件電路的特殊設計使得:開機後,CPU從0XFFFF0處開始執行
BIOS 最後的使命
- 按照用戶設置掃描各個存儲介質(光驅,軟驅,U盤,等)
- 發現主引導區後,將主引導區中的主引導程序載入內存
- 主引導程序在內存中的入口地址爲0x7c00
- 將控制權交由主引程序執行(jmp 0x7c00)
問題
BIOS如何在存儲介質中尋找主引導區?
如何判斷引導區中有沒有主引導程序?
主引導區(MBR:Master Boot Record)
- 位置:位於存儲介質的最開始位置處,大小爲512字節
- 特點:前512字節的最後2個有效字節爲0x55aa
- 數據:0x55aa之前的數據被視爲主引導程序
更詳細的系統啓動流程(x86架構)
2、主引導程序
1、主引導程序
問題
主引導程序是軟件還是固件?如果是軟件,
那麼由誰開發?如何開發?
主引導程序
- 一段存儲在主引導區(MBR)中的有效代碼
- 並不固化於硬件,屬於操作系統代碼的一部分
- 啓動操作系統內核的橋樑,由彙編程序寫成
- 代碼總量不能超過512個字節(包含0x55aa)
主引導程序的開發
2、編寫一個主引導程序
課程實驗
- 編寫一個主引導程序(彙編語言)
- 可獨立運行於x86架構的主機(無操作系統)
- 運行後在屏幕上打印" Hello,DTOS!"
實現思路
1. 將關鍵寄存器的值設置爲0(mov ax,0)
2. 定義需要打印的數據(db"Hello,DTOS!")
3. 打印預定義好的字符數據(int 0x10)
中斷調用VS函數調用
編程實驗
第一個引導加載程序 boot.asm
org 0x7c00;指明入口
start:
mov ax, cs
mov ss, ax
mov ds, ax
mov es, ax
mov si, msg
print:
mov al, [si]
add si, 1
cmp al, 0x00
je last
mov ah, 0x0e
mov bx, 0x0f
int 0x10
jmp print
last:
hlt
jmp last
msg:
db 0x0a, 0x0a;換行
db "Hello DTOS!"
db 0x0a, 0x0a
times 510 -($-$$) db 0x00;
db 0x55, 0xaa
如何驗證編寫的主引導程序?
解決方案設計
- 將彙編源碼編譯爲二進制機器碼(nasm)
- 創建虛擬盤(bximage)
- 將二進制代碼寫入虛擬盤起始位置(dd)
- 在虛擬機中將虛擬盤作爲啓動盤執行(vmware)
把a.img拷到Windows下用VMware模擬計算機啓動
那麼如何調試主引導區的代碼?
3、調試環境的搭建(Bochs)
Bochs(另一款優秀的虛擬機軟件)
- 專業模擬x86架構的虛擬機
- 開源且高度可移植,由C++編寫完成
- 支持操作系統開發過程中的斷點調試
- 通過簡單配置就能夠運行絕大數主流的操作系統
支持調試功能的Bochs版本
1. 下載源碼:https://sourceforge.net/projects/bochs/files/
2. 解壓縮 bochs-2.x.x.tar.gz→bochs-2.x.x
3. 進入源碼目錄:cd bochs-2.x.x
4. 配置:./configure --enable-debugger --enable-disasm
5. 編譯:make
6. 安裝:sudo make install
再配置一次若提示gtk...錯誤,運行sudo apt-get install libgtk2.0-dev,再配置
網絡問題參考:https://blog.csdn.net/BoArmy/article/details/9002260
出現下面錯誤
缺少 pthread 庫,修改 Makefile 文件,添加下面的部分,然後成功編譯 Bochs 源碼。
配置Bochs的啓動文件
即必須
確定 bochs的安裝路徑(which bochs)
安裝vgabios(apt-get install vgabios)
確定vgabios的安裝路徑(whereis vgabios)
啓動文件bochsrc
###############################################################
# Configuration file for Bochs
###############################################################
# how much memory the emulated machine will have
megs: 32
# filename of ROM images
romimage: file=/usr/local/share/bochs/BIOS-bochs-latest
vgaromimage: file=/usr/share/vgabios/vgabios.bin
# what disk images will be used
floppya: 1_44=a.img, status=inserted
# choose the boot disk.
boot: floppy
# where do we send log messages?
# log: bochsout.txt
# disable the mouse
mouse: enabled=0
# enable key mapping, using US layout as default.
keyboard_mapping: enabled=1, map=/usr/local/share/bochs/keymaps/x11-pc-us.map
啓動bochs虛擬機(通過啓動文件)
- 顯示方式:bochs -f bochsrc_file
- 隱式方式:bochs(嘗試尋找下列啓動文件)
continue繼續執行
Bochs中的常用調試命令
4、小結
BIOS 是計算機上電後第一個運行的程序
BIOS 進行必要的初始化,並加載運行主引導程序
主引導程序位於存儲介質的最開始512字節處
主引導程序負責後續初始化,並加載運行操作系統內核
主引導程序的代碼量不能超過512字節
主引導程序需要使用彙編語言開發
主引導程序中可以通過BIOS中斷使用硬件功能
主引導程序運行於實模式(地址都是實際的物理地址)
Bochs 是一款專業模擬x86架構的虛擬機
從源碼安裝Bochs 可以獲得調試功能的支持
Bochs的啓動配置文件是正確運行關鍵
Bochs 支持斷點調試,其調試命令與GDB類似
下一步將會講解:主引導程序的擴展