日常记录,根据韦东山资源配置qemu,搭建imx6ull仿真环境, 可适当修改调试X86平台内核
1. 数据资源获取
http://wiki.100ask.org/Qemu
git clone https://e.coding.net/codebug8/repo.git
mkdir -p 100ask_imx6ull-qemu && cd 100ask_imx6ull-qemu
../repo/repo init -u https://e.coding.net/weidongshan/manifests.git -b linux-sdk -m imx6ull/100ask-imx6ull_qemu_release_v1.0.xml --no-repo-verify
../repo/repo sync -j4
2.内核编译脚本
#!/bin/sh
# 清除安装残余文件
# make ARCH=arm CROSS_COMPILE=/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- 100ask_imx6ull_qemu_defconfig
# 图形化配置
make ARCH=arm CROSS_COMPILE=/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- menuconfig
# 编译所有,包括设备树,驱动,内核镜像
make ARCH=arm CROSS_COMPILE=/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf- all -j2
3.QEMU 启动 imu6ull 脚本
#!/bin/bash
workdir=$(dirname $0);
$workdir/qemu/bin/qemu-system-arm -M mcimx6ul-evk -m 512M -kernel $workdir/imx6ull-system-image/zImage \
-dtb $workdir/imx6ull-system-image/100ask_imx6ull_qemu.dtb \
-nographic -serial mon:stdio \
-drive file=$workdir/imx6ull-system-image/rootfs.img,format=raw,id=mysdcard -device sd-card,drive=mysdcard \
-append "console=ttymxc0,115200 rootfstype=ext4 root=/dev/mmcblk1 rw rootwait init=/sbin/init loglevel=8" \
-nic user \
-S -s
# -M mcimx6ul-evk : 选择芯片板子,百问网自制,若调试X86平台,无需此项
# -m 512M : guest虚拟机预留的内存大小,如果不指定,默认大小是128M
# -kernel $workdir/imx6ull-system-image/zImage :内核镜像文件地址
# -dtb $workdir/imx6ull-system-image/100ask_imx6ull_qemu.dtb : 设备树地址
# -nographic :启动的是非图形界面的
# -serial mon:stdio : 信号捕获使用,意味^C将传给guest使用。
# -drive file=$workdir/imx6ull-system-image/rootfs.img,format=raw,id=mysdcard : 添加驱动
# -device sd-card,drive=mysdcard
# -append "cmdline" :使用“cmdline"作为内核命令行
# -nic user : 设置客户机所在子网,缺省值是10.0.2.0/24。
# -S : QEMU虚拟机会冻结CPU,直到远程的GDB输入相应控制命令。
# -s : 表示在1234端口接受GDB的调试连接.
4. GDB调试内核启动
# QEMU 启动 imu6ull
>> ./qemu-imx6ull-nogui.sh
qemu-system-arm: warning: nic imx.enet.0 has no peer
qemu-system-arm: warning: nic imx.enet.1 has no peer
# 等待GDB调试
# 另建终端,进入linux内核根目录,编译后会存在vmlinux文件
>> arm-linux-gnueabihf-gdb
# 载入vmlinxu文件
(gdb) file vmlinux
Reading symbols from vmlinux...done.
# 连接远程端口1234
(gdb) target remote localhost:1234
Remote debugging using localhost:1234
0x80000000 in ?? ()
# 内核启动函数断点
(gdb) b start_kernel
Breakpoint 1 at 0x80e008dc: file init/main.c, line 486.
# 运行至断点
(gdb) c
# qemu终端显示linux内核打印信息
5.配置NFS服务, qemu运行arm架构程序
5.1 主机安装NFS环境
sudo apt-get install nfs-kernel-server
5.2 修改/etc/exports,文件末尾添加数据共享文件夹
/demo_absolute_path *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
# 共享文件绝对地址 *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
5.3 重启NFS服务器
sudo /etc/init.d/nfs-kernel-server restart
5.4 主机挂载nfs
sudo mount -t nfs -o nolock,vers=3 127.0.0.1:/demo_mount_path /mnt
ls /mnt
5.5 从机挂载主机nfs目录
QEMU运行时,Ubuntu是Host即宿主机,QEMU给它分配的IP是10.0.2.2。
QEMU模拟的imx6ull板子是Guest即客户机,它会自动获取IP,也可以自己设置。
Guest可以通过10.0.2.2访问Host,Host不能访问Guest。
mount -t nfs -o nolock,vers=3 10.0.2.2:/demo_mount_path /mnt
主机交叉编译文件,放置在/demo_mount_path
目录内, 从机在/mnt
内运行测试。