Centos7は、arm-vexpress-a9開発ボードをシミュレートするqemuシミュレーターを構築します

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.クロスコンパイラのダウンロードとインストール

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のインストール

参照:http//blog.csdn.net/aggresss/article/details/54945726

  • 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/

  • 清華大学ミラー:https//mirrors.tuna.tsinghua.edu.cn/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をコンパイルしても上記の問題は報告されませんでした。

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
    

6.ルートファイルシステムを作成します

  • 参照:Qemuを使用してvexpress-a9をシミュレートします(1)— Linuxカーネルデバッグ環境を構築します(https://blog.csdn.net/qingtian12138/article/details/53609526)

  • 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.問題

おすすめ

転載: blog.csdn.net/hylaking/article/details/88423941