作業系統真象還原之實驗一:第一次撰寫mbr
對應書中第2.3節:讓mbr飛一會 第58頁
1.相關基礎知識提煉總結
1.1電腦開機前與后

在電腦未開機前,BIOS就被加載到記憶體的F0000~FFFFF中,此區域為ROM
MBR被加載到磁盤的0盤0道1扇區(CHS方式)
CHS 方式中扇區的編號是從1開始的
當電腦按下power鍵后,cs:ip會被強制置為F000:FFF0 ,所以cpu會執行記憶體地址FFFF0處的指令,
FFFF0處的指令為跳轉指令jmp far f000:e05b,
跳轉后,BIOS便馬不停蹄地檢測記憶體、顯卡等外設資訊,當檢測通過,并初始化好硬體后,開始在記憶體中 0x000~0x3FF處建立資料結構,中斷向量表 IVT 并填寫中斷例程,
BIOS 最后一項作業校驗啟動盤中位于0盤0道1扇區的內容,
如果此扇區末尾的兩個位元組分別是魔數0x55和0xaa,就會把該扇區內容加載到記憶體地址 0x7c00處,
然后執行跳轉指令jmp 0: 0x7c00
2.實驗記錄
2.1 實驗目的
撰寫mbr.s程式,該程式可以在顯示屏列印欄位,將該程式加載到磁盤的0盤0道1扇區,使用bochs模擬,確保當計算機執行完BIOS后可以執行mbr.s,在顯示屏列印欄位,
2.2 實驗代碼
; mbr.S
; 主引導程式
; --------------------------------------------------
SECTION MBR vstart=0x7c00 ; 把起始地址編譯為 0x7c00
mov ax, cs ; cs 代碼段暫存器
mov ds, ax ; dx 資料段暫存器
mov es, ax ; es 附加段暫存器
mov ss, ax ; ss 堆疊段暫存器
mov fs, ax ; fs 80386 后添加的暫存器,無全稱
mov sp, 0x7c00 ; sp 堆疊指標暫存器
; 清屏
; --------------------------------------------------
; INT 0x10 功能號: 0x06 功能描述:上卷視窗
; --------------------------------------------------
; 輸入:
; AH 功能號 = 0x06
; AL = 上卷的行數(如果為0,表示全部)
; BH = 上卷行屬性
; (CL, CH) = 視窗左上角的 (X, Y) 位置
; (DL, DH) = 視窗右下角的 (X, Y) 位置
; 無回傳值:
mov ax, 0x600
mov bx, 0x700
mov cx, 0
mov dx, 0x184f ; 右下角: (80, 25)
; VGA 文本模式種,一行只能容納 80 個字符,共 25 行
; 下標從 0 開始,所以 0x18=24, 0x4f=79
int 0x10 ; int 0x10
;;;;;;;;;;;;;下面這三行代碼獲取游標位置;;;;;;;;;;;;;;;;
; .get_cursor 獲取當前游標位置,在游標處列印字符
mov ah, 3 ; 3 號子功能
mov bh, 0 ; 待獲取游標的頁號
int 0x10 ; 輸出:
; ch = 游標開始行,cl = 游標結束行
; dh = 游標所在行號,dl = 游標所在列號
; 列印字串
mov ax, message
mov bp, ax ; es:bp 為串首地址
mov cx, 5 ; cx 為串長度,不包括結束符 '\0'
mov ax, 0x1301 ; 13 號子功能
; ah = 13
; al = 01: 寫字符方式,顯式字串,游標跟隨移動
mov bx, 0x2 ; bh = 0,要顯示的頁號
; bl = 02,字符屬性,黑底綠字
int 0x10
;;;;;;;;;;;;;;;;;;;;;;列印字串結束;;;;;;;;;;;;;;;;
jmp $; 程式懸停在此
message db "1 MBR"
times 510-($-$$) db 0
db 0x55,0xaa
2.3實驗流程
0.創建硬碟,命名Seven.img
./bximage -mode=create -imgmode=flat -hd=60 -q Seven.img
效果圖

注:此命令和書上不同,因為環境版本不同 -size會報錯,
輸入命令
./bximage --help
可查看自己環境支持的命令
效果圖

1.找到檔案目錄,點擊在終端中打開,使用命令
nasm -o mbr.bin mbr.s
將mbr.s編譯成mbr.min,
2.將mbr.bin刻入磁盤第0塊(LBA方式)命令為
dd if=/你的mbr.bin的路徑/mbr.bin of=/你的自定義硬碟的路徑/自定義硬碟名稱 bs=512 count=1 seek=0 conv=notrunc
比如我自己的
dd if=/home/Seven/bochs2.68/bin/mbr.bin of=/home/Seven/bochs2.68/bin/Seven.img bs=512 count=1 seek=0 conv=notrunc
3.用bochs進行模擬
輸入命令
./bochs -f bochsrc.disk
然后輸入c繼續,
2.4實驗結果

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/276621.html
標籤:其他
上一篇:關于bat的那些事—bat小程式
