1. 程式人生 > >操作系統開發之——一個簡單的Bootsect

操作系統開發之——一個簡單的Bootsect

版權 文件 pla get 結束 fse -- 設有 擴展

先嚇唬一下讀者朋友呵呵,直接發代碼:(這是UOS操作系統的Bootsect)(有興趣的朋友能夠增加我們,聯系方式在最後)

;------------------------------
;文件名稱:Bootsect.asm
;文件創建者:@Imcjy
;文件參與編輯者:@Imcjy
;文件編碼:UTF-8
;狀態:O
;Build:3
;文件創建日期:2015年7月24日
;文件最後改動日期:2015年8月12日
;備註:本文件為Nasm
;凝視等級:LV2
;------------------------------
	ORG 0x7c00	;裝載此程序至0x7c00處。由於BIOS默認會從內存0x7c00處開始運行
	JMP OS_Entry

;參照《Orange's一個操作系統的實現》,感謝其作者於淵
;參照<a target=_blank href="http://wenku.baidu.com/view/1ee907d528ea81c758f5786b.html">http://wenku.baidu.com/view/1ee907d528ea81c758f5786b.html</a> ,感謝其作者
%macro DiskAddressPacket 3
       DB 16 ;數據包尺寸(默認16字節)
       DB 0  ;保留
       DB %2 ;要傳輸的數據塊個數(以扇區為單位),最大讀128扇區
       DB 0  ;保留
       DD %3 ;傳輸緩沖地址(segment:offset)
       DQ %1 ;磁盤起始絕對塊地址。註意此處的地址是從零開始
%endmacro
OS_Kernel_S1: DiskAddressPacket 3, 128, 0x10000000
OS_Kernel_S2: DiskAddressPacket 131, 128, 0x20000000
OS_Kernel_S3: DiskAddressPacket 259, 128, 0x30000000
[bits 16]
OS_Entry:
	;初始化寄存器
	MOV	AX,CS
	MOV	DS,AX
	MOV	ES,AX
	MOV	SS,AX

Read_Kernel:
	;讀內核
	KS1:	;狀態1
	MOV	AX,OS_Kernel_S1
	MOV SI,AX
	MOV DL,0x80	;一號硬盤
	MOV AH,0x42	;讀盤操作
	INT 0x13
	
	JC KS1	;失敗則重試
	
	KS2:	;狀態2
	MOV	AX,OS_Kernel_S2
	MOV SI,AX
	MOV AH,0x42	;讀盤操作
	MOV DL,0x80	;一號硬盤
	INT 0x13
	
	JC KS2	;失敗則重試
	
	KS3:	;狀態3
	MOV	AX,OS_Kernel_S3
	MOV SI,AX
	MOV DL,0x80	;一號硬盤
	MOV AH,0x42	;讀盤操作
	INT 0x13
	
	JC KS3	;失敗則重試
		
	JMP 0x8000:0	;跳轉到段0x8000處並更新CS
	
	TIMES 510 - ($ - $$) DB 0	;填充剩下的空間。使生成的二進制代碼恰好為512字節
	DB 0x55,0xAA 	;BIOS認可的結束標誌


這裏讀盤操作用的是擴展0x13號BIOS中斷,假設看不懂,能夠點開asm代碼裏的百度鏈接。假設打開不了能夠聯系我哦。

如今開始解釋一下第一句,“ORG 0x7c00”,這裏為什麽要裝載到0x7c00處呢。如今也解釋不清楚。這是IBM的大叔設置的,假設有質疑能夠去問問他們哦。

第二句:“JMP OS_Entry” 這裏為什麽要跳轉呢?那我再問你一句,這一句後面的那些代碼難道要運行嗎?(那可不能運行)所以要跳轉到Bootsect真正的入口點。

第三句:宏定義,為了降低挨個挨個設置參數的麻煩,參數能夠參照intel手冊來寫。

第四句:依賴宏定義定義參數,這裏不用解釋了把,相信學過Nasm的朋友都能看懂。

第五句:“[bits 16]”,為了使Nasm生成出來的是16位代碼。(話說為什麽一定要生成16位代碼呢?由於BIOS僅僅認16位的中斷處理),話說Nasm好笨哦。(嘻嘻)

第六句:“OS_Entry:”標簽,相應第二句。

第七句——第十句:初始化寄存器。有興趣的讀者能夠去掉這句看看。

第十一句——第十五句:將各個參數放到相應的寄存器裏。否則虛擬器(或者真機)會出問題(或許就是重新啟動吧)。

第十六句:調用0x13號BIOS中斷。

後面的以此類推。

到了“JMP 0x8000:0”這一句,看一下凝視把,這裏是一個長跳轉。跳轉到0x8000內存地址處。

最後兩句:為了使BIOS認可我們的Bootsect,我們須要這段代碼的大小控制到512字節以內,且最後兩個字節為0x55 0xAA。

註意事項:

1:我們須要將這段代碼放到硬盤的第一個扇區,(話說這也是IBM那群大叔設置的)。

2:我們須要將硬盤的第二個扇區至第三個扇區放置興許的操作代碼(比方打開A20啊,進入保護模式啊)。

3:版權歸UOS項目組全部。

假設還有問題能夠聯系我:Email:[email protected]

假設讀者朋友也有開發操作系統的想法,能夠聯系我。

操作系統開發之——一個簡單的Bootsect