使用Qemu模拟arm开发板

10 篇文章 0 订阅
本文详细介绍了如何在Ubuntu18环境下使用QEMU模拟ARM开发板的过程,包括安装QEMU和交叉编译链,编译Linux内核和BusyBox,创建根文件系统镜像,并最终启动虚拟机。在编译过程中,强调了指定交叉编译器前缀的方法以及启动QEMU的命令行参数。
摘要由CSDN通过智能技术生成

使用Qemu模拟arm开发板

环境:ubuntu18

1.安装qemu

sudo apt-get install zlib1g-dev  libglib2.0-0  libglib2.0-dev qemu

安装完后在shell输入 qemu 按tab键如果出现自动补齐就证明成功安装

2.安装交叉编译链环境

sudo apt-get install gcc-arm-linux-gnueabi 

验证安装

dpkg -l gcc-arm-linux-gnueabi 

可以看到安装结果为

user@ubuntu18:~/Documents$ dpkg -l gcc-arm-linux-gnueabi
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                         Version             Architecture        Description
+++-============================-===================-===================-==============================================================
ii  gcc-arm-linux-gnueabi        4:7.4.0-1ubuntu2.3  amd64               GNU C compiler for the armel architecture

使用which来查看安装路径

user@ubuntu18:~/Documents$ which arm-linux-gnueabi-gcc
/usr/bin/arm-linux-gnueabi-gcc

对象的库的路径一般为/usr/arm-linux-gnueabi/lib/

3.编译linux busybox 镜像

3.1

编译linux

  make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig
  #make distclean
  #make menuconfig 
  #make zImage   -j8
  #make   dtbs -j8
  make all -j8

可以在看arch/arm/boot/zImage是否存在,如果不存在则说明编译出错。在个人编译的过程中发现通过命令行指定交叉编译器前缀好像不管用,可以尝试直接修改Makefile来指定编译前缀。如下

#ARCH		?= $(SUBARCH)
ARCH	= arm
#CROSS_COMPILE	?= $(CONFIG_CROSS_COMPILE:"%"=%)
CROSS_COMPILE	= arm-linux-gnueabi-

上面注释的是原有的。

3.2 编译busybox

下载busybox

https://busybox.net/downloads/

下载的文件如果是以tar.bz2结尾的,使用tar xjvf 来解压。

解压busybox之后,输入以下命令来编译busybox

make defconfig
make CROSS_COMPILE=arm-linux-gnueabi-   -j8
make install CROSS_COMPILE=arm-linux-gnueabi-   -j8

编译后的文件在_install目录下,如下:

user@ubuntu18:~/Documents/busybox-1.35.0$ ls _install/
bin  lib  linuxrc  sbin  usr

可以看到有一些根文件系统必须的目录。

3.3 再新建脚本来制作镜像(切换到busybox的上级目录)

mkdir -p rootfs/{dev,etc/init.d,lib}
touch rootfs/etc/init.d/rcS
echo -e "#!/bin/sh\n" > rootfs/etc/init.d/rcS

cp busybox-1.35.0/_install/* -r rootfs/
sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/ 
sudo mknod rootfs/dev/tty1 c 4 1

sudo mknod rootfs/dev/tty2 c 4 2

sudo mknod rootfs/dev/tty3 c 4 3

sudo mknod rootfs/dev/tty4 c 4 4

sudo chown root:root -R rootfs/*
sudo  chmod  777 rootfs/etc/init.d/rcS
qemu-img create -f raw disk.img 512M 
mkfs -t ext4 ./disk.img 
mkdir  -p   tmpfs 
sudo mount -o loop ./disk.img tmpfs/  
sudo cp -r rootfs/* tmpfs/
sudo umount tmpfs 
file disk.img

运行上述命令之后,可以得到一个file.img的文件,这就是镜像

3.4 启动虚拟的arm 开发板

使用一下命令来启动虚拟机

sudo  chmod 777 disk.img
qemu-system-arm -M vexpress-a9 -m 512M -kernel /home/user/Documents/linux_old1/arch/arm/boot/zImage -dtb  /home/user/Documents/linux_old1/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0  console=ttyAMA0" -sd disk.img

上面的命令很长,可以新建一个shell脚本来运行。其中

-kernel 指定内核文件路径,-dtb 指定设备树的路径 ,-sd就是镜像了。

最后运行一下上面的命令,最后的结果如下,

input: ImExPS/2 Generic Explorer Mouse as /devices/platform/smb/smb:motherboard/smb:motherboard:iofpga@7,00000000/10007000.kmi/serio1/input/input2
EXT2-fs (mmcblk0): error: couldn't mount because of unsupported optional features (2c0)
EXT4-fs (mmcblk0): couldn't mount as ext3 due to feature incompatibilities
EXT4-fs (mmcblk0): mounted filesystem with ordered data mode. Opts: (null)
VFS: Mounted root (ext4 filesystem) readonly on device 179:0.
Freeing unused kernel memory: 280K (80614000 - 8065a000)
random: nonblocking pool is initialized

Please press Enter to activate this console.

此时按Enter就可以运行模拟arm开发板的shell了。

上面整个过程的命令如下:

#!/bin/bash
kernel_path=linux_old1
busybox_path=busybox-1.35.0
img_filename=disk.img
curDir=`pwd`
echo ${curDir}
isBuildKernel=0
isBuildBusybox=0
while getopts "kb" OPTNAME
do
  case "${OPTNAME}" in
    "k")
        isBuildKernel=1
        ;;
    "b")
        isBuildBusybox=1
        ;;
    "?")
      echo "UnKnown Option ${OPTARG}"
      exit 1
      ;;
    "*")
      echo "UnKnow error while processing options"
      exit 1
      ;;
  esac
echo "OPTIND is now ${OPTIND}"
done


function build_kernel(){

    make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig
    #make distclean
    #make menuconfig 
    #make zImage   -j8
    #make   dtbs -j8
    make all -j8
}

function build_busybox(){
    make defconfig
    make menuconfig
    make CROSS_COMPILE=arm-linux-gnueabi-   -j8
    make install CROSS_COMPILE=arm-linux-gnueabi-   -j8
}
function build_resolv_conf(){
    touch ${curDir}/rootfs/etc/resolv.conf
    echo -e "nameserver 114.114.114.114 \nnameserver 192.168.1.1" > ${curDir}/rootfs/etc/resolv.conf
}
function build_rcS(){
    touch rootfs/etc/init.d/rcS
    echo -e "#!/bin/sh\n" > rootfs/etc/init.d/rcS
    echo -e "PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH\n"  >> rootfs/etc/init.d/rcS
    echo -e "LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib\n"  >> rootfs/etc/init.d/rcS
    echo -e "export PATH LD_LIBRARY_PATH\n"   >> rootfs/etc/init.d/rcS
    echo -e "mount -a\n"  >> rootfs/etc/init.d/rcS
    echo -e "mkdir /dev/pts\n"  >> rootfs/etc/init.d/rcS
    echo -e "mount -t devpts devpts /dev/pts\n"  >> rootfs/etc/init.d/rcS
    echo -e "echo /sbin/mdev > /proc/sys/kernel/hotplug\n"  >> rootfs/etc/init.d/rcS
    echo -e "mdev -s\n"  >> rootfs/etc/init.d/rcS
}
function build_fstab(){
    file=${curDir}/rootfs/etc/fstab
    touch ${file}
    echo -e "#<file system> <mount point> <type> <options> <dump> <pass>" > ${file}
    echo -e "proc /proc proc defaults 0 0"  >> $file
    echo -e  "tmpfs /tmp tmpfs defaults 0 0" >> $file
    echo -e "ysfs /sys sysfs defaults 0 0" >> $file

}
function build_inittab(){
    file=${curDir}/rootfs/etc/inittab
    touch ${file}
    echo -e "#etc/inittab"  >> $file
    echo -e     "::sysinit:/etc/init.d/rcS">> $file
    echo -e     "console::askfirst:-/bin/sh">> $file
    echo -e  "::restart:/sbin/init">> $file
    echo -e  "::ctrlaltdel:/sbin/reboot">> $file
    echo -e  "::shutdown:/bin/umount -a -r">> $file
    echo -e     "::shutdown:/sbin/swapoff -a"  >> $file
}
function build_img(){
    mkdir -p rootfs/{dev,etc/init.d,lib}
    cd rootfs
    mkdir -p dev  etc  mnt  proc  var  tmp  sys  root home
    cd ..
    build_rcS
    build_resolv_conf
    build_fstab
    #build_inittab
    cp busybox-1.35.0/_install/* -r rootfs/
    sudo cp -P /usr/arm-linux-gnueabi/lib/* rootfs/lib/ 
    sudo mknod rootfs/dev/tty1 c 4 1

    sudo mknod rootfs/dev/tty2 c 4 2

    sudo mknod rootfs/dev/tty3 c 4 3

    sudo mknod rootfs/dev/tty4 c 4 4

    sudo chown root:root -R rootfs/*
    sudo  chmod  777 rootfs/etc/init.d/rcS
    qemu-img create -f raw ${img_filename} 512M 
    mkfs -t ext4 ./${img_filename}
    mkdir  -p   tmpfs 
    sudo mount -o loop ./${img_filename} tmpfs/  
    sudo cp -r rootfs/* tmpfs/
    sudo umount tmpfs 
    file ${img_filename}
}
if [ ${isBuildKernel} == 1 ] ;then
    cd ${kernel_path}
    build_kernel
    cd ..
fi
if [ ${isBuildBusybox} == 1 ] ;then
    cd ${busybox_path}
    build_busybox
    cd ..
fi
sudo  rm -rf rootfs/* 
build_img
sudo  chmod 777 ${img_filename}
  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值