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
-
1. Dirección de descarga: http://blog.csdn.net/dldw8816/article/details/46004167
La cadena de herramientas de compilación de 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 - 27-Feb-2018 00:35 97.8M (OK)
- gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabi.tar.xz - 26-febrero-2018 23:50 77.0M
- tiempo de ejecución-gcc-linaro-6.3.1-2017.05-arm-linux-gnueabi.tar.xz - 28-Jan-2018 18:33 6.2M
- sysroot-glibc-linaro-2.23-2017.05-arm-linux-gnueabi.tar.xz - 27-Feb-2018 00:35 38.4M
-
linaro.org , arm-eabi (metal desnudo, escritorio desnudo), 6.3-2017.05
Cadena de herramientas de compilación oficial ARM
- arm.com , arm-eabi (objetivo de metal desnudo AArch32, metal desnudo), 8.2-2019.01
- Objetivo AArch32 con flotación suave (arm-linux-gnueabi)
-
-
2. Luego descomprime
# 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. Agregue variables de entorno, asumiendo que el directorio donde se encuentra el paquete comprimido es / home y el directorio después de la descompresión es arm-linux-gnueabi-6.
vim /etc/profile # 在最下面添加 export PATH=$PATH:/home/arm-linux-gnueabi-6/bin # 然后更新 source /etc/profile
-
4. Pruebe si la instalación es exitosa
arm-linux-gnueabi-gcc -v
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
- linux-3.18.135.tar.xz - 78MB 2019-02-07 00:47 (muy rápido)
-
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.
- prueba
-
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.
- 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.
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
- resolver:
- Método: Al compilar la aplicación, no es adecuado usar la versión ** arm-none-eabi- del compilador, pero debe usar la versión arm-linux-gnueabi - ** del compilador
- Referencia: Diferencias entre compiladores cruzados ARM GNUEABI, NONE-EABI, ARM-EABI, GNUEABIHF, etc. (http://www.veryarm.com/296.html)
6.Haga el sistema de archivos raíz
-
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
- 1) 、 audio: No se pudo iniciar el controlador de audio'oss '
- Solución: [Resumen del método de simulación de la tarjeta de sonido en una máquina virtual bajo QEMU ( https://blog.csdn.net/hubbybob1/article/details/77199567 )] ( https://blog.csdn.net/hubbybob1/article/details/ 77199567 )