QEMUを使用した組み込みLinuxシステムのエミュレート
はじめに
組み込みソフトウェアの開発は、開発ボードや外部モジュールデバイスなどの組み込みハードウェアデバイスに依存していますが、デバッグ作業が周辺機器と関係がない場合、ハードウェアを購入せずにQEMUを使用してシミュレートできるのはカーネルデバッグのみです。
LinuxおよびWindowsホスト、およびエミュレートされたPowerPC、ARM、MIPS、およびSPARCターゲットで使用できます。 QEMUは、ホストとターゲットプロセッサの間に最小限の変換レイヤーを提供するというアプローチを採用しています。 ホストプロセッサはエミュレータを実行しているプロセッサであり、ターゲットプロセッサはエミュレートされているものです。
以下は、QEMU開発環境をセットアップするプロセスの詳細な紹介です。
2。 環境
2.1使用環境
* Ubuntu-18.04.1
また:
※パソコン:Windows10
*仮想マシン:VirtualBox-5.18
*仮想OS:Ubuntu-18.04.1
*シミュレートされた開発ボード:vexpres
2.2環境のセットアップ時に使用されるツール
* qemu-4.2.0
* linux-4.14.172(Linuxカーネル)
*u-boot-2017.05
*busybox-1.31.1
* アーム-linux-gnueabi-gcc
関連するすべてのファイルを/ home / joe / qemuに配置します
3.クロスコンパイルツールをインストールします
#sudo apt install gcc-arm-linux-gnueabi
インストールが成功したかどうかを確認します
$ arm-linux-gnueabi-gcc -v
組み込み仕様を使用します。 COLLECT_GCC = arm-linux-gnueabi-gcc COLLECT_LTO_WRAPPER = / usr / lib / gcc-cross / arm-linux-gnueabi / 7 / lto-wrapper ターゲット:arm-linux-gnueabi 構成:../ src / configure -v –with-pkgversion = 'Ubuntu / Linaro 7.5.0-3ubuntu1〜18.04'–with-bugurl = file:/// usr スレッドモデル:posix gccバージョン7.5.0(Ubuntu / Linaro 7.5.0-3ubuntu1〜18.04) |
4.Linuxカーネルを構成およびコンパイルします
4.1Linuxカーネルのダウンロード
必要なカーネルバージョンをwww.kernel.orgからダウンロードします。
ここでは、比較的最新の長期的にサポートされているカーネルバージョンlinux-4.4.157をダウンロードします。
wgetの https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.4.157.tar.xz / qemuディレクトリへ
4.2Linuxカーネルを解凍します
#tar xvJf linux-4.4.157.tar.xz
4.3Linuxカーネルのコンパイル
//カーネルソースファイルディレクトリを入力します
#cd linux-4.4.157
CROSS_COMPILE = arm-linux-gnueabi- ARCH = armvexpress_defconfigを作成します
CROSS_COMPILE = arm-linux-gnueabi- ARCH = armmenuconfigを作成します
menuconfigを実行すると、ncursesパッケージが欠落していることが示される場合は、次のコマンドを実行してインストールします)
$ sudo apt-get install libncurses5-dev
メニュー設定を入力し、以下の設定を行います
クロスツールチェーンでコンパイルする
コンパイルが成功したら、ディレクトリの下にカーネルイメージファイルを生成します
arch / arm / boot、zImageおよびdtbは、便利な使用のために別のフォルダーにコピーできます
5.QEMUツールをインストールします
5.1QEMUをインストールする
* wget https://download.qemu.org/qemu-4.2.0.tar.xz
* tar xvJf qemu-4.2.0.tar.xz
* CD qemu-4.2.0
5.2QEMUを構成する前に依存パッケージをインストールする
#apt install zlib1g-dev
#apt install libglib2.0-0 libglib2.0-dev
#apt install libsdl1.2-dev
#apt install libpixman-1-dev libfdt-dev
コンパイル後にファイルが乱雑になるのを防ぐために、コンパイルの中間ターゲットパスとしてビルダーディレクトリを作成します。
QEMUを構成、コンパイル、インストールします。
5.3アームアーキテクチャの下ですべてのボードをサポートするようにQEMUを構成する
#.. / configure –target-list = arm-softmmu –audio-drv-list =
次のプロンプトが表示されたときにpixmanが見つからない場合は、
sudo apt-get installlibpixman-1-devを使用してインストールします。
5.4QEMUバージョンを表示する
5.5QEMUでサポートされている開発ボードを表示する
5.6QEMUの実行
#qemu-system-arm -M vexpress-a9 -m 512M -kernel ./zImage -dtb ./vexpress-v2p-ca9.dtb -nographic -append“ console = ttyAMA0”
OR:
$ pwd
/ home / joe / qemu
#qemu-system-arm -M vexpress-a9 -m 512M -kernel linux-.4.157 / arch / arm / boot / zImage -dtb linux-4.4.157 / arch / arm / boot / dts / vexpress-v2p-ca9。 dtb -nographic -append“ console = ttyAMA0”
qemuのテストと起動を改善するために、起動スクリプトstart.shを作成し、スクリプトにchmod + xstart.shを実行する権限を与えることができます。
#!/ bin / bashに
qemu-システムアーム\
-m vexpress-a9 \
-m 512M \
-カーネル/home/joe/jemu/linux-4.4.157/arch/arm/boot/zImage \
-dtb /home/joe/jemu/linux-4.4.157/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
-ノグラフィック\
-「console = ttyAMA0」を追加します
6.ルートファイルシステムを作成します
busyboxを使用して、単純なルートファイルシステムを作成します。
6.1busyboxツールのダウンロード
https://busybox.net/downloads/からbusyboxをダウンロードします
#wget https://busybox.net/downloads/busybox-1.31.1.tar.bz2
#tar xjvfbusybox-1.31.1.tar.bz2
#cdbusybox-1.31.1
#defconfigを作成します
#CROSS_COMPILE = arm-linux-gnueabi-を作成します
#make install CROSS_COMPILE = arm-linux-gnueabi-
次の情報が表示され、インストールが成功したことを示します。
インストールが完了すると、生成されたターゲットファイルはデフォルトで./_installディレクトリになります。
6.2ルートファイルシステムを生成する
6.2.1busyboxをコンパイルしてインストールする
#mkdir rootfs
#sudo cp -r _install / * rootfs /
6.2.2ルートファイルシステムにglibcライブラリを追加し、ローダーとダイナミックライブラリを追加します
#sudo cp -r _install / * rootfs /
#sudo cp -p / usr / arm-linux-gnueabi / lib / * rootfs / lib /
6.2.3 4つのtty端末デバイスを作成します(cは文字デバイス、4はメジャーデバイス番号、1〜4はマイナーデバイス番号をそれぞれ表します)
6.3SDカードファイルシステムイメージの作成
6.3.1空のSDカードイメージを生成する
#dd if = / dev / zero of = rootfs.ext3 bs = 1M count = 32
6.3.2SDカードをextsファイルシステムとしてフォーマットする
#mkfs.ext3 rootfs.ext3
6.3.3rootfsをSDカードに書き込む
#sudo mount -t ext3 rootfs.ext3 / mnt -o loop
#sudo cp -rf rootfs / * / mnt /
#sudo umount / mnt
7.確認します
7.1Qemuを起動する
次のコマンドを実行してテストし、コンパイルされたカーネルが正常に実行できるかどうかを確認します
#sudo qemu-system-arm -M vexpress-a9 -m 512M -kernel〜 / qemu / zImage –dtb〜 / qemu / vexpress-v2p-ca9.dtb -nographic -append“ console = ttyAMA0”
またはスクリプトを使用する:
上記のテストでは、カーネルがパニックを報告し、ルートファイルシステムが不足していることを示しています。
上記の問題は、x86環境で生成されたbusyboxツールが原因です。
busyboxのインストール時にmakeinstallを使用したので、
ARCH = arm CROSS_COMPILE = arm-linux-gnueabi-installを作成します |
コンパイルツールは、armプラットフォームで使用されるbusyboxツールを生成します
#ファイルrootfs / bin / busybox
rootfs / bin / busybox:ELF 32ビットLSB実行可能ファイル、ARM、EABI5バージョン1(SYSV)、動的リンク、インタープリター/ lib / ld-、GNU / Linux 3.2.0用、BuildID [sha1] = cbcd33b8d6c946cb19408a5e8e714de554c87f52、削除
7.2再確認
これで、QemuはLinuxカーネルを起動し、ファイルシステムを正常にマウントし、シリアル端末を介して簡単な機能でシステムと対話できるようになりました。 印刷プロセスで/etc/init.d/rcSを実行できないという問題は、/ etc / init.d / rcSファイルを追加するだけで済みます。 ファイルの内容は、プロンプトステートメントにすることができます。
7.3QEMUを終了します
qemuを終了するXNUMXつの方法
*別の端末入力:すべてのqemu-system-armを強制終了します
* Qemu入力の場合:Ctrl + A; NS
QEMU:終了しました
8.u-bootを使用してLinuxカーネルを起動します
組み込みシステムには通常、u-boot、kernel、rootfs、およびappfsが含まれます。 下図に示すARM開発ボード上のこれらの部品の位置関係
ブートローダー | ブートパラメータ | カーネル | rootfs | アプリ |
RootfsはボードまたはPCで実行できます
8.1Uブーツを準備する
8.1.1u-bootをダウンロードする
http://ftp.denx.de/pub/u-boot/、使用します:u-boot-2021.01.tar.bz2
#tar -jxvf u-boot-2018.09.tar.bz2
8.1.2u-bootをコンパイルします
#vim Makefile
CROSS_COMPILE = arm-linux-gnueabi-
#vim config.mk
ARCH =アーム
#vexpress_ca9x4_defconfig、エラーを作成します
必要:sudo apt install bison
sudo apt install flex
次に:#make-j4エラー
必要性:エクスポートCROSS_COMPILE = arm-linux-gnueabi-
エクスポートARCH = arm
もう一度:#vexpress_ca9x4_defconfigを作成します
#make -j4
8.1.3テスト、u-bootの開始
$ sudo qemu-system-arm -M vexpress-a9 -m 512M -kernel u-boot-2021.01 / u-boot –nographic
8.2カーネル構成のコンパイル
u-bootを使用してカーネルイメージを起動します。
カーネルをuImage形式にコンパイルする必要があります。
メモリ内のuImageのロードアドレスを指定する必要があります
カーネルをコンパイルするときに指定します。makeLOADADDR=? uImage -j4
#cd /home/joe/qemu/linux-4.4.157
#LOADADDR = 0x60003000 uImage-j4を作成します
u-bootのコンパイルが完了すると、ツールフォルダーの下にmkimageファイルが生成されます。このファイルをクロスコンパイラディレクトリの下のbinフォルダーにコピーします。
$ cd qemu / linux-4.4.157
エラー:
$ sudo apt install u-boot-tools
uImageを取得する
9.QEMUネットワーク機能の設定
Qemu仮想マシンがu-bootで起動するとき、uImageをメモリにロードする必要があり、uImageはTFTPサーバーを介してメモリ内の指定されたアドレスにダウンロードできます。
9.1ホストカーネルがtun / tapモジュールをサポートしているかどうかを確認します
//ブリッジネットワークが依存するXNUMXつのツールをインストールします
#sudo apt install uml-utilities bridge-utils
tunデバイスファイルの作成:/ dev / net / tun(通常は自動的に作成されます)
/ etc / network / interfacesを変更します(ネットワークを構成し、再起動して有効にします)
#sudo vim / etc / network / interfaces
auto loiface lo inet loopbackauto enp0s3 //仮想ネットワークカードの名前autobr0iface br0 inet dhcpbridge_ports enp0s3 |
再起動しない
#reboot
次に、Qemuのネットワーク環境を確認します
仮想ネットワークポートbr0は、Qemu仮想マシンとLinuxホスト間の通信用のネットワークポートです。
10.TFTPサーバーをインストールします
Qemuシミュレーション開発ボードのuImageを起動するときに、uImageをメモリにダウンロードするTFTPサーバーを作成します
10.1tftpツールをインストールします
$ apt-get install tftp-hpa tftpd-hpa xinetd
10.2構成ファイルを変更し、TFTPサーバーディレクトリを設定します
#sudo vim / etc / default / tftpd-hpa
...... TFTP_DIRECTORY =” / home / joe / tftpboot” ...... |
10.3Linuxホストにtftpディレクトリを作成します
#mkdir / home / joe / tftpboot
#chmod 777 / home / joe / tftpboot
10.4tftpサービスを再起動します
#sudo /etc/init.d/tftpd-hpa restart
10.5u-bootでカーネル起動パラメータを設定する
uImageとcexpress-v2p-ca9.dtbをtftpbootにコピーします
Qemuを起動して確認します
$ sudo qemu-system-arm -M vexpress-a9 -m 512M -kernel u-boot-2021.01 / u-boot –nographic -net nic、vlan = 0 -net tap、vlan = 0、ifname = tap0 -sdrootfs。 ext3
現在、rootfsディレクトリは単純なルートファイルシステムであり、ミラーファイルにすることができ、ミラーファイルを開発ボードに書き込むか、LinuxカーネルをQemuのu-bootで起動してマウントすることができます。ミラーファイル。 また、NFSネットワークファイルシステムを介して起動するように設定することもできます。
11.NFSファイルシステムをマウントします
11.1NFSサービスのインストールと構成
11.1.1インストール
$ sudo apt install nfs-kernel-server
11.1.2構成
$ sudo mkdir / home / joe / qemu / rootfs
$ sudo chown nobody:nogroup / home / joe / qemu / rootfs
$ sudo chmod 777 / home / joe / qemu / rootfs
$ sudo nano / etc / exports
追加:/ home / joe / qemu / rootfs *(rw、sync、no_root_squash)
nfsサーバーを再起動します。
$ sudo /etc/init.d/nfs-kernel-server restart
または:$ systemctl restart nfs-kernel-server
NFS共有ディレクトリが作成されているかどうかを確認します
$ sudo showmount –e
NFSネットワークファイルシステムを使用する場合、Linuxホストはシステムファイアウォールを閉じる必要があります。そうしないと、システムの実行中に異常が発生します。
まとめ
うまくいけば、このブログの助けを借りて、あなたはQEMUについてもっと知っているでしょう。 上で示したすべてのテクニックは、私たちのプログラムへのさまざまな提出で使用されました。 QEMUでエミュレートする単一の固定された方法はありません。 さまざまなテクニックを調べて、何が効果的かを確認してください。 知識をよく理解してください。そうすれば、それが予期しない方法でどのように役立つかに驚くでしょう。