簡體   English   中英

如何制作可引導軟盤映像?

[英]How to make a bootable floppy disc image?

假設我已經構建了一個匯編程序(基本打印),所以我有一個 .bin 文件。 現在我想讓它成為一個可啟動的軟盤映像(虛擬一個)。 因此,當我啟動操作系統(在 vm 中)時,它將首先從位於該軟盤上的程序中執行匯編指令。 如何正確地做到這一點?

您可以使用我的引導扇區加載程序(用於 FAT12 / FAT16 FS 的 ldosboot boot.asm )和我的引導映像創建腳本來制作一個 1440 KiB 的文件系統映像,其中預加載了您的 kernel 可執行文件和第一個扇區中的加載程序。 你還需要我的宏集合 這是一個示例 shell session 以克隆存儲庫並構建映像。 這是使用hg (Mercurial)加載 repos,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指向 memory 某處的 FS 引導扇區的副本。 所有其他寄存器,尤其是段寄存器,都是不確定的,如果您想使用它們,必須由您的代碼初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM