HN 日本語サマリー

← 一覧へ戻る
プログラミング

Mmukoブートシーケンス – QEMUで起動する小さなスタンドアロンCカーネル

Mmuko Boot Sequence – a tiny freestanding C kernel that boots in QEMU (github.com)

4 pointsby obinexus1 コメント

要約

この記事は、QEMUエミュレータ上で起動する、スタンドアロンの小さなC言語カーネル「MMUKO」について解説しています。ホストOSのCランタイムに依存しないフリースタンディングコードとして実装されており、BIOS直接起動とGRUBマルチブートの2つの起動パスがサポートされています。開発に必要なツールチェーンや、カーネル内でプログラムを実行する方法についても説明されています。

全文翻訳

MMUKO QEMUブートスキャフォールドこれは、MMUKOのブートアイデアを、QEMUで起動可能な小さなカーネルに変換するものです。重要な区別点:gistのmmuko-boot.cは通常のホスト型Cプログラムです。printf、malloc、calloc、およびホストOSのCランタイムを使用します。QEMUは、ファームウェア、ブートセクタ、カーネル、またはディスクイメージを起動します。起動時にはホスト型Cランタイムが存在しないため、MMUKOはスタンドアロンコードとして実行する必要があります。このスキャフォールドは2つの起動パスをサポートします。 パスA:Windowsマシン上での直接BIOSブートこのパスは、MinGW + QEMUセットアップで一般的に使用されるツール(as、gcc、ld、qemu-system-i386)を使用します。生のブートイメージをビルドします:.uild-direct.ps1実行します:qemu-system-i386 -drive format=raw,file=build\mmuko-direct.img,if=ide,index=0 -display none -serial stdio -no-rebootカーネルは意図的に最後に停止するため、QEMUはCtrl+Cで停止するまで実行され続けます。直接ブートパスは次のように機能します:boot16.sは512バイトのBIOSブートセクタとして開始します。ディスクLBA 1からカーネル-flat.binをメモリ0x10000にロードします。32ビット保護モードに切り替えます。kernel-entry.sにジャンプします。kernel-entry.sはkernel.c内のkernel_main()を呼び出します。 パスB:GRUBマルチブートGRUBパスは、ローダーとしてGRUBマルチブートを使用します:GRUBはカーネルを32ビット保護モードで起動します。kernel_main()は画面とシリアル出力を初期化します。mmuko_boot()はMMUKOのブートフェーズを実行します。mmuko_program_main()はブートが成功した後に実行されます。 ファイルboot.asm - マルチブートのエントリポイントとスタック設定。boot16.s - 直接BIOSブートセクタ。kernel-entry.s - 直接ブートフラットカーネルのエントリポイント。kernel.c - スタンドアロンMMUKOブートモデルと例のMMUKOプログラム。linker.ld - GRUBのためにカーネルを1 MiBに配置します。linker-flat.ld - 直接ブートカーネルを0x10000に配置します。grub.cfg - GRUBメニューエントリ。Makefile - ISOをビルドし、QEMUで実行します。build-direct.ps1 - Windows上で直接BIOSブートイメージをビルドします。 ツールチェーンWindows上で最も簡単なパスは、WSLまたはMSYS2で以下を使用することです:nasm i686-elf-gcc grub-mkrescue grub-file xorriso qemu-system-i386 makeDebian/Ubuntuライクな環境では、QEMU/GRUB/NASMは通常次のようにインストールできます:sudo apt install make nasm grub-pc-bin grub-common xorriso qemu-system-x86まだi686-elf-gccクロスコンパイラが必要です。まだお持ちでない場合は、OSDevスタイルのクロスコンパイラを使用するか、Makefileを既存のスタンドアロンi386コンパイラに合わせて調整してください。 GRUBビルドと実行make make runQEMUはVGAテキストを表示し、同じログが-serial stdioでシリアルにも書き込まれます。 プログラムの書き込み場所kernel.c内のこの関数を編集します:static void mmuko_program_main(MMUKO_System *sys)この関数は、このスキャフォールドにおける最初のMMUKO「プログラム」です。mmuko_boot(sys)がBOOT_OKを返した後にのみ実行されます。後で、ディスクから別のペイロードを読み込んでジャンプするローダーに置き換えることができますが、まずQEMUでの実験のためにプログラムをカーネルにコンパイルするのが最も簡単な方法です。