系統啟動流程簡單來說就是下面的順序:
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...