操作系統開發之——一個簡單的Bootsect
先嚇唬一下讀者朋友呵呵,直接發代碼:(這是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