《操作系統真象還原》學習筆記:第2章——編寫MBR主引導記錄

2.1 計算機的啟動過程

載入內存:

(1) 程序被加載器(軟件或硬件)加載到內存某個區域
(2)CPU 的 cs:ip 寄存器被指向這個程序的起始地址

2.2 軟件接力第一棒,BIOS

2.2.1 實模式下的 1MB 內存布局

Intel 8086 有 20 條地址線,故其可以訪問 1MB 的內存空間,即2的20次方=1048576=1MB。
實模式下的內存布局如下:
在這里插入圖片描述
(1)在電腦未開機前,BIOS就被事先寫入到內存的F0000~FFFFF中,此區域為ROM,這里面存的是 BIOS 的代碼。BIOS的主要工作是檢測、初始化硬件,建立中斷向量表。
(2)除了內存條,還有一些外設同樣是需要通過地址總線來訪問。

2.2.2 BIOS 是如何蘇醒的

在開機的一瞬間,CPU的cs:ip寄存器被強制初始化為0xF000: 0xFFF0,由于開機的時候處于實模式,按照實模式的尋址方式段基地址要乘以16,也就是左移4位,然后再加上段內偏移地址,則計算得這個實際的物理地址為0xFFFF0,此地址便是BIOS程序的入口地址。而從地址0xFFFF0~0xFFFFF只有16B的空間,這說明BIOS真正的執行腳本并不存儲在這里,開機后執行的第一條語句一定是跳轉語句jmp,其實執行的第一條語句是:

jmp far f000:e05b

在這里插入圖片描述
跳轉到了0xfe05b處,說明這里才是BIOS代碼真正開始的地方。接下來就是BIOS不斷進行檢測內存,顯卡等外設信息,然后初始化硬件的過程了。

2.2.3 為什么是 0x7c00

BIOS 最后一項工作校驗啟動盤中位于0盤0道1扇區的內容。如果此扇區末尾的兩個字節分別是魔數0x550xaa,BIOS便認為此扇區中確實存在可執行的程序,并把這個扇區的內容加載到物理地址0x7c00的內存中。

2.3 實驗

任務:
(1)完成mbr主引導記錄的代碼編寫,并完成編譯,完成的代碼編譯并非真正的MBR主引導程序,而是為了測試mbr程序是否會被加載到0x07c00處被正確執行。
(2)將編譯生成的主引導記錄內容刻錄到我們的創建的啟動硬盤中。
創建mbr.s文件:
(1)文件功能:在屏幕上打印字符串“1 MBR”,背景色為黑色,前景色(字體顏色)為綠色.
(2)功能實現方式:借助BIOS建立好的例程0x10號中斷,可將0x10號中斷看做一個函數,這個函數不同的輸入可實現不同的功能,因此要有一個參數表示要實現的功能,也就是接下來要說的功能號參數。
代碼:

; ~/d2los/src/mbr.S
; MBR主引導程序
;------------------------------------------------------------
SECTION MBR vstart=0x7c00         mov ax,cs      mov ds,axmov es,axmov ss,axmov fs,axmov sp,0x7c00; 清屏利用 0x06號功能, 上卷全部行, 實現清屏
; -----------------------------------------------------------
; INT 0x10 功能號: 0x06 功能描述: 上卷窗口
; ------------------------------------------------------
; 輸入:
; AH = 功能號 0x06
; AL = 上卷的行數(如果為0, 表示全部)
; BH = 上卷行屬性
; (CL, CH) = 窗口左上角的(X, Y)位置
; (DL, DH) = 窗口右下角的(X, Y)位置
; 無返回值mov     ax, 0x600mov     bx, 0x700mov     cx, 0           ; 左上角: (0, 0)mov     dx, 0x184f      ; 右下角: (80, 25),; VGA文本模式中, 一行只能容納80個字符, 共25行.; 下標從0開始, 所以0x18=24, 0x4f=79int     0x10            ; int 0x10; 獲取光標位置
; -----------------------------------------------------------
; .get_cursor 獲取當前光標位置, 在光標位置處打印字符.mov ah, 3                ; 輸入: 3號子功能是獲取光標位置, 需要存入ah寄存器mov bh, 0                ; bh寄存器存儲的是要獲取光標的頁號int 0x10                 ; 輸出: ch=光標起始行, cl=光標結束行; dh=光標所在行號, dl=光標所在列號; 獲取光標位置結束
; -----------------------------------------------------------; 打印字符串
; -----------------------------------------------------------
; 還是用10h中斷, 不過這次是調用13號子功能打印字符串mov ax, message mov bp, ax               ; es:bp 為字符串起始地址, es此時同cs一致,; 開始時已經為sreg初始化; 光標位置要用到dx寄存器中的內容, cx中的光標位置可忽略mov cx, 5                ; cx 為字符串長度, 不包括結束符0的字符個數mov ax, 0x1301           ; 子功能號13是顯示字符串及屬性, 要存入ah寄存器,; al設置顯示字符方式 ah=01: 顯示字符串,光標跟隨移動mov bx, 0x2              ; bh存儲要顯示的頁號, 此時是第0頁,; bl中是字符屬性, 屬性黑底綠字(bl = 02h)int 0x10                 ; 執行BIOS 0x10 號中斷; 打印字符串結束
; -----------------------------------------------------------jmp $                    ; 使程序停在此處message db "1 MBR"times 510-($-$$) db 0db 0x55,0xaa

編譯mrb.S文件:

nasm -o test mbr.s

將文件內容寫入0盤0道1扇區:

dd if=/home/abc/Desktop/Bochs/mbr.bin of=/home/abc/Desktop/Bochs/Seven.img bs=512 count=1 seek=0 conv=notrunc

啟動bochs查看結果:

bin/bochs -f bochsrc.disk

在這里插入圖片描述

0x7c00處打斷點,可以看到將0x0000的值移入cs中:
在這里插入圖片描述
查看段寄存器:
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/41077.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/41077.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/41077.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Jenkins 使用 Publish over SSH進行遠程訪問

Publish over SSH 是 Jenkins 的一個插件,可以讓你通過 SSH 將構建產物分發到遠程服務器。以下是如何開啟 Publish over SSH 的步驟: 一、安裝 Publish over SSH 插件 在 Jenkins 中,進入 "Manage Jenkins" > "Manage Plugins"。選擇 "Availab…

怎么用AI合成PPT?這5款風靡全球的AIPPT軟件一定要知道!

當下我們已進入信息過載的時代,每天有無數的信息試圖爭奪我們的注意力,與此同時,我們也需要向別人展示和呈現信息,這就要求我們能夠以最低的成本,在短時間內引起對方的注意,這其中最常用到的工具非PPT莫屬。…

Java集合框架:深入探索與性能優化指南

引言 Java集合框架是Java標準庫中用于存儲和操作對象集合的一套工具。它提供了一套統一的接口和類,使得開發者可以高效地處理對象集合,而無需關心底層的實現細節。Java集合框架主要包括List、Set、Map等接口及其實現類。本文將詳細介紹Java中的集合框架,并分享如何選擇和使用…

簡易電阻、電容和電感測量儀-FPGA

通過VHDL語言編寫程序用于設計電阻、電容和電感測量儀,通過使用試驗箱進行驗證是否設計正確,資料獲取到咸🐟:xy591215295250 \\\或者聯系wechat 號:comprehensivable 設計并制作--臺數字顯示的電阻、電容和電感參數測試…

一篇說清楚大端和小端

端是什么? “我們常說的大端小端模式是計算機中 字節順序(Endianness) 常見的兩種表現形式。(此外還有混合序 (Middle-Endian)) “endian”一詞來源于十八世紀愛爾蘭作家喬納森斯威夫特(Jonathan Swift)的小說《格列佛…

Linux上從NCBI序列

要下載NCBI Gene數據庫中所有Gene ID的FASTA格式序列,可以使用以下方法: 使用Entrez Direct命令行工具 安裝Entrez Direct: conda install bioconda::entrez-direct使用Entrez Direct下載FASTA格式序列: esearch -db gene -query "(Triticum aes…

C++ 空間和時間高效的二項式系數(Space and time efficient Binomial Coefficient)

這里函數采用兩個參數n和k,并返回二項式系數 C(n, k) 的值。 例子: 輸入: n 4 和 k 2 輸出: 6 解釋: 4 C 2 等于 4!/(2!*2!) 6 輸入: n 5 和 k 2 輸出: 10 解釋: 5 C …

海思SD3403/SS928V100開發(14)WIFI模塊RTL8821驅動調試

1.前言 芯片平臺: 海思SD3403/SS928V100 操作系統平臺: Ubuntu20.04.05【自己移植】 WIFI模塊: LB-LINK的RTL8821 2. 調試記錄 參考供應商提供的操作手冊 2.1 lsusb查看設備 2.2 編譯供應商提供的驅動 2.2.1 修改Makefile 2.2.2 編譯報錯 解決辦法: 將Makefile中arm…

linux中 nginx+tomcat 部署方式 tomcat掛掉設置自動啟動

在Linux環境下,要實現當Tomcat掛掉后自動重啟,可以通過編寫Shell腳本結合cron定時任務或者使用系統守護進程(如Systemd、Upstart或SysVinit)來完成。 使用Shell腳本和cron定時任務 編寫檢查并重啟Tomcat的Shell腳本:首…

取證與數據恢復:冷系統分析,實時系統分析與鏡像分析之間的過渡辦法

天津鴻萌科貿發展有限公司是 ElcomSoft 系列取證軟件的授權代理商。 ElcomSoft 系列取證軟件 ElcomSoft 系列取證軟件支持從計算機和移動設備進行數據提取、解鎖文檔、解密壓縮文件、破解加密容器、查看和分析證據。 計算機和手機取證的完整集合硬件加速解密最多支持10,000計…

MMSC物料庫位擴充

MMSC物料庫位擴充 輸入事務碼MMSC: 回車后添加新的庫位即可: 代碼實現,使用BDC *&------------------------------------------------* *&BDC的定義 *&------------------------------------------------* DATA gt_bdcdata T…

ggrcs包4.0版本發布—重新對密度圖寬度進行了設計

目前本人寫的ggrcs包新的4.0版本已經在CRAN上線,目前支持邏輯回歸(logistic回歸)、cox回歸和多元線性回歸。 需要的可以使用代碼安裝 install.packages("ggrcs")如果原來安裝了舊版本,重新在安裝一次就可以升級到新版…

如何選擇小紅書矩陣系統

在內容營銷領域,小紅書已成為一個不可忽視的平臺,尤其是對于品牌和個人創作者來說。小紅書矩陣系統,指的是一系列策略和工具,它們可以幫助用戶在小紅書上高效地管理和分發內容。本文將探討如何選擇適合自己需求的小紅書矩陣系統&a…

(18)GPS/指南針(二)

文章目錄 前言 3 GPS驅動程序選項 4 GPS自動切換 5 高級用途 前言 Copter/Plane/Rover 支持與 GPS、指南針和其他定位技術的整合: 3 GPS驅動程序選項 GPS_DRV_OPTIONS 參數提供了幾個 GPS 操作選項。這個參數是一個位掩碼,允許同時進行多個選項的選…

Oracle數據庫的日志切換策略

Oracle數據庫的日志切換策略是確保數據庫穩定運行和事務連續性的關鍵機制之一。以下是對Oracle日志切換策略的詳細解析 1、自動日志切換 1.1、重做日志切換: Oracle數據庫使用重做日志文件(Redo Log Files)來保證實例恢復。當當前的重做日…

YOLOv8數據集可視化[目標檢測實踐篇]

先貼代碼,后面再補充解析。 這個篇章主要是對標注好的標簽進行可視化,雖然比較簡單,但是可以從可視化代碼中學習到YOLOv8是如何對標簽進行解析的。 下面直接貼代碼: import cv2 import numpy as np import osdef read_det_labels(label_file_path):with open(labe…

藍橋杯開發板STM32G431RBT6高階HAL庫學習FreeRtos——完成第一個小項目點燈

一、配置LED引腳(注意引腳都配置為高電平) 二、新建兩個任務,一個為動態創建,一個靜態創建(以后大多數情況進行動態創建)//將兩個優先級設置成一樣 補充: 1.FreeRTOS創建靜態任務和動態任務的各自優缺點 靜態任務和動…

react框架,使用vite和nextjs構建react項目

react框架 React 是一個用于構建用戶界面(UI)的 JavaScript 庫,它的本質作用是使用js動態的構建html頁面,react的設計初衷就是為了更方便快捷的構建頁面,官方并沒有規定如何進行路由和數據獲取,要構建一個完整的react項目,我們需要…

微信小程序:圖片轉icon

svg方式 通過svg圖片的方式也能實現自定義icon。但是相比第一種方式,svg圖片可以修改顏色,并且縮放的失真率也比較低。不過小程序wxss并不支持加載本地的svg圖片。我們可以通過在線(https://www.sojson.com/image2base64.html)svg轉base64的方式在wxss中…

Java中的線程調度與性能優化技巧

Java中的線程調度與性能優化技巧 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿! 1. 引言 在Java應用程序中,線程調度和性能優化是提升系統響應速…