自己动手写操作系统 - Hello DTOS
本系列筆記參考整理于狄泰未來 - 操作系統專題、于淵 《自己動手寫操作系統》(《一個操作系統的實現》)
基于x86架構從零開始編寫操作系統內核,旨在通過實踐的方式掌握操作系統原理
目錄
1、BIOS
2、主引導程序
1、主引導程序
2、編寫一個主引導程序
3、主引導程序的擴展
3、調試環境的搭建(Bochs)
4、小結
1、BIOS
什么是操作系統?
? ? - Windows,UNIX,Linux,Mac OS,Android,iOS.…
? ? - 操作系統是直接運行于硬件之上的計算機程序
? ? - 操作系統用于管理和控制計算機的硬件與軟件資源
? ? - 操作系統為用戶軟件的開發提供必要的服務和接口
現代計算機系統架構
BIOS - Base Input & Output System
? ? - BIOS是計算機上電后第一個運行的程序
? ? - BIOS首先檢測硬件狀態,檢測通過后立即進行硬件初始化
? ? - BIOS會在內存中建立中斷向量表(提供硬件訪問的方法)
? ? - BIOS 最后將控制權交由主引導程序執行
注意:BIOS不是軟件(Software),而是固件(Firmware)!
? ? ? ? (固件是固化于硬件中的程序,在硬件出廠前已經燒寫固定)
關于中斷向量表和BIOS的詳細介紹可參考:王爽《匯編語言》筆記(詳細)·?十一、內中斷
系統啟動流程(×86架構)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? BIOS 是如何被運行起來的?
BIOS的運行機制
? ? - BIOS 存儲于ROM中,地址映射為0xF0000-0XFFFFF(實地址)
? ? - BIOS的入口地址為:0XFFFF0
? ? - 硬件電路的特殊設計使得:開機后,CPU從0XFFFF0處開始執行
? ? ? ? ? ?★ 開機后,CPU一加電,初始化(CS)= 0FFFFH,(IP)= 0,自動從FFFF:0單元開始執行程序
? ? ? ? ? ?★ FFFF:0處有一條轉跳指令,CPU執行該指令后,轉去執行BIOS中的硬件系統檢測和初始化程序。
? ? ? ? ? ?★ 初始化程序將建立BIOS所支持的中斷向量,即將BIOS提供的中斷例程的入口地址登記在中斷向量表中
? ? ? ? ? ?★ 硬件系統檢測和初始化完成后,調用int 19h進行操作系統的引導。從此將計算機交由操作系統控制
BIOS 最后的使命
? ? - 按照用戶設置掃描各個存儲介質(光驅,軟驅,U盤,等)
? ? - 發現主引導區后,將主引導區中的主引導程序載入內存
? ? - 主引導程序在內存中的入口地址為0x0000 : 0x7c00(即0x07c00)
? ? - 將控制權交由主引程序執行(jmp 0x0000:0x7c00)
問題
? ? ? BIOS如何在存儲介質中尋找主引導區?
? ? ? 如何判斷引導區中有沒有主引導程序?
主引導區(記錄)(MBR:Master Boot Record)
? ? - 位置:位于存儲介質的最開始位置處,大小為512字節
? ? - 特點:前512字節的最后2個有效字節為0x55aa
? ? - 數據:0x55aa之前的數據被視為主引導程序
例如:使用二進程工具查看我的C盤(GPT分區)如下
? ? ? ? ? ? ? ? ? ? ? ? ? ? 關于MBR和GPT的知識點是裝系統必掌握的知識點,篇幅有限,不解釋
更詳細的系統啟動流程(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;告訴編譯器程序將加載到內存7c00偏移處start:mov ax, csmov ss, axmov ds, axmov es, axmov si, msgprint:mov al, [si] ;默認段地址dsadd si, 1cmp al, 0x00je last ;almov ah, 0x0e ;10號中斷0e號子功能:打印字符 參數:AH=0EH,AL=字符,BH=頁碼,BL=前景色(圖形模式)mov bx, 0x0f ;字符顏色int 0x10 jmp printlast:hlt ;停止運行,CPU進入暫停狀態,不執行任何操作,HLT instruction with IF=0!jmp last msg:db 0x0a, 0x0a;換行db "Hello DTOS!"db 0x0a, 0x0atimes 510 -($-$$) db 0x00;db 0x55, 0xaa$是當行的匯編地址,$$是是當前匯編節(段)的起始匯編地址,當前程序沒有定義節或段,默認生成一個匯編段,起始匯編地址為0。當前程序還很簡陋,但后續會一步步完善。
如何驗證編寫的主引導程序?
解決方案設計
? ? - 將匯編源碼編譯為二進制機器碼(nasm)
? ? - 創建虛擬盤(bximage)
? ? - 將二進制代碼寫入虛擬盤起始位置(dd)
? ? - 在虛擬機中將虛擬盤作為啟動盤執行(vmware)
把a.img拷到Windows下用VMware模擬計算機啟動
? ? ? ? ? ? ? ? ? ? ? ? ?那么如何調試主引導區的代碼?
?
3、主引導程序的擴展
限制
? ? ? ? 主引導程序的代碼量不能超過512字節!!
突破限制的思路
? ? -?主引導程序
? ? ? 1. 完成最基本的初始化工作
? ? ? 2. 從存儲介質中加載新程序到內存中
? ? ? 3. 將控制權交由新加載的程序執行(jmp)
? ? ? 4. ...
? ? ? ? ? ? ? ? ? ? ?主引導程序如何加載存儲介質中的其它程序?后續講解
?
3、調試環境的搭建(Bochs)
Bochs(另一款優秀的虛擬機軟件)
? ? - 專業模擬x86架構的虛擬機
? ? - 開源且高度可移植,由C++編寫完成
? ? - 支持操作系統開發過程中的斷點調試
? ? - 通過簡單配置就能夠運行絕大數主流的操作系統
支持調試功能的Bochs版本
1. 下載源碼:https://sourceforge.net/projects/bochs/files/
2. 解壓縮 bochs-2.x.x.tar.gz→bochs-2.x.x(這里選擇 bochs-2.4.5)
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,再配置
若出現下面錯誤
? ? ? ? ? ? ? ? ? ? ? ? ? 缺少?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(嘗試尋找下列啟動文件)
? ? ? ? ? ? ? ? ? ? ? 輸入c(continue)繼續執行?
Bochs中的常用調試命令
?
4、小結
BIOS 是計算機上電后第一個運行的程序
BIOS 進行必要的初始化,并加載運行主引導程序
主引導程序位于存儲介質的最開始512字節處
主引導程序負責后續初始化,并加載運行操作系統內核
主引導程序的代碼量不能超過512字節
可以通過主引導程序加載新程序的方式突破限制
主引導程序需要使用匯編語言開發
主引導程序中可以通過BIOS中斷使用硬件功能
主引導程序運行于實模式(地址都是實際的物理地址)
Bochs 是一款專業模擬x86架構的虛擬機
從源碼安裝Bochs 可以獲得調試功能的支持
Bochs的啟動配置文件是正確運行關鍵
Bochs 支持斷點調試,其調試命令與GDB類似
?
總結
以上是生活随笔為你收集整理的自己动手写操作系统 - Hello DTOS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 入行必看、经验不足必看:财务会计需要会的
- 下一篇: 前端学习(2454):用户登录