假設我已經構建了一個匯編程式(一個基本的列印),所以我有一個 .BIN 檔案。
現在我想讓它成為一個可啟動的軟盤映像(一個虛擬的),這樣當我啟動一個作業系統(在 vm 中)時,它會首先執行我的程式中的匯編指令,該程式位于該虛擬軟盤上。
如何正確地做到這一點?
uj5u.com熱心網友回復:
您可以使用我的引導扇區加載程式(boot.asm用于 FAT12 / FAT16 FS 的ldosboot )和我的引導映像創建腳本來制作一個 1440 KiB 的檔案系統映像,該映像預加載了您的內核可執行檔案和第一個扇區中的加載程式。您還需要我的宏集合。這是一個示例 shell 會話,用于克隆存盤庫并構建映像。這是使用hg (Mercurial)加載存盤庫,使用 wget 獲取我的除錯器的版本作為示例程式,使用 Info-ZIP 的 unzip 來解壓它,使用NASM來組裝加載器和映像,以及使用 qemu 來運行組裝后的所有內容。
$ hg clone https://hg.pushbx.org/ecm/lmacros
destination directory: lmacros
requesting all changes
adding changesets
adding manifests
adding file changes
added 143 changesets with 171 changes to 38 files
new changesets 3a982025dd94:323cc150061e
updating to branch default
29 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg clone https://hg.pushbx.org/ecm/ldosboot
destination directory: ldosboot
requesting all changes
adding changesets
adding manifests
adding file changes
added 588 changesets with 650 changes to 15 files ( 2 heads)
new changesets 13cf6bb0b5f5:07f4ba0ef8cd
updating to branch default
15 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ hg clone https://hg.pushbx.org/ecm/bootimg
destination directory: bootimg
requesting all changes
adding changesets
adding manifests
adding file changes
added 88 changesets with 88 changes to 1 files
new changesets 966f8a094eca:fa44558212e7
updating to branch default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ wget https://pushbx.org/ecm/download/ldebug.zip
--2021-11-18 13:05:18-- https://pushbx.org/ecm/download/ldebug.zip
Resolving pushbx.org (pushbx.org)... 2a01:488:66:1000:b01c:1258:0:1, 176.28.18.88
Connecting to pushbx.org (pushbx.org)|2a01:488:66:1000:b01c:1258:0:1|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7131575 (6.8M) [application/zip]
Saving to: 'ldebug.zip'
ldebug.zip 100%[=====================>] 6.80M --.-KB/s in 0.03s
2021-11-18 13:05:18 (259 MB/s) - 'ldebug.zip' saved [7131575/7131575]
$ unzip ldebug.zip bin/ldebugu.com
Archive: ldebug.zip
inflating: bin/ldebugu.com
$ nasm -I lmacros/ -I ldosboot/ ldosboot/boot.asm -D_COMPAT_FREEDOS -D_QUERY_GEOMETRY=0 -D_LBA=0 -D_USE_PART_INFO=0 -o boot.bin
ldosboot/boot.asm:420: warning: Possibly crossing 64 KiB boundary while reading file (sector size >= 1024) [-w user]
ldosboot/boot.asm:1851: warning: FAT12: 18 bytes still available. [-w user]
$ nasm -I lmacros/ -I bootimg/ bootimg/bootimg.asm -D_BOOTFILE="'boot.bin'" -D_PAYLOADFILE="::rename,'bin/ldebugu.com','KERNEL.SYS'" -o diskette.img
$ qemu-system-i386 -fda diskette.img -boot order=a -curses
bootimg 的檔案位于主源檔案頂部的注釋中。我使用_BOOTFILE定義(設定為雙引號字串,以便 NASM 接收帶引號的字串)來指示引導扇區檔案,主_PAYLOADFILE定義用于指定包含除錯器可執行檔案,將其重命名為,KERNEL.SYS以便_COMPAT_FREEDOS加載程式使用的默認名稱找到我們的可執行檔案。
除了 FreeDOS 兼容性選擇之外,還boot.asm需要一些額外的開關來禁用啟動 1440 KiB 軟盤映像不需要的功能。這是因為 FreeDOS 兼容加載器需要比我的 (lDOS) 默認值更多的空間。
最后,您指定要加載KERNEL.SYS的檔案(使用boot.asm定義_LOAD_NAME和指定的檔案名中的默認檔案名_LOAD_EXT)需要采用正確的格式。FreeDOS 加載協議相當簡單:您的整個檔案被加載到地址 600h,可使用分段地址 60h:0 尋址,并且cs:ip完全設定為 60h:0。該暫存器bl接收您從中啟動的 ROM-BIOS 單元,并ss:bp指向記憶體中某處 FS 啟動扇區的副本。所有其他暫存器,尤其是段暫存器,都是不確定的,如果您想使用它們,必須由您的代碼初始化。
請注意,FreeDOS 加載協議與此級別的大多數其他加載協議的不同之處在于bl設定為加載單元。根據使用的加載程式dl可能會有所不同bl,哪種情況bl是正確的,哪些是dl不正確的。加載單元也可以在 指向的引導扇區副本中找到ss:bp,byte [ss:bp 40h]對于 FAT32 或byte [ss:bp 24h]FAT12 和 FAT16。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/369170.html
