使用Qemu模拟arm开发板
使用Qemu模拟arm开发板环境:ubuntu181.安装qemusudo apt-get install zlib1g-devlibglib2.0-0libglib2.0-dev qemu安装完后在shell输入 qemu 按tab键如果出现自动补齐就证明成功安装2.安装交叉编译链环境sudo apt-get install gcc-arm-linux-gnueabi验证安装dpkg -l gc
使用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}
更多推荐
所有评论(0)