调试环境基于韦东山系列开发板IMX6ull虚拟环境搭建,韦东山给了详细的教程Qemu - 百问网嵌入式Linux wiki 。本篇文章主要是研究linux-4.9.88内核的基本架构,所以不对开发相关驱动进行太多的研究,所以整理出来的也是内核从编译到开发基本路径。环境基于Ubuntu18.04系统,可以通过VMware+Ubuntu的形式搭建环境,也可以直接使用独立的服务器Ubuntu进行。
请在ubuntu终端下执行如下命令,直接在线克隆整个仓库
git clone https://e.coding.net/weidongshan/ubuntu-16.04_imx6ul_qemu_system.git
fatal: Out of memory, malloc failed (tried to allocate 314572801 bytes)
fatal: index-pack failed
先执行下列命令增加swap分区
sudo dd if=/dev/zero of=/root/myswapfile bs=1M count=1024
sudo chmod 600 /root/myswapfile
sudo mkswap /root/myswapfile
sudo swapon /root/myswapfile
然后修改/etc/fstab,增加如下一行
/root/myswapfile swap swap defaults 0 0
最后重新执行上面的GIT命令进行下载,下载结束以后下载包镜像目录结构说明如下,在后续的开发过程中,我们有可能更换红框中的文件:
假设你已经按照上文下载、解压好了QEMU镜像文件,你需要进入QEMU的目录,执行下列命令。
首次运行需要安装SDL环境
使用脚本自动解压安装:
$./install_sdl.sh // 提示输入用户密码,等待安装完成
如果出现报错 Package xxxx is not installed.,可使用apt命令修复:
$sudo apt --fix-broken install
运行带GUI的imx6ul模拟器,模拟百问网imx6ull-qemu开发板
$./qemu-imx6ull-gui.sh // 启动后,登录名是root,无需密码
如上命令可能出现ERROR: Could not initialize SDL video.问题,目前没有查看具体解决原因,在进行linux内核调试中不需要使用中断界面的形式,而是命令行输出的形式。
在目录中修改 qemu-imx6ull-nogui.sh 脚本添加-s -S使得GDB启动本地127IP调试端口1234,这样可以在另外一个串口中进行内核内容加载与调试。然后运行这个脚本就会启动调试终端并卡在了如下命令,这个时候需要在另外一个终端通过gdb挂在本终端上面进行内核文件的调试。下面就下一个打的流程,将我们要调试的linux内核文件编译出来。
book@100ask:~/ubuntu-18.04_imx6ul_qemu_system$ ./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
sudo apt-get update
sudo apt-get install qemu qemu-kvm libvirt-bin bridge-utils virt-manager
注:可以起到加速的效果
2.2.获取百问网imx6ull-qemu开发镜像
git clone https://e.coding.net/weidongshan/ubuntu-16.04_imx6ul_qemu_system.git
git clone https://e.coding.net/weidongshan/ubuntu-18.04_imx6ul_qemu_system.git
注:对应不同的ubuntu系统
2.3.运行百问网imx6ull-qemu开发镜像
./install_sdl.sh
./qemu-imx6ull-gui.sh
2. 4.获取百问网imx6ull-qemu开发板内核源码和工具链
book\@100ask:\~\$ git clone https://e.coding.net/codebug8/repo.git
book\@100ask:\~\$ mkdir -p 100ask_imx6ull-qemu && cd 100ask_imx6ull-qemu
book\@100ask:\~/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
book\@100ask:\~/100ask_imx6ull-qemu\$ ../repo/repo sync -j4
2.5.下载百问网快速入门资料
git clone https://e.coding.net/weidongshan/01_all_series_quickstart.git
2.6.设置环境变量
环境变量生效方式有永久、临时和当前终端这么三种方式,分别配置方式如下:
永久生效
book\@100ask:\~\$ vi ~/.bashrc
在行尾添加或修改:
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/home/book/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
使环境变量生效:
source ~/.bashrc
临时生效
如果你有很多单板,为了不冲突,你不能使用“永久生效”的办法。比如你有32位的ARM板,也有64位的ARM板,在使用前者时需要设置ARCH=arm,在使用后者时需要设置ARCH=arm64。
这种情况下,可以使用“export”命令设置环境变量,这种设置方法只对当前终端有效:
book\@100ask:\~\$ export PATH=$PATH:/home/book/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
book\@100ask:\~\$ export ARCH=arm
book\@100ask:\~\$ export CROSS_COMPILE=arm-linux-gnueabihf-
手动指定
执行make命令时,可以手工指定ARCH架构、CROSS_COMPILE等变量:
book\@100ask:\~\$ export PATH=$PATH:/home/book/100ask_imx6ull-qemu/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
book\@100ask:\~\$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
2.7.为了后续编译驱动,需要先编译内核
book\@100ask:\~/100ask_imx6ull-qemu\$ cd linux-4.9.88
book\@100ask:\~/100ask_imx6ull-qemu/linux-4.9.88\$ make mrproper
book\@100ask:\~/100ask_imx6ull-qemu/linux-4.9.88\$ make 100ask_imx6ull_qemu_defconfig
book\@100ask:\~/100ask_imx6ull-qemu/linux-4.9.88\$ make zImage -jN //编译zImage内核镜像,其中N参数可以根据CPU个数,来加速编译系统。
book\@100ask:\~/100ask_imx6ull-qemu/linux-4.9.88\$ make dtbs //编译设备树文件
内核编译过程中我们是要对内核进行调试的,所有需要对内核进行调试开关打开的修改,具体是打开调试开关的vmlinux输出文件大小在150M左右,没有打开大概再30M左右。
1.配置内核
Kernel hacking --->
Compile-time checks and compiler options --->
[*] Compile the kernel with debug info
[*] Provide GDB scripts for kernel debugging
[*] Kernel debugging
配置完重新编译内核。当然韦东山给的已经是打开这个开关的版本。具体可以通过便已结束以后的
注:为了后续编译驱动,需要先编译内核
2.8.编译驱动
测试驱动为此目录下的led驱动,可以稍作修改,然后编译
01_all_series_quickstart/05_嵌入式Linux驱动开发基础知识/source/02_led_drv/02_led_drv_for_boards/100ask_imx6ull-qemu_src_bin
9.上传驱动以及应用程序
ubuntu主机启动nfs
sudo apt-get install nfs-kernel-server
修改/etc/exports,添加类似以下的内容,
/home/book *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
/work *(rw,nohide,insecure,no_subtree_check,async,no_root_squash)
注:以上的例子里允许开发板通过NFS访问Ubuntu的/home/book、/work两个目录
ubuntu主机 重启nfs
sudo /etc/init.d/nfs-kernel-server restart
ubuntu主机 测试nfs
可以在Ubuntu上通过NFS挂载自己,验证一下NFS可用:
sudo mount -t nfs -o nolock,vers=3 127.0.0.1:/home/book /mnt
ls /mnt
开发板配置网络
QEMU运行时,Ubuntu是Host即宿主机,QEMU给它分配的IP是10.0.2.2。
QEMU模拟的imx6ull板子是Guest即客户机,它会自动获取IP,也可以自己设置。
Guest可以通过10.0.2.2访问Host,Host不能访问Guest。
Guest中可以使用ifconfig命令查看IP,如果没有IP,可以如下设置:
[root@qemu_imx6ul:~]# ifconfig eth0 10.0.2.15
开发板挂载主机nfs目录
QEMU模拟的imx6ull开发板,可以去访问10.0.2.2,比如使用NFS挂载:
[root@qemu_imx6ul:~]# mount -t nfs -o nolock,vers=3 10.0.2.2:/home/book/nfs_rootfs /mnt
如果一切正常,在开发板上就可以通过/mnt目录访问Ubuntu的/home/book/nfs_rootfs目录了。
10.更换文件系统
如果你修改过内核,或是修改过设备树文件。
那么可以用上面2个文件去替换QEMU中的zImage和100ask_imx6ull_qemu.dtb。
QEMU中的zImage和100ask_imx6ull_qemu.dtb,通过打开qemu-imx6ull-gui.sh就可以知道这2个文件的位置,一般是位于imx6ull-system-image目录
安装好百问网提供的QEMU后,你可以得到一个imx6ull-system-image目录,里面有名为rootfs.img的文件,它就是根文件系统:
你可以在Ubuntu下直接修改rootfs.img,不过要先挂载,执行以下命令:
sudo mount -o loop rootfs.img /mnt
你就可以在/mnt目录下对其中的文件进行操作了,也可以把Ubuntu中的文件复制进去。
注意:修改完毕后,要执行以下命令:
sudo umount /mnt
在一个中断中启动调试 ./qemu-imx6ull-nogui.sh 接口,然后再另外一个终端中启动需要调试的程序,这个中断具体启动界面见下图:
arm-linux-gnueabihf-gdb vmlinux
target remote 127.0.0.1:1234
b start_kernel
c
启动以后会发现在当前调试中断进行函数和整个代码流程打断点等内容调试,在原来那个中断中会有内核内部许多打印函数的输出信息打印出来。两个中断配合完成linux-4.9学习。