操作系統實現---boot啓動並讀軟盤

參照《linux完全剖析》一文中的程序自己寫了

如下兩個簡單的程序:

boot.s

;這個程序將軟驅的第二個扇區中的內容(kernel)讀到
;內存0x1000:0000的位置然後跳轉到該處執行
;
;
;

org 07c00h
jmp start
msg:
db "Now,begin to load kernel....",0ah
msgLen equ $-msg


start:
mov ax,cs
mov ds,ax
mov es,ax

mov ax,msg
mov bp,ax
mov cx,msgLen
mov ax,01301h
mov bx,000ch
mov dl,0
int 10h


load:
mov dx,0x0000 ;dh->磁頭號,dl->驅動器號
mov ax,0x1000
mov es,ax
xor bx,bx ;es:bx->the data   0x1000:0000
mov ch,0 ;ch->磁道號
mov cl,2 ;cl->起始扇區號
mov ah,02h ;param
mov al,01h ;how many blocks to read
int 13h


sys: ;jmp to the kernel
jmp 0x1000:0


times 510 -($-$$) db 0
dw 0xaa55


2、sys.s

mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax


mov ax,msg
mov bp,ax
mov cx,msgLen
mov ax,01301h
mov bx,000ch
mov dl,0
int 10h
jmp $


msg:
db "It's the world of kernel!",0ah
msgLen equ $-msg




times 512-($-$$) db 0


將上述兩個彙編程序編譯之後生成boot.bin sys.bin 然後使用命令dd if=sys.bin of=boot.bin bs=512 seek=1 count=1 將這兩個512字節的bin文件做成一個1024字節的文件(即boot在軟盤的第一個扇區,sys在軟盤的第二個扇區)

使用qemu-system-i386 -hda boot.bin 只出現了“Now,begin to load kernel....”一句話,換言之,sys並沒有執行,但是使用bochs模擬卻完全沒有問題。

原因:應該使用qemu-system-i386 -fda boot.bin ,因爲boot中使用的int 13h按照軟驅的方式讀取的,所以應該使用參數爲-fda

若要使用硬盤啓動的話,將程序的中的

load:
mov dx,0x0000 ;dh->磁頭號,dl->驅動器號

改爲:

load:
mov dx,0x0080 ;dh->磁頭號,dl->驅動器號,軟驅從0開始:  ==> 軟驅A:0  軟驅B:1 
;硬驅從80h開始: ===> 硬盤C:80h    硬盤D: 81h ....

即可!



發佈了43 篇原創文章 · 獲贊 3 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章