QEMUを使用してBIOSおよびカーネル開発環境を構築します

説明

この記事では、主に、上記のBIOSと、ここで説明するGRUB、カーネル、およびファイルシステムを含む完全なシステムを作成します。

 

カーネルのダウンロードとコンパイル

使用する環境はUbuntu18.04であるため、カーネルのダウンロードとコンパイルは比較的簡単です。1つ目は、カーネルをダウンロードすることです。次のコマンドを使用する必要があります。

sudo apt install linux-source

ダウンロードプロセスは次のとおりです。

ダウンロードしたコードは、/ usr / srcディレクトリにあります。

ダウンロードして、指定されたディレクトリに配置します。

tar -xjvf linux-source-4.15.0.tar.bz2 -C /home/jw/code/

-Cは、解凍の宛先フォルダーを指定するために使用されます。これにより、Linuxソースコードが指定されたディレクトリにあり、使用されます。次に、/ home / jw / code / linux-source-4.15.0ディレクトリに入り、コンパイルを開始します。コンパイルする前に、.configファイルを作成する必要があります。便宜上、デフォルトの構成を直接使用してください(その後、実際の状況に応じて変更されます)。

make defconfig

その後、makeを使用してコンパイルできますが、依存ライブラリが存在しないため、コンパイルプロセス中にエラーが報告される場合があります。インストールするだけで、ここにインストールする必要があります(Ubuntuのバージョンが異なると、異なるライブラリをインストールする必要がある場合があります。実際の状況に応じてインストールしてください) :

sudo apt install libelf-dev
sudo apt install libssl-dev

コンパイルが成功すると、必要なカーネルファイルが〜/ code / linux-source-4.15.0 / arch / x86 / bootにあります。

コンパイルの最後に、make installを使用してカーネルをインストールしないように注意してください。これは、このカーネルをコンパイラにインストールしないためですが、カーネルを実行するには仮想マシン(QEMU)を使用する必要があります。つまり、bzImageがQEMU起動システムに使用されます。

 

GRUB

GRUBはgitからダウンロードできます。ここではGRUB2.02を使用しています。コマンドは次のとおりです。

git clone https://gitee.com/jiangwei0512/grub-2.02

ダウンロードが完了したら、ディレクトリに入り、最初に./configureを実行します。

./configure --target=x86_64 --with-platform=efi

ここではいくつかのパラメーターが使用されます。その中で、-targetパラメーターは対応するプラットフォームを指定するために使用され、x86 64ビットプラットフォームはここで指定され、他のパラメーター--with-platformはUEFIを指定するために使用されます。ただし、インストールする必要のあるライブラリがいくつかあるため、構成時にエラーが発生します。

sudo apt install flex bison

configureが正常に実行されたら、makeコマンドを実行できます。コンパイル時にalcocal-1.15エラーがない場合は、automakeをインストールし、autoreconf -i -fを実行して解決できますが、すべてのファイルにアクセスする簡単な方法があります。makeが成功したら、次のコマンドを使用してGRUBバイナリを生成します。

./grub-mkimage -p . -d ./grub-core/ -O x86_64-efi -o bootx64.efi XXX

次のパラメータについて簡単に説明します。-pは、grub.cfg、独立モジュール、およびその他のファイルが配置されているディレクトリを指定します。-dは、必要なものであり、システムにまだ存在していないため、コンパイルしたばかりのイメージとモジュールの場所を指定します; -Oはバイナリ形式を指定します。x86プラットフォームではUEFI形式が必要です。- oは出力ファイル名を指定するために使用されます。最後のXXXはGRUBモジュールであり、grub-coreディレクトリの* .moduleファイルです。

ここで使用されるモジュールは、次のように指定されています。

./grub-mkimage -p . -d ./grub-core/ -O x86_64-efi -o bootx64.efi boot linux part_msdos part_gpt fat normal serial efi_gop minicmd

最終的にコンパイルされたバイナリはbootx64.efi(UEFIのユニバーサルOSローダー名であるためこの名前が使用されます)であり、後で使用されます。さらに、GRUBにはgrub.cfgと呼ばれる対応する構成ファイルがあり、その特定のコンテンツは後で紹介されます。GRUBとその構成ファイルは、QEMUブートシステムに使用されます。

 

ビジーボックス

Busyboxのソースコードはhttps://busybox.net/downloads/からダウンロードできます。バージョン1.29.1は、指定されたディレクトリに解凍します。

tar -xjvf busybox-1.29.2.tar.bz2 -C /home/jw/code

次に、構成用のディレクトリを入力します(ソースコードディレクトリでmake menuconfigを実行します)。

構成する必要があるのは静的コンパイルを選択することであり、場所は[設定]の下にあります。menuconfigを使用するには、追加のライブラリ(libncurses5-dev)をインストールする必要がある場合があることに注意してください。構成後、makeを使用してコンパイルできます。コンパイルが完了したら、makeinstallコマンドを使用してインストールします。

make install

上記のコマンドを実行すると、現在のディレクトリに_installという新しいディレクトリが生成されます。カーネルが使用するinitramfsを生成するには、これらのファイルが必要です。対応するファイルは次のとおりです。

ここでは、最も単純なinitramfsを作成する方法を使用し、対応するコマンドは次のとおりです。

mkdir initramfs
cd initramfs
mkdir dev proc sys
cp ../_install/* ./ -ra
sudo cp -a /dev/{null,console,tty1,tty2,tty3,tty4} dev/
touch init
chmod a+x init

initの内容は次のとおりです。

mount -t proc none /proc
mount -t sysfs none /sys
mdev -s
exec /sbin/init

最後に、次のコマンドでパッケージ化します。

find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../initramfs.cpio.gz

initramfs.cpio.gzは、最終的に取得するファイルであり、QEMUブートシステムに使用されます。

 

QEMUブートシステム

1つ目は、QEMUで使用されるハードディスク(実際には単なるファイル)を作成し、それをFAT形式にフォーマットすることです(UEFIはデフォルトでこのタイプのみを認識するため)。

dd if=/dev/zero of=disk.img bs=1M count=32
mkfs.fat disk.img

ここで作成されるdisk.imgのサイズは32Mです。カーネル、initramfs、GRUBなどのサイズの合計よりも大きい限り、これは難しい要件ではありません。次の操作は、disk.imgをマウントし、上記のファイルをdisk.imgに配置することです。

sudo mount disk.img tmp
sudo mkdir tmp/EFI tmp/EFI/BOOT
sudo cp bootx64.efi grub.cfg tmp/EFI/BOOT
sudo cp bzImage initramfs.cpio.gz tmp

まず、disk.imgがディレクトリ(ここではtmp)にマウントされ、次にファイルがそこに配置されると言う必要があります。GRUBとその構成ファイルには特に注意を払う必要があります。これらは、最終ファイルである/ EFI / BOOTディレクトリに配置する必要があります。次のように:

この時点で、QEMUハードディスクとして使用できるdisk.imgに必要なファイルを配置しました。対応する手順は次のとおりです。

qemu-system-x86_64 -bios OVMF.fd -hda disk.img -m 512M

ここでのQEMUパラメータは次のとおりです。-biosはBIOS名、ここはOVMF.fd、-hdaはハードディスク、ここはdisk.img、-mは仮想マシンで使用されるメモリサイズを指定します。起動後の最終状態は次のとおりです。

この時点で、基本的なカーネルが開始されており、後でデバッグするためにシステムに依存することができます。

 

おすすめ

転載: blog.csdn.net/jiangwei0512/article/details/108176837