Foxdisk05 啟動原理2

2021-09-26 20:06:04 字數 1681 閱讀 8395

觀察foxdisk3的makefile,可以看到使用的是bcc -ms的編譯開關。這是要求編譯器採用samll記憶體模式進行編譯,其特點是棧和資料都在64k以內,code在另外乙個64k內。為什麼採用small方式?主要是我當時設計的時候,沒有考慮到後面的各種新的需求,以為**可以控制在64k內完成;另外,這種模式比較便於彙編和c的混合編寫,不用去考慮複雜的資料段、**段的定位。

圖1 makefile節選

在整個**編寫過程中,除了引導部分(也即loader.asm),其他的**盡量用c編寫。但是有兩部分的**仍舊無法避免使用彙編,一是時鐘中斷,為了讓幾個任務並行工作,使用了彙編;二是32位數的乘除計算。我們在平常使用c/c++及其他高階語言的時候,大數的計算很平常。那是因為編譯器已經提供了庫函式呼叫,方便程式設計師使用,作業系統已經提供了這樣的機制進行支援。foxdisk某種程度上相當於簡單的作業系統,這些機制完全沒有提供。因此,在進行大數計算時,只能自己來寫這些函式了。

回到我們的啟動話題。loader.asm包含了所有啟動的秘密,其承載了將foxdisk的演出場景安排好的任務,相當於整個程式的導演,也是整個程式最難讀的地方。我試著以自己的語言,將其原理解釋清楚。

loader.asm在編譯後,將鏈結成一段512位元組的二進位製碼。當然,它不是單獨存在的,是與其他**混雜著存在於foxdisk.exe中。這段512位元組碼將由setup.c中的main()函式拷貝到mbr區,起到引導的作用。

bios在釋放控制權的時候,將把mbr區的**載入到0x7c00處,並跳轉執行。也即從loader.asm中的load_start處開始執行。

整個loader.asm實現的功能可以概括為三個:1) 將儲存在硬碟上的foxdisk**拷貝到指定的記憶體;2)將foxdisk執行的資料拷貝到另外一段64k的記憶體中;3) 設定棧,並遠端跳轉(retf)至foxdisk的bootentry處,開始執行foxdisk。loader.asm中的幾個變數,ncodesect:foxdisk**段占用的硬碟扇區數;ndatasect:foxdisk資料段占用的扇區數;ibegin: foxdisk程式映象所儲存的硬碟起始位置;這些變數均由setup.c中的函式進行初始化,也即安裝的時候確定。另外乙個變數idisk,其值為0x80或者0x81,表示bios所認的第乙個硬碟還是第二個硬碟,也是由setup.c中函式對其進行初始化的。如果foxdisk映象儲存在第二個硬碟上,則必須設定為0x81。現在想來,其作用不大,而且容易給除錯帶來麻煩。

load_start到load_chs,嘗試使用擴充套件中斷0x13(ah=0x40以上的int 0x13)訪問磁碟中的資料,載入foxdisk的**段至0x7000:0起始的64k記憶體,資料段載入至0x8000:0開始的64k記憶體。

如果磁碟不支援磁碟的擴充套件中斷(這種情況基本不可能),則回到原始的硬碟訪問中斷,嘗試將foxdisk的**段和資料段載入到指定的記憶體中。從load_chs到load_ok間做的就是這件事,其功能與上一段其實是相同的,大部分情況下也不會執行。

從標誌load_ok開始,進行設定棧以及跳轉的工作。retf是條遠跳轉指令,它將棧中的4個位元組當成cs:ip,跳轉過去執行。以上工作均在實模式下進行,不用考慮複雜的許可權問題。注意,在retf執行前,bx中已經包含了bootentry的位址,執行前的push bx就是將位址壓棧,準備遠端跳轉。

至此,我們可以暫時拋去晦澀難懂的彙編,進入了c的世界。

BIOS啟動原理BIOS啟動原理

intel的ibm pc上i386晶元是遵循intel與ibm共同制定的boot協議的 1.pc機的復位線和系統中的所有部件相連,包括cpu的reset引腳 2.系統上電開機時,主機板電源系統傳送低電平的 power good 訊號,該訊號送到復位介面電路的 res端,產生時鐘同步的復位正脈衝訊號r...

VueRouter05 實現原理

在vuerouter中提供了兩種模式 hash模式 history模式 hash模式的基礎是當url的 後的引數改變時瀏覽器不會傳送請求 history模式的基礎是pushstate和replacestate修改瀏覽器的歷史棧後瀏覽器不會立即傳送請求 前端路由是通過改變url,在不重新重新整理整體頁...

spring boot核心原理,啟動原理

1.它是個什麼東西?2.什麼是約定優於配置?一般的目錄結構如下 b 預設的打包方式為jar pom檔案中引入了spring boot starter web,其中包含了spring boot starter和spring boot web,包含了自動配置 日誌和yaml,自動幫我們引入了web模組開...