x86的PC机上运行ARM架构开发板
Posted sydyh43
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了x86的PC机上运行ARM架构开发板相关的知识,希望对你有一定的参考价值。
一、背景
1、当你需要基于arm + linux框架开发需求(如驱动,应用程序,调试等)时,但是没有相应的物理开发环境,只有一台装了虚拟机linux系统的X86电脑。如果是这种情况,可以继续往下看。
2、需要linux系统上安装虚拟机qemu,在qemu上运行arm环境。
3、一套完整的arm + linux启动流程,主要包括u-boot,kernel和rootfs这三元组。其中在qemu中,可以跳过u-boot来启动内核,挂载文件系统。
基于以上几个组成部分,完成安装。
二、安装
1、准备工作,先运行以下命令行,否者会出现
sudo apt-get update
无法定位软件包问题。
2、安装交叉编译工具链,可以通过arm-linux-gnueabi-gcc -v命令查看安装情况
sudo apt-get install gcc-arm-linux-gnueabi
sudo apt-get install g++-arm-linux-gnueabi
3、安装虚拟环境qemu
3.1、安装需要的工具包
sudo apt-get install build-essential pkg-config zlib1g-dev
sudo apt-get install libglib2.0-0 libglib2.0-dev
sudo apt-get install libsdl1.2-dev
sudo apt-get install libpixman-1-dev libfdt-dev
sudo apt-get install autoconf automake libtool
sudo apt-get install librbd-dev
sudo apt-get install libaio-dev
sudo apt-get install flex bison
3.2、安装qemu
wget https://download.qemu.org/qemu-5.0.0.tar.xz
tar -xf qemu-5.0.0.tar.xz
cd qemu-5.0.0/
sudo ./configure --prefix=/usr/local/qemu-5.0.0 --target-list=arm-softmmu --audio-drv-list=
sudo make
sudo make install
ls /usr/local/bin/ -al
sudo ln -s /usr/local/qemu-5.0.0/bin/* /usr/local/bin/
3.3、查看安装结果
qemu-img -V
qemu-system-arm -M help
4、安装kernel
4.1、安装需要的开发包
sudo apt-get install libncurses-dev
4.2、安装kernel
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.214.tar.gz
tar -xf linux-4.14.214.tar.gz
cd linux-4.14.214/
vi Makefile #手动替换ARCH = arm CROSS_COMPILE = arm-linux-gnueabi-
make vexpress_defconfig #选择vexpress平台开发板
make zImage -j4
make modules -j4
make dtbs
pwd
find -name zImage
5、制作rootfs
5.1、编译busybox
wget https://busybox.net/downloads/busybox-1.32.1.tar.bz2
tar -xf busybox-1.32.1.tar.bz2
cd busybox-1.32.1/
vi Makefile #设置ARCH和CROSS_COMPILE
make menuconfig #默认安装在_install目录下
make -j4
make install
ls _install/ -al
5.2、制作rootfs准备
mkdir rootfs
cp busybox-1.32.1/_install/* rootfs/ -rf
cd rootfs/
mkdir lib
cp /usr/arm-linux-gnueabi/lib/* ./lib/ -rf
mkdir dev
cd dev/
sudo mknod -m 666 tty1 c 4 1
sudo mknod -m 666 tty2 c 4 2
sudo mknod -m 666 tty3 c 4 3
sudo mknod -m 666 tty4 c 4 4
sudo mknod -m 666 console c 5 1
sudo mknod -m 666 null c 1 3
cd ..
mkdir etc tmp sys var proc
mkdir -p mnt/nfs
cd etc
vim inittab #填充数据
vim profile
vim fstab
mkdir init.d
cd init.d
vim rcS
其中inittab文件数据
::sysinit:/etc/init.d/rcS
#::respawn:-/bin/sh
console::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
profile文件数据
PS1='dyh@vexpress:\\w# '
export PS1
fstab文件数据
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
var /dev tmpfs defaults 0 0
ramfs /dev ramfs defaults 0 0
rcS文件数据
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
LD_LIBRARY_PATH=/lib
export PATH LD_LIBRARY_PATH
mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
mdev -s
mkdir -p /var/lock
echo "-----------------------------------"
echo " welcome to A9 vexpress board"
echo "-----------------------------------"
5.3、填充rootfs文件
cd ..
dd if=/dev/zero of=rootfs.ext3 bs=1M count=32
mkfs.ext3 rootfs.ext3
sudo mount -t ext3 rootfs.ext3 /mnt -o loop
ls /mnt
mount
sudo cp rootfs/* /mnt/ -rf
sudo umount /mnt
6、一切准备充分,可以尝试启动。退出:ctrl+A; x
qemu-system-arm -M vexpress-a9 -m 1024M -kernel /home/dyh/project/qemu/tools/linux-4.14.214/arch/arm/boot/zImage -dtb /home/dyh/project/qemu/tools/linux-4.14.214/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd rootfs.ext3
7、安装u-boot。可以正常启动内核,u-boot无关紧要
wget https://ftp.denx.de/pub/u-boot/u-boot-2021.01.tar.bz2
tar -xf u-boot-2021.01.tar.bz2
cd u-boot-2021.01/
vi Makefile #替换ARCH
vi config.mk #替换CROSS-COMPILE
make vexpress_ca9x4_defconfig
make -j4
cd ..
find -name u-boot
qemu-system-arm -M vexpress-a9 -m 512M -nographic -kernel /home/dyh/project/qemu/tools/u-boot-2021.01/u-boot
8、怎么把文件传入arm开发板虚拟环境中呢?安装nfs
8.1、以上安装内核是,nfs功能内核已经默认支持
8.2、安装需要的开发包
#安装nfs服务器
sudo apt-get install nfs-kernel-server
#建立虚拟网络设备uml-utilities 虚拟网桥桥接工具bridge-utils
sudo apt-get install uml-utilities bridge-utils
8.3、打开nfs的server功能
sudo edit /etc/exports #填充数据
sudo /etc/init.d/rpcbind restart #重启nfs服务
sudo /etc/init.d/nfs-kernel-server restart #重启nfs服务
exports文件添加内容
#添加nfs共享目录,其中192.168.33.100是arm开发板的IP地址
/home/dyh/project/qemu/nfs -rw -network 192.168.33.100
8.4、查看打开结果,需要关闭防火墙
#查看nfs server目录共享目录是否创建
showmount -e
#查看防火墙命令
sudo ufw status
sudo ufw enable
sudo ufw disable
8.5、配置网络
sudo edit /etc/network/interfaces #填充数据(ubuntu 20.04之前版本)
sudo edit /etc/netplan/01-network-manager-all.yaml #填充数据(ubuntu 20.04)
sudo edit /etc/qemu-ifup #填充数据
sudo edit /etc/qemu-ifdown
sudo chmod 777 /etc/qemu* #修改权限
interfaces文件添加内容
auto br0 #创建网桥
iface br0 inet dhcp #配置br0网桥为dhcp模式
bridge_ports eth0 #网桥br0建立在eth0上
01-network-manager-all.yaml文件添加内容。创建tap0,挂网桥br0
network:
version: 2
renderer: NetworkManager
ethernets:
eth0:
dhcp4: yes
tap0:
dhcp4: no
bridges:
br0:
dhcp4: no
interfaces:
- tap0
qemu-ifup文件内容
#!/bin/sh
echo sudo tunctl -u $(id -un) -t $1 #sudo tunctl -u dyh -t tap0
sudo tunctl -u $(id -un) -t $1 #创建虚拟网卡
echo sudo ifconfig $1 0.0.0.0 promisc up #sudo ifconfig tap0 0.0.0.0 promisc up
sudo ifconfig $1 0.0.0.0 promisc up #把tap0设置成混杂模式
echo sudo brctl addif br0 $1 #sudo brctl addif br0 tap0
sudo brctl addif br0 $1 #让br0成为tap0的端口
echo brctl show
brctl show #查看网桥情况
#其中192.168.33.135是PC端的IP地址
sudo ifconfig br0 192.168.33.135
qemu-ifdown文件内容
#!/bin/sh
echo sudo brctl delif br0 $1 #sudo brctl delif br0 tap0
sudo brctl delif br0 $1 #删除网桥关系
echo sudo tunctl -d $1 #sudo tunctl -d tap0
sudo tunctl -d $1 #删除虚拟网卡eth1
echo brctl show
brctl show
9、最终启动ARM开发板,制作个shell脚本
#! /bin/sh
qemu-system-arm \\
-M vexpress-a9 -m 1024M \\
-device virtio-net-device,netdev=tap0 \\
-netdev tap,id=tap0,ifname=tap0 \\
-kernel /home/dyh/project/qemu/tools/linux-4.14.214/arch/arm/boot/zImage \\
-dtb /home/dyh/project/qemu/tools/linux-4.14.214/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \\
-nographic \\
-append "root=/dev/mmcblk0 rw console=ttyAMA0" \\
-sd /home/dyh/project/qemu/tools/rootfs.ext3
10、挂载nfs,提高开发效率。此时PC目录/home/dyh/project/qemu/nfs和开发板/mnt/nfs目录相通
mount -t nfs -o intr,nolock,rsize=1024,wsize=1024 192.168.33.135:/home/dyh/project/qemu/nfs /mnt/nfs
11、测试小程序
GitHub - dyh-git/kernel_ko: 内核的ko驱动
第五章
开发板是开发和学习嵌入式技术的主要硬件技术,尽管可以在PC上开发驱动Linux驱动,然后重新编译成ARM架构的Linux驱动模块。但最终都是要在开发板上进行测试的。这主要是因为ARM架构的开发板课基于X86架构的PC和CPU指令以及二进制格式上都有所不同。而且如果Linux驱动需要访问硬件。而且这些硬件很难再PC上进行模拟,那么就要在带有这些硬件的开发板上进行调试和测试。
、烧写Android系统的步骤:
1 用串口线或USB转串口线连接开发板和PC,并启动minicom。
2进入Eboot状态。
3擦除NandFLash。
4开始从SD卡烧写ANdroid
5校准屏幕
开发板与其他设备连接的常用方式包括串口线,USB数据线,蓝牙,WiFi和网线。串口线和USB数据线直接插在PC的相应接口上就可直接可以连通,蓝牙和Wi-Fi需要相应的配件才能使用。
在烧写Android之前,务必启动Eboot擦除NandFlash。这是因为微软在设计WinCE时有一个约定,就是把前面4个模块都标记成了坏块,也就是说,吧biitloader分区都标记成坏块,以防止bootloader被WinCE应用程序擦掉。这就是需要将开发板换成Android系统的时候,需要把这几个“假坏块”恢复过来。
以上是关于x86的PC机上运行ARM架构开发板的主要内容,如果未能解决你的问题,请参考以下文章