操作系统引导-----QEMU环境下制作boot引导程序
目標
-
制作一個光盤實現qemu下操作系統的引導
儲備知識
-
df命令:列出文件系統的整體磁盤使用量
-
du命令:常用于計算目錄所占容量
-h :以(G/M)方式顯示容量
-k:以KB方式顯示
-m:以MB方式顯示
-
mkfs命令:使用指定的文件系統格式化磁盤
-t :接文件系統格式,如ext3,ext2,vfat等 -
mount命令:將文件系統掛載到指定的目錄下
-
losetup命令:連接文件與循環設備(/dev/loop)
詳解
-d 卸除設備。
-e<加密方式> 啟動加密編碼。
-o<平移數目> 設置數據平移的數目。
循環設備可把文件虛擬成區塊設備,籍以模擬整個文件系統,讓用戶得以將其視為硬盤驅動器,光驅或軟驅等設備,并掛入當作目錄來使用。 -
/dev/loop設備
/dev/loop(或稱vnd (vnode disk)、lofi(循環文件接口))是一種偽設備,這種設備使得文件可以如同塊設備一般被訪問。
在使用之前,循環設備必須與現存文件系統上的文件相關聯。這種關聯將提供給用戶一個應用程序接口,接口將允許文件視為塊特殊文件(參見設備文件系統)使用。因此,如果文件中包含一個完整的文件系統,那么這個文件就能如同磁盤設備一般被掛載。
這種設備文件經常被用于光盤或是磁盤鏡像(IOS、IMG)。通過循環掛載來掛載包含文件系統的文件,便使處在這個文件系統中的文件得以被訪問。這些文件將出現在掛載點目錄。
在一個目錄上掛載包含包含文件系統的文件的步驟:
使用一個循環設備(/dev/loop)連接文件(使用命令 losetup)
在目錄上掛載該循環設備(使用命令 mount) -
其他/dev虛擬設備
生成一個大小為1.44mb軟盤,并且將其掛載到指定目錄下
實現過程
- 先生成一個空的大小為1.44MB的磁盤
mkdosfs命令
詳解
-F 指定 FAT 表的大小,通常是 12 或是 16 個位元組。12 位元組通常用于磁碟片,16 位元組用于一般硬盤的分割區,也就是所謂的 FAT16 格式。這個值通常系統會自己選定適當的值。在磁碟片上用 FAT16 通常不會發生作用,反之在硬盤上用 FAT12 亦然。
xxd命令查看其內容
xxd -u -a -g l -c 16 floopy
其前512字節是一個引導扇區(Boot Sector),前62字節是BPB的結構,BPB數據結構的字段是windows文件系統和操作系統約定好的,用于描述磁盤的物理布局,可以適用于FAT系列文件系統和NTFS文件系統。這里我們看到最后的文件系統類型為FAT12
FAT引導扇區結構
詳細介紹鏈接
引導代碼
boot.asm程序:
jmp init; BS_jmpBoot短跳轉指令(加上nop填充后為3個字節) nop Bs_OEMName db "Jiaxgong";Bs_OEMName 廠商名稱 8字節 BPB_BytsPerSec dw 512;每扇區字節數 BPB_SecPerClus db 1;每簇扇區數 BPB_RsvdSecCnt dw 1;保留區中的保留扇區數FAT12必須為1,(引導記錄占用的扇區數) BPB_NumFATs db 2;此卷中FAT表的份數,建議為2 BPB_RootEntCnt dw 512;根目錄中的目錄項數 FAT12中建議取值512 BPB_TotSec16 dw 2880;扇區總數 BPB_Media db 0xf0;BPB_Media 存儲介質f0表示可移動介質,f8表示固定介質 BPB_FATSz16 dw 9;一個FAT表所占的扇區數 BPB_SecPerTrk dw 18;每磁道扇區數 BPB_NumHeaders dw 2;磁頭數 BPB_HiddSec dd 0;FAT分區之前的隱藏扇區數,對于未分區介質必須為0 BPB_TotSec32 dd 0 BS_drveNum db 0;int13得到的驅動器號 BS_Reserved1 db 0;保留(供NT使用) BS_BootSig db 0x29;擴展引導標記,指明此后的3個域可用 BS_VolID dd 0;卷標序列號 BS_VolLab db "VirtualBoot";磁盤卷標,此域必須與根目錄中11字節長的卷標一致 BS_FilSysType db "FAT12 ";文件系統類型init:mov ax, 7c00hmov ds, axmov es, axmov ss, axmov sp, 180hcall DispStrloop:jmp loopDispStr:mov ax, BootMsgmov bp, axmov cx, 16mov ax, 01301hmov bx, 000chmov dl, 0int 10hretBootMsg: db "Hello, OS World!"times 510-($-$$) db 0dw 0xaa55以上程序寫好后,使用nasm命令匯編成二進制文件
nasm boot.asm -o boot.bin
匯編完成后,可以使用以下命令查看boot.bin的大小,剛好為512字節
wc -c boot.bin
plus:反匯編指令ndisasm boot.bin -o 0x7c00>> disboot.asm可以查看處理過后的匯編代碼
將引導代碼寫入floopy軟盤中
dd if=boot.bin ibs=512 of=floopy obs=512 count=1 seek=0 conv=notrunc
notrunc意味著不縮減輸出文件,也就是說,如果輸出文件已經存在,只改變指定的字節,然后退出,并保留輸出文件的剩余部分。沒有這個選項,dd將創建一個512字節長的文件。
寫入完成后,使用qemu啟動軟盤(a.img就是上面的floppy軟盤,為了和命令區分,改為了a.img)
qemu-system-x86_64 -drive file=a.img,of=floppy
總結
以上是生活随笔為你收集整理的操作系统引导-----QEMU环境下制作boot引导程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 炒房客共识:深圳楼市要撑不住了
- 下一篇: Jquery 中的CheckBox、 R