4

OS作りの基礎を学んでいます。マルチ ブート ヘッダーに準拠した .asm ファイルと .c ファイルを作成しました。.asm ファイルのコードは、.c ファイルのメイン関数を呼び出します。

問題は、.asm ファイルと .c ファイルのコンパイルとリンク後に生成されたファイルから QEMU を起動できないことです。

起動可能なデバイスが見つからないというだけです。

ただし、次のような単純な .asm ファイルから起動できます:-

  mov ax, 0x0e
  mov al, 'H' 
  int 10h 
  times 510 - ($ - $$) db 0 
  jmp $ 
  dw 0xaa55 

私がしなければならないことがもっとありますか?

4

3 に答える 3

11

QEMU 2.0.0 はマルチブートをサポートします

man qemu言います:

-カーネル bzImage

bzImage をカーネル イメージとして使用します。カーネルは、Linux カーネルまたはマルチブート形式のいずれかです。

最小限の Hello World の例をhttps://github.com/cirosantilli/x86-bare-metal-examples/tree/dbbed23e4753320aff59bed7d252fb98ef57832f/multibootにアップロードしました。

GAS + C マルチブート ファイルを生成し、QEMU を使用して実行します。

grub-mkrescueまた、マルチブート バイナリを起動可能な.isoイメージに変換することもできます。これは別の優れたアプローチです。

Barryはmultiboot2 がサポートされていないと述べています。テストしたい場合に備えて multiboot2 イメージを生成する方法: multiboot2 仕様で単純なカーネルを正しくコンパイルする方法は?

于 2015-09-13T13:44:40.203 に答える
-1

QEMU はマルチブートをネイティブでサポートしていません。代わりに、仮想ハード ドライブ イメージを作成し、ある種のマルチブート ブート ローダー (grub など) をインストールしてから、マルチブート イメージをドライブのどこかに (つまり、パーティション上のファイルに) 配置する必要があります。

実際に仮想 HDD に grub をインストールする限り、複数の方法がありますが、私がいつも使用するプロセスは次のとおりです。

  1. qemu-imgまたはを使用dd if=/dev/zeroして、HDD イメージを作成します。
  2. Linux インストーラー ISO をダウンロードします (私は通常 Arch Linux を使用します)。
  3. qemuを使用して、空の HDD イメージと ISO で起動し-hda <HDD-image-filename> -cdrom <ISO-file-name> -boot once=dます。最後のビットはqemu、最初に CD からの起動を試みることを保証します。
  4. fdisk/ parted/etc を使用してディスクをフォーマットします。
  5. ブート パーティション (grub をインストールするパーティション) をマウントし、grub-install.
  6. エミュレーターをアンマウントしてシャットダウンします。

次に、HDD イメージから起動し、マルチブート イメージを起動するために選択した任意のローダーまたは grub を使用できます。


単純な ASM の例が機能する理由は、典型的なハード ドライブの最初のセクターである MBR を効果的にエミュレートしているためです。そのため、QEMU の BIOS はそこから起動します (具体的には、その0xaa55署名が表示されます)。

于 2014-08-24T14:48:18.393 に答える