自己動手寫作業系統(二)

2021-08-02 17:21:50 字數 1915 閱讀 2149

系統啟動流程簡單來說就是下面的順序:

1.bios:開機主動執行的韌體,會認識到第乙個可開機的裝置

2.mbr:第乙個可開機裝置的第乙個扇區內的主引導分割槽塊,內包含引導引導程式

=>由stage1.asm編譯成的boot.bin被寫入mbr分割槽

3.引導引導程式(boot loader):   一支可讀取核心檔案來執行的軟體

=>由stage2.asm編譯成的stage2.sys會被讀取到記憶體

4.核心檔案: 開始作業系統的功能

=>由core編譯成的core.sys被讀取到記憶體,並且eip跳轉到core.sys的入口函式。

===============================

第一步是cpu自己去負責的,我們不需要做任何處理,所以我們要做的是從第二步開始。

**介紹如下:

fatsize:            dw 0x0000

fatdatasector: dw 0x0000

stage2imagename: db "stage2 sys"

stage2currentcluster: dw 0x0000

stage2filenotfoundmsg: db "fatal**: missing or corrupt stage2 image.",0

; loading addresses

fatrootloadloc: dw 0x0200   ; (7c00:0200)

stage2loadloc:  dw 0x0050   ; (0050:0000)

stage2imagename就是第三步中的需要讀取到記憶體的檔名(我們這裡簡單的叫做stage2.sys)。

stage2loadloc是指stage2.sys需要載入到的記憶體位址,這個需要和stage2.asm中的[org 0x500] ; (0x50:0)對應。

接下來就是乙個跳轉,將ip直接跳轉到0x50:0即0x500上,

push word [stage2loadloc]   ; ip register..

push word 0x0000 ; and code segment for..

retf ; far jump

我們看到stage2.sys的用org定義了起始的位址是0x500,所以這個就是stage1.sys中的跳轉連線上了。

[org 0x500] ; (0x50:0)

jmp stage2_main

接下來,0x500上的第一條指令就是stage_main,這樣就完成了步驟2的過程,開始步驟3的處理了。stage2.sys的處理下週再分析。

ps:1.這裡省略了用彙編從檔案系統中查詢stage2.sys的流程(find_file),有興趣的同學可以自己研究。哈哈。我這裡實際上也是直接抄襲了別人的處理流程。

2.如果boot.bin和stage2.sys都編譯成功後,我們可以通過下面的dd命令來寫入mrb塊。

dd if=/dev/zero of=$out_dir/diska.img bs=512 count=2880

dd if=$out_dir/boot.bin of=$out_dir/boot.img bs=512 count=1

dd if=$out_dir/diska.img of=$out_dir/boot.img skip=1 seek=1 bs=512 count=2879

謝謝。

自己動手寫作業系統 二

上一期,我講述了如何在軟盤的啟動扇區寫一些 然後再從軟盤啟動的過程。製作好乙個啟動扇區,在切換到保護模式之前,我們還應該知道如何使用bios中斷。bios中斷是一些由bios提供的 為了使作業系統的建立更容易的低階程式。在本文中,我們將學習處理bios的中斷。為什麼要用bios bios會把啟動扇區...

自己動手寫作業系統 二

自己動手寫作業系統 二 上一期 我講述了如何在軟盤的啟動扇區寫一些 然後再從軟盤啟動的過程。製作好乙個啟動扇區,在切換到保護模式之前,我們還應該知道如何使用bios中斷。bios中斷是一些由bios提供的 為了使作業系統的建立更容易的低階程式。在本文中,我們將學習處理bios的中斷。為什麼要用bio...

自己動手寫作業系統

virtual pc 5.2 下 dos7.1 中 執行.com檔案相關問題 2009 09 09 12 55 剛才在進入dos後,編譯.asm檔案獲得.com檔案,但系統會出現 emm386 unrecoverable privileged operation error n9.press ent...