2ステージのブートローダーをテストできるように、動作するファイルシステムでフロッピーイメージを作成しようとしています。フロッピーをマウントしてから、2番目のバイナリをcp
にマウントしようとすると、mount
はすべて不幸になります。これが私が使おうとしているステップです:
dd if=/dev/zero of=floppy.img bs=512 count=2948
mkfs.vfat floppy.img
dd if=boot1.bin of=floppy.img bs=512 count=1
su -c 'mount -t msdos -o loop floppy.img /mnt'
dmesg | tail
[591461.669870] FAT: invalid media value (0x09)
[591461.669876] VFS: Can't find a valid FAT filesystem on dev loop0.
この種のものにPOSIXツールセットを使用する際の問題のいくつかを学んでいます。ボリュームのVBRにbootstrapプログラムをインストールすることはではなくデータでいっぱいのセクターを非難するだけの問題です画像からのセクター#0。あなたは、既存の BIOSパラメーターブロック を保持し、いくつかのBPBバリアントに対処する必要があります。
MS/PC/DR-DOS、OS/2、Windows NTなどのオペレーティングシステムに付属するツールは、BPBなどのことをすべて知っています。彼らのさまざまなsys
、sysinstx
、bootsect
およびその他のツールは、物事がどのように処理されるかを知っています。ただし、dd
などのPOSIXツールを使用する場合は、手動でVBRで上書きするバイトと保存するバイトを指定する必要があります-です。
ms-sys
BPBを保持する方法も知っていますが、カスタムbootstrapプログラムを適用するオプションはありません。新しい機能としてリクエストしてください。
私は実際に2ステージのフロッピーブートローダーをずっと前に書いたことがあります。 (Microsoftまたは他の「専門家」からの)さまざまな仕様が言っているかもしれませんが、ディスケットの最初のセクターは、BIOSパラメータブロックBPBを備えた標準のMS-DOSフロッピーに準拠している必要があります。表示されているエラーメッセージは、「boot1.bin」がこの要件を満たしていないことを示しているようです。フロッピーブートセクタで実際に変更できるのは、約400バイトのコードだけです。 MS-DOSまたはWindowsがフロッピーに使用するものからBPB値をカスタマイズすることはできません。
ブートコードが占めるセクターの数を示す値がありますが、私が遭遇したすべてのBIOSおよびその他のソフトウェアは、ブート用に1つの予約済みセクターのみを期待または許容します。 FATの2つのコピーが必要であり、次にルートディレクトリの最初のセクターが必要です。セカンダリブートローダーを保存するために使用した方法は、ルートディレクトリに続くいくつかのセクターをハードアロケーションし、それらのセクターをFATで「不良」としてマークすることでした。これにより、次の目標が達成されました。
セカンダリローダーによって使用される追加のセクターはフロッピーの固定位置にあり、それらを読み取り/ロードする必要がある第1ステージのブートに認識されていました。
セカンダリローダーをユーザーから隠しました。
セカンダリローダーを削除不能にしました。
フロッピーはDOSで使用でき、Unixでマウント可能でした。
ところで、フロッピーにはブートセクタがあります。パーティションテーブルがないため、MBRと呼ばれますnotです。
これに対する自己完結型の答えを書きたいと思います。まず、Linuxでは、次の2つの手順から始めます。
dd if=/dev/zero of=floppy.img bs=512 count=2948
mkfs.vfat floppy.img
これにより、 Wikipedia「FATファイルシステムの設計」 で説明されているように、拡張BIOSパラメータブロックを使用してDOS4/OS2互換のFAT12ディスクが作成されます。
最初の3バイト「eb3c90」は、次の機械語です。JMP 3E \ NOP
は、BIOSパラメータブロックをスキップして、バイトオフセット62(10進数)[3E = 3C + 2(基数16)= 62(基数10)]でコードの実行を開始することを意味します。
オフセット62から、次の378バイトはブートストラップを書き込むためのものです。デフォルトのプログラムは、メッセージを出力し、キーを待ってから再起動します。
378バイトのx86バイナリプログラムを使用してmyBoot.binというファイルを作成します。
それはのみ378バイトです...あなた[〜#〜]できる[〜#〜]これですが、どうしても開始場所が必要な場合は、次のコマンドを使用してください。
dd bs=1 count=378 of=myBoot.bin if=floppy.img skip=62 conv=notrunc
最後に、フロッピーのストックMBRをカスタムmyBoot.binプログラムで上書きします。
dd bs=1 count=378 if=myBoot.bin of=floppy.img seek=62 conv=notrunc
これでフロッピーイメージが正常に作成され、デフォルトのブートプログラムが上書きされました。