Centos7 搭建qemu模擬器模擬arm-vexpress-a9開發板

Centos7 搭建qemu模擬器模擬arm-vexpress-a9開發板

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 +x run.sh 增加文件執行權限。

  • 5)、最後執行./run.sh,可以看到啓動了bootloader,但是會提示沒有映像文件

    smc911x: MAC 52:54:00:12:34:56
    Wrong Image Format for bootm command
    ERROR: can't get kernel image!
    => 
    

    Ctrl+a,X 退出

4、編譯內核

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位置<推薦,自動完成>)
    

    注意:若不選中“Build Busybox as a static binary (no shared libs)”,起qemu運行時,將會報“kernel panic”錯誤!

  • 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 (一)— 搭建Linux kernel調試環境 (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)、拷貝交叉編譯器的lib

    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目錄拷貝在一個目錄下

    # 打開腳本文件
    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)、若報錯,一般是某些庫沒有包含,自行百度或google

9、問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章