Centos7は、arm-vexpress-a9開発ボードをシミュレートするqemuシミュレーターを構築します
-
参照:
仕上げ:Hanshui Sitian https://www.cnblogs.com/phldylj/p/8299326.html
リリース:2018-01-16 23:06
元の作業:Morseコードhttps:// wwwでQemuを使用してvexpress-a9をシミュレートします。 cnblogs.com/pengdonglin137/p/5023342.html -
再
印刷の手順:CentOS7に正常に組み込まれている上記の情報を参照してください。モールスコードなど、事前に共有していただきありがとうございます。訪問者の役に立つことを願って、建設中にいくつかのピットが埋められました。以下は建設ノートです。
1.クロスコンパイラのダウンロードとインストール
-
1.ダウンロードアドレス:http://blog.csdn.net/dldw8816/article/details/46004167
linaro.orgのコンパイルツールチェーン(https://releases.linaro.org/components/toolchain/binaries/)
-
linaro.org、arm-linux-gnueabi、6.3.1-2017.05
- gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabi.tar.xz — 2018年2月27日00:3597.8M (OK)
- gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar.xz — 2018年2月26日23:5077.0M
- runtime-gcc-linaro-6.3.1-2017.05-arm-linux-gnueabi.tar.xz — 2018年1月28日18:336.2M
- sysroot-glibc-linaro-2.23-2017.05-arm-linux-gnueabi.tar.xz — 2018年2月27日00:3538.4M
-
linaro.org, arm-eabi (bare-metal, 裸机), 6.3-2017.05
ARM公式コンパイルツールチェーン
- arm.com、arm-eabi(AArch32ベアメタルターゲット、ベアメタル)、8.2-2019.01
- ソフトフロート付きAArch32ターゲット(arm-linux-gnueabi)
-
-
2.次に解凍します
# tar jxvf arm-2014.05-29-arm-none-linux-gnueabi-i686-pc-linux-gnu.tar.bz2 tar xvf gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabi.tar.xz
-
3.圧縮パッケージが配置されているディレクトリが/ homeであり、解凍後のディレクトリがarm-linux-gnueabi-6であると想定して、環境変数を追加します。
vim /etc/profile # 在最下面添加 export PATH=$PATH:/home/arm-linux-gnueabi-6/bin # 然后更新 source /etc/profile
-
4.インストールが成功したかどうかをテストします
arm-linux-gnueabi-gcc -v
2.qemuのインストール
-
参照:
-
公式サイト:https://download.qemu.org/
-
ステップ:
# 下载源代码 wget https://download.qemu.org/qemu-3.1.0.tar.xz tar xvf qemu-3.1.0.tar.xz # 新建编译目标路径 mkdir build # 编译 cd qemu-3.1.0 ./configure --target-list=arm-softmmu --audio-drv-list= --prefix=/root/qemu/build # 配置qemu,支持模拟arm架构下的全部单板 # ./configure --prefix=/root/xxx/build make -j8 make install # 说明: $./configure --enable-kvm --enable-debug --enable-vnc --enable-werror --target-list=arm-softmmu --audio-drv-list= # configure脚本用于生成Makefile,其选项可以用./configure --help查看。这里使用到的选项含义如下: # --enable-kvm:编译KVM模块,使QEMU可以利用KVM来访问硬件提供的虚拟化服务。 # --enable-vnc:启用VNC。 # --enalbe-werror:编译时,将所有的警告当作错误处理。 # --target-list:选择目标机器的架构。默认是将所有的架构都编译,但为了更快的完成编译,指定需要的架构即可。
3.ubootのインストール
-
1)、ソースファイルのダウンロード:http://ftp.denx.de/pub/u-boot/
wget http://ftp.denx.de/pub/u-boot/u-boot-2018.09.tar.bz2
-
2)、ソースファイルを解凍します
tar jvxf u-boot-2018.01.tar.bz2 -C xxxx (xxx为需要解压的目录)
-
3)U-Bootソースファイルディレクトリに入り、以下を実行します。
# export CROSS_COMPILE=arm-none-eabi- export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabi- # 要求bison等 yum install bison flex # 编译 make vexpress_ca9x4_defconfig make # 或执行如下2个步骤 # make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_ca9x4_defconfig # make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm
コンパイルが完了した後、u-bootファイルがディレクトリに生成されている場合、コンパイルは成功しています。
-
4)U-Bootソースコードディレクトリにスクリプトrun.shを記述します
qemu-system-arm -M vexpress-a9 -nographic -m 512M -kernel u-boot
次に、chmod + xrun.shはファイル実行権限を増やします。
-
5)最後に./run.shを実行すると、ブートローダーが起動していることがわかりますが、イメージファイルがありません。
smc911x: MAC 52:54:00:12:34:56 Wrong Image Format for bootm command ERROR: can't get kernel image! =>
Ctrl + a、Xを押して終了します
4.カーネルをコンパイルします
-
参照ブログ投稿:http://blog.csdn.net/aggresss/article/details/54946438
-
公式ダウンロードアドレス:https://www.kernel.org/pub/linux/kernel/
-
Gitクローン
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
-
ダウンロード
wget https://mirrors.tuna.tsinghua.edu.cn/kernel/v3.x/linux-3.18.135.tar.xz
-
1)、arch / arm / configsからカーネルをコンパイルする必要がある構成ファイルvexpress_defconfigを見つけて、ソースコードのルートディレクトリにコピーします。
-
2)、コマンドを実行します
# export CROSS_COMPILE=arm-none-eabi- # export ARCH=arm make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig # 生成vexpress开发板的config文件 make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm zImage make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm modules make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm dtbs
-
3)コンパイル後にarch / arm / bootディレクトリにzImageファイルを生成します。これは正常にコンパイルされたことを意味します。
- テスト
qemu-system-arm -M vexpress-a9 -m 512M -kernel zImage -nographic -append "console=ttyAMA0"
- カーネル起動パラメーターのconsole =パラメーターに入力する必要があるttyはどれですか?
- 参照:https://blog.csdn.net/qingtian12138/article/details/53609526
- 解決策:ボードごとにシリアルポートドライバーの種類が異なるため、作成されるttyデバイスの名前ももちろん異なります。vexpressボードのttyデバイス名は何ですか?実際、この値は、生成された.configファイルのCONFIG_CONSOLEマクロから見つけることができます。
- テスト
-
4)、カーネルバージョンについて
- 参照:https://www.cnblogs.com/mfmdaoyou/p/6934098.html
- 説明:本線の3.18バージョン番号以降のバージョン番号のコードは、この工法では実行できないことがわかりました。問題の根本的な原因はまだ特定されていません。リーダーが高速で正常にビルドしたいとします。バージョン3.16のカーネルを使用してビルドすることをお勧めします。
-
5)3.1.16カーネルをarm-none-eabi-バージョン5.4でコンパイルすると、次のエラーが報告されます。
include/linux/compiler-gcc.h:106:30: fatal error: linux/compiler-gcc6.h: No such file or directory #include gcc_header(__GNUC__)
- この問題を解決するには、Linaroの公式Webサイト(https://releases.linaro.org/components/toolchain/binaries/)から対応するバージョンのクロスコンパイルツールをダウンロードできます。
# 原因是因为我使用的交叉编译工具链版本太高(6.2.1版本)导致,先在内核代码根目录下搜索compiler-gcc* ./include/linux/compiler-gcc3.h ./include/linux/compiler-gcc5.h ./include/linux/compiler-gcc.h ./include/linux/compiler-gcc4.h # 支持的版本有3、4、5,在Linaro官网上下载5版本的交叉编译工具链即可解决问题。
- 著者はまた、3.1.16をgcc-linaro-6.3.1バージョンのarm-linux-gnueabiでコンパイルするときに上記の問題を報告し、バージョン3.18.135をコンパイルしても上記の問題は報告されませんでした。
- この問題を解決するには、Linaroの公式Webサイト(https://releases.linaro.org/components/toolchain/binaries/)から対応するバージョンのクロスコンパイルツールをダウンロードできます。
5.busyboxをコンパイルします
-
1)、https://busybox.net/downloads/からbusyboxをダウンロードします
-
2)、Busyboxソースファイルディレクトリに入り、make menuconfigを実行します。エラーが報告された場合は、yum list ncursesを実行してから、リストされているものをインストールします。
Busybox Setting -> Build options -> Build Busybox as a static binary (no shared libs) # 选中 静态编译。 -> Cross Compiler prefix # 交叉编译器配置(arm-linux-gnueabi-,可make命令带入) -> Installation options -> BusyBox installation prefix # 默认目标位置(若不指定,需手动移到rootfs;若已有rootfs,可指定rootfs位置<推荐,自动完成>)
注:「Busyboxを静的バイナリとしてビルドする(共有ライブラリなし)」を選択しない場合、qemuを起動すると、「カーネルパニック」エラーが報告されます。
-
3)、コンパイル
make distclean # 清除原有配置 make menuconfig # 配置命令选项 make CROSS_COMPILE=arm-linux-gnueabi- make CROSS_COMPILE=arm-linux-gnueabi- install # 在_install 目录下生成编译文件: bin sbin linuxrc usr 等
-
4)、問題
- arm-none-eabi-を使用してbusyboxをコンパイルすると、curses.hが見つからないというエラーが報告されます。
# make menuconfig HOSTCC scripts/basic/fixdep HOSTCC scripts/basic/split-include HOSTCC scripts/basic/docproc HOSTCC scripts/kconfig/conf.o HOSTCC scripts/kconfig/kxgettext.o HOSTCC scripts/kconfig/mconf.o HOSTCC scripts/kconfig/zconf.tab.o HOSTLD scripts/kconfig/mconf HOSTCC scripts/kconfig/lxdialog/checklist.o In file included from scripts/kconfig/lxdialog/checklist.c:24:0: scripts/kconfig/lxdialog/dialog.h:31:20: 致命错误:curses.h:没有那个文件或目录 #include CURSES_LOC
- 解決する:
- 方法:アプリケーションをコンパイルする場合、 ** arm-none-eabi-バージョンのコンパイラを使用するのではなく、 arm-linux-gnueabi-**バージョンのコンパイラを使用するのが適切です。
- 参照:ARMクロスコンパイラGNUEABI、NONE-EABI、ARM-EABI、GNUEABIHFなどの違い(http://www.veryarm.com/296.html)
6.ルートファイルシステムを作成します
-
1)、32Mの空のファイルを作成します
dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32
-
2)、フォーマット
mkfs.ext3 a9rootfs.ext3
-
3)、ルートファイルシステムディレクトリを作成します
mkdir rootfs
-
4)busyboxの下のファイルをコピーします
cp busybox/busybox-1.26.2/_install/* -r rootfs/
-
5)、クロスコンパイラのライブラリをコピーします
mkdir rootfs/lib/ cp -P /xxx/arm-linux-gnueabi/lib/* rootfs/lib/
-
6)、端末機器を作成する
mkdir rootfs/dev/ mknod rootfs/dev/tty1 c 4 1 mknod rootfs/dev/tty2 c 4 2 mknod rootfs/dev/tty3 c 4 3 mknod rootfs/dev/tty4 c 4 4 mknod rootfs/dev/console c 5 1 mknod rootfs/dev/null c 1 3
-
7)、必要なディレクトリを作成します
mkdir -p rootfs/proc/ mkdir -p rootfs/sys/ mkdir -p rootfs/tmp/ mkdir -p rootfs/root/ mkdir -p rootfs/var/ mkdir -p rootfs/mnt/
-
8)一時ディレクトリを作成し、空白のファイルでマップします。目的は、ルートファイルシステムをそのディレクトリにコピーすることです。
mkdir tmpfs mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop cp -r rootfs/* tmpfs/ umount tmpfs
-
0)、上記の手順のスクリプトは、
ディレクトリを作成し、zImage、vexpress-v2p-ca9.dtb、_installディレクトリを1つのディレクトリにコピーします# 打开脚本文件 vim mkrootfs.sh # 粘贴如下内容 rm -rf rootfs rm -rf tmpfs rm -f a9rootfs.ext3 mkdir rootfs cp ../busybox/busybox-1.26.2/_install/* rootfs/ -raf # 与你的busybox的目录有关 mkdir -p rootfs/proc/ mkdir -p rootfs/sys/ mkdir -p rootfs/tmp/ mkdir -p rootfs/root/ mkdir -p rootfs/var/ mkdir -p rootfs/mnt/ cp -arf ~/xxx/arm-linux-gnueabi-6/lib/lib rootfs/ # 与你的arm-linux-gnueabi-的目录有关 rm rootfs/lib/*.a arm-linux-gnueabi-strip rootfs/lib/* mkdir -p rootfs/dev/ mknod rootfs/dev/tty1 c 4 1 mknod rootfs/dev/tty2 c 4 2 mknod rootfs/dev/tty3 c 4 3 mknod rootfs/dev/tty4 c 4 4 mknod rootfs/dev/console c 5 1 mknod rootfs/dev/null c 1 3 dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=32 mkfs.ext3 a9rootfs.ext3 mkdir -p tmpfs mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop cp -r rootfs/* tmpfs/ umount tmpfs
7、開始
# 拷贝kernel文件到a9rootfs.ext3所在目录,以便执行
cp -r ../kernel/linux-3.18.135/arch/arm/boot/ .
# 执行
qemu-system-arm -nographic -sd a9rootfs.ext3 -M vexpress-a9 -m 512M -kernel zImage -dtb ./dts/vexpress-v2p-ca9.dtb -append "init=/linuxrc root=/dev/mmcblk0 rw rootwait earlyprintk console=ttyAMA0"
qemu-system-arm -serial stdio -sd a9rootfs.ext3 -M vexpress-a9 -m 512M -kernel zImage -dtb ./dts/vexpress-v2p-ca9.dtb -append "init=/linuxrc root=/dev/mmcblk0 rw rootwait earlyprintk console=ttyAMA0"
8.注意
- 1)上記をコンパイルする前に、export ARCH = arm; export CROSS_COMPILE = arm-linux-gnueabi-を確認してください。
- 2)エラーが報告された場合、通常、一部のライブラリ、BaiduまたはGoogleには含まれていません。
9.問題
- 1)、audio:「oss」オーディオドライバを初期化できませんでした
- 解決策:[QEMUの下で仮想マシン内のサウンドカードシミュレーション方法の概要(https://blog.csdn.net/hubbybob1/article/details/77199567)](https://blog.csdn.net/hubbybob1/article/details/ 77199567)