Centos7 construye el simulador qemu para simular la placa de desarrollo arm-vexpress-a9

Centos7 construye el simulador qemu para simular la placa de desarrollo arm-vexpress-a9

  • referencia:

    Acabado: Hanshui Sitian https://www.cnblogs.com/phldylj/p/8299326.html

    Lanzamiento: 2018-01-16 23:06

    Trabajo original: Simular vexpress-a9 con Qemu por código Morse https: // www. cnblogs.com/pengdonglin137/p/5023342.html

  • Instrucciones de reimpresión:
    consulte la información anterior y la compilación con éxito en CentOS 7. Gracias por compartir de antemano, como el código Morse. Algunos pozos se rellenaron durante la construcción, con la esperanza de ser útiles para los visitantes, las siguientes son las notas de construcción.

1. Descarga e instalación del compilador cruzado

2. Instalación de qemu

  • referencia:

  • Sitio web oficial: https://download.qemu.org/

  • paso:

    # 下载源代码
    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. instalación de uboot

Referencia: http://blog.csdn.net/aggresss/article/details/54945726

  • 1), descarga del archivo fuente: http://ftp.denx.de/pub/u-boot/

    wget http://ftp.denx.de/pub/u-boot/u-boot-2018.09.tar.bz2
    
  • 2), descomprime el archivo fuente

    tar jvxf u-boot-2018.01.tar.bz2 -C xxxx  (xxx为需要解压的目录)
    
  • 3) Ingrese al directorio del archivo fuente de U-Boot y luego ejecute:

    # 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
    

    Una vez completada la compilación, si el archivo u-boot se genera en el directorio, la compilación es exitosa.

  • 4) Escriba el script run.sh en el directorio de código fuente de U-Boot

    qemu-system-arm -M vexpress-a9 -nographic -m 512M -kernel u-boot
    

    Entonces chmod + x run.sh aumenta los permisos de ejecución de archivos.

  • 5), finalmente ejecute ./run.sh, puede ver que el gestor de arranque está iniciado, pero no hay archivo de imagen

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

    Presione Ctrl + a, X para salir

4. Compile el kernel

  • Publicación de blog de referencia: http://blog.csdn.net/aggresss/article/details/54946438

  • Dirección de descarga oficial: https://www.kernel.org/pub/linux/kernel/

  • Espejo de la Universidad de Tsinghua: https://mirrors.tuna.tsinghua.edu.cn/kernel

  • Clon de Git

    git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
    
  • Descargar

    wget https://mirrors.tuna.tsinghua.edu.cn/kernel/v3.x/linux-3.18.135.tar.xz
    
  • 1), busque el archivo de configuración vexpress_defconfig que necesita compilar el kernel desde arch / arm / configs y cópielo en el directorio raíz del código fuente

  • 2), ejecuta el comando

    # 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) Genere el archivo zImage en el directorio arch / arm / boot después de compilar, significa compilar correctamente.

    • prueba
      qemu-system-arm -M vexpress-a9 -m 512M -kernel zImage -nographic -append "console=ttyAMA0"
      
    • ¿Qué tty se debe completar en el parámetro console = en los parámetros de inicio del kernel?
      • Referencia: https://blog.csdn.net/qingtian12138/article/details/53609526
      • Solución: debido a que los tipos de controladores de puerto serie de diferentes placas son diferentes, los nombres de los dispositivos tty creados también son diferentes. ¿Cuál es el nombre del dispositivo tty de la placa vexpress? De hecho, este valor se puede encontrar en la macro CONFIG_CONSOLE del archivo .config generado.
  • 4), sobre la versión del kernel

    • Referencia: https://www.cnblogs.com/mfmdaoyou/p/6934098.html
    • Explicación: Se encontró que el número de versión 3.18 y el siguiente número de versión del código en la línea principal no se pueden ejecutar usando este método de construcción. Aún no se ha identificado la causa raíz del problema. Suponga que el lector quiere construir con éxito a alta velocidad. Se recomienda utilizar el kernel de la versión 3.16 para compilar.
  • 5) Cuando compilo el kernel 3.1.16 con arm-none-eabi- versión 5.4, se informa el siguiente error

    include/linux/compiler-gcc.h:106:30: fatal error: linux/compiler-gcc6.h: No such file or directory
    #include gcc_header(__GNUC__)
    
    • Puede descargar la versión correspondiente de la herramienta de compilación cruzada en el sitio web oficial de Linaro (https://releases.linaro.org/components/toolchain/binaries/) para resolver este problema.
      # 原因是因为我使用的交叉编译工具链版本太高(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版本的交叉编译工具链即可解决问题。
      
    • El autor también informó los problemas anteriores al compilar 3.1.16 con la versión gcc-linaro-6.3.1 de arm-linux-gnueabi, y la compilación de la versión 3.18.135 no informó los problemas anteriores.

5. Compilar busybox

  • 1), descargue busybox de https://busybox.net/downloads/

  • 2), ingrese al directorio del archivo fuente Busybox y ejecute make menuconfig, si se reporta un error, yum list ncurses , y luego instale las cosas listadas

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

    Nota : Si no selecciona "Construir Busybox como binario estático (sin bibliotecas compartidas)", cuando inicie qemu, informará de un error de "pánico del kernel".

  • 3), compilar

    make distclean   # 清除原有配置
    make menuconfig  # 配置命令选项
    make CROSS_COMPILE=arm-linux-gnueabi-
    make CROSS_COMPILE=arm-linux-gnueabi- install   # 在_install 目录下生成编译文件: bin sbin linuxrc usr 等
    
  • 4), el problema

    • Al compilar busybox con arm-none-eabi-, se informa de un error que no puede encontrar 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.Haga el sistema de archivos raíz

  • Referencia: Use Qemu para simular vexpress-a9 (1) - Cree un entorno de depuración del kernel de Linux (https://blog.csdn.net/qingtian12138/article/details/53609526)

  • 1), crea un archivo en blanco, 32M

    dd if=/dev/zero of=a9rootfs.ext3  bs=1M  count=32
    
  • 2), formato

    mkfs.ext3 a9rootfs.ext3
    
  • 3), cree un directorio del sistema de archivos raíz

    mkdir rootfs
    
  • 4) Copie los archivos en busybox

    cp busybox/busybox-1.26.2/_install/* -r rootfs/
    
  • 5), copie la biblioteca del compilador cruzado

    mkdir rootfs/lib/
    cp -P /xxx/arm-linux-gnueabi/lib/* rootfs/lib/
    
  • 6), crear equipos terminales

    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), crea los directorios necesarios

    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), cree un directorio temporal y mapee con archivos en blanco, el propósito es copiar el sistema de archivos raíz en él

    mkdir tmpfs
    mount -t ext3  a9rootfs.ext3  tmpfs/ -o  loop 
    cp -r rootfs/* tmpfs/
    umount tmpfs
    
  • 0), el script de los pasos anteriores,
    cree un directorio, copie los directorios zImage, vexpress-v2p-ca9.dtb, _install en un directorio

    # 打开脚本文件
    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, empezar

# 拷贝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. Atención

  • 1). Antes de compilar lo anterior, asegúrese de exportar ARCH = arm; export CROSS_COMPILE = arm-linux-gnueabi-
  • 2). Si se informa un error, generalmente no se incluye en algunas bibliotecas, Baidu o Google

9. Problema

Supongo que te gusta

Origin blog.csdn.net/hylaking/article/details/88423941
Recomendado
Clasificación