コントロールボード

QEMUを使用した組み込みLinuxシステムのエミュレート

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

* arm-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 \

-nographic \

-「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でエミュレートする単一の固定された方法はありません。 さまざまなテクニックを調べて、何が効果的かを確認してください。 知識をよく理解してください。そうすれば、それが予期しない方法でどのように役立つかに驚くでしょう。

お問い合わせ