Hello DTOS

本系列筆記來自狄泰未來 - 操作系統專題

基於x86架構從零開始編寫操作系統內核,旨在通過實踐的方式掌握操作系統原理


目錄

1、BIOS

2、主引導程序

1、主引導程序

2、編寫一個主引導程序

3、調試環境的搭建(Bochs)

4、小結


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類似


下一步將會講解:主引導程序的擴展

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章