IPL啟動程式載入器

2021-06-20 13:36:07 字數 3043 閱讀 9161

以上的流程圖為自己理解描繪的,下面的**為《30天自製作業系統》書中的原始碼,我加以注釋

; haribote-ipl

; tab=4

cyls equ 10 ; 定義的常量

org 0x7c00 ; 將程式載入到記憶體的位址

;fat12軟盤的專用格式

jmp entry

db 0x90

db "bluesea " ; 必須為8個位元組的啟動扇區名稱

dw 512 ; 每個扇區的位元組數

db 1 ; 簇的大小(每個簇有多少個扇區)

dw 1 ; fat的起始位置

db 2 ; fat的個數

dw 224 ; 根目錄的大小

dw 2880 ;該磁碟的大小(必須為2880個扇區)

db 0xf0 ; 磁碟種類

dw 9 ;fat長度

dw 18 ; 磁軌含有的扇區個數

dw 2 ; 磁頭數

dd 0 ; 不使用分割槽

dd 2880 ; 重寫一次磁碟大小

db 0,0,0x29;

dd 0xffffffff;

db "hariboteos " ; 磁碟名稱(11位元組)

db "fat12 " ;磁碟格式

resb 18 ; 預留18位元組

; 啟動引導程式入口

entry:

mov ax,0 ;初始化暫存器

mov ss,ax

mov sp,0x7c00

mov ds,ax

; 磁碟上的資料將要載入到記憶體的位址

mov ax,0x0820

mov es,ax

mov ch,0 ; 柱面0

mov dh,0 ; 磁頭0

mov cl,2 ; 扇區2

readloop:

mov si,0 ; si記錄讀取失敗的次數

retry:

mov ah,0x02; ah=0x02 :讀入磁碟

mov al,1 ; 1個扇區

mov bx,0

mov dl,0x00 ; a驅動器

int 0x13 ; 呼叫bios函式

jnc next ; 如果沒有出錯就跳轉到next

add si,1 ; 出錯了,si加1

cmp si,5 ; si與5比較

jae error ; si >= 5 則跳轉到error

mov ah,0x00

mov dl,0x00 ; a驅動器

int 0x13 ; 呼叫bios函式

jmp retry

next:

mov ax,es ; ax作為過渡的暫存器

add ax,0x0020 ; es的值與0x0020相加

mov es,ax ; 相加結果放入es偱偙偆偟偰偄傞

add cl,1 ; cl加1

cmp cl,18 ; cl與18比較

jbe readloop ; 如果cl <= 18 就跳轉readloop

mov cl,1

add dh,1

cmp dh,2

jb readloop ; dh < 2 跳轉readloop讀盤

mov dh,0

add ch,1

cmp ch,cyls

jb readloop ; ch < cyls readloop

; 此處為了haribote.sys 的連線

mov [0x0ff0],ch ; ipl啟動程式載入了的柱面數

jmp 0xc200

error:

mov si,msg ;傳入字串的首位址

putloop:

mov al,[si]

add si,1 ; si位址後移

cmp al,0

je fin

mov ah,0x0e ; 顯示乙個文字

mov bx,15 ; 字元顏色

int 0x10 ; 呼叫bios顯示字元函式

jmp putloop

fin:

hlt ;

jmp fin;

msg:

db 0x0a, 0x0a ; 兩個換行符

db "load error"

db 0x0a ; 換行

db 0

resb 0x7dfe-$ ; 保證510,511位元組是55 aa

db 0x55, 0xaa

啟動載入器BootLoader

在嵌入式作業系統中,bootloader是在作業系統核心執行之前執行。可以初始化硬體裝置 建立記憶體空間對映圖,從而將系統的軟硬體環境帶到乙個合適狀態,以便為最終呼叫作業系統核心準備好正確的環境。在嵌入式系統中,通常並沒有像bios那樣的韌體程式 注,有的嵌入式cpu也會內嵌一段短小的啟動程式 因此...

SpringBoot之啟動載入器

在專案啟動的時候做一些初始化工作。component public class firstcommandlinerunner implements commandlinerunner component override 啟動專案,觀察控制台輸出 run firstcommandlinerunner...

tomcat啟動載入

listener的初始化最早,filter次之。他倆的初始化都是在容器啟動完成之前初始化的。servlet沒有初始化,原因是沒有匹配的請求進來。如果想要servlet自動初始化,需要在指定的servlet中配置引數,沒有此標籤,預設啟動時servlet不進行初始化。初始化的順序跟listener f...