web-dev-qa-db-ja.com

フロッピーイメージを作成してMBRを上書きする方法

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.
3
Chris

この種のものにPOSIXツールセットを使用する際の問題のいくつかを学んでいます。ボリュームのVBRにbootstrapプログラムをインストールすることはではなくデータでいっぱいのセクターを非難するだけの問題です画像からのセクター#0。あなたは、既存の BIOSパラメーターブロック を保持し、いくつかのBPBバリアントに対処する必要があります

MS/PC/DR-DOS、OS/2、Windows NTなどのオペレーティングシステムに付属するツールは、BPBなどのことをすべて知っています。彼らのさまざまなsyssysinstxbootsectおよびその他のツールは、物事がどのように処理されるかを知っています。ただし、ddなどのPOSIXツールを使用する場合は、手動でVBRで上書きするバイトと保存するバイトを指定する必要があります-です。

ms-sys BPBを保持する方法も知っていますが、カスタムbootstrapプログラムを適用するオプションはありません。新しい機能としてリクエストしてください。

3
JdeBP

私は実際に2ステージのフロッピーブートローダーをずっと前に書いたことがあります。 (Microsoftまたは他の「専門家」からの)さまざまな仕様が言っているかもしれませんが、ディスケットの最初のセクターは、BIOSパラメータブロックBPBを備えた標準のMS-DOSフロッピーに準拠している必要があります。表示されているエラーメッセージは、「boot1.bin」がこの要件を満たしていないことを示しているようです。フロッピーブートセクタで実際に変更できるのは、約400バイトのコードだけです。 MS-DOSまたはWindowsがフロッピーに使用するものからBPB値をカスタマイズすることはできません。

ブートコードが占めるセクターの数を示す値がありますが、私が遭遇したすべてのBIOSおよびその他のソフトウェアは、ブート用に1つの予約済みセクターのみを期待または許容します。 FATの2つのコピーが必要であり、次にルートディレクトリの最初のセクターが必要です。セカンダリブートローダーを保存するために使用した方法は、ルートディレクトリに続くいくつかのセクターをハードアロケーションし、それらのセクターをFATで「不良」としてマークすることでした。これにより、次の目標が達成されました。

  1. セカンダリローダーによって使用される追加のセクターはフロッピーの固定位置にあり、それらを読み取り/ロードする必要がある第1ステージのブートに認識されていました。

  2. セカンダリローダーをユーザーから隠しました。

  3. セカンダリローダーを削除不能にしました。

  4. フロッピーはDOSで使用でき、Unixでマウント可能でした。

ところで、フロッピーにはブートセクタがあります。パーティションテーブルがないため、MBRと呼ばれますnotです。

2
sawdust

これに対する自己完結型の答えを書きたいと思います。まず、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

これでフロッピーイメージが正常に作成され、デフォルトのブートプログラムが上書きされました。

1
ABridgeTooFar