Ubuntu22.04 中搭建基于 Qemu 的内核(驱动)开发环境
1. 用源码安装 Qemu
编译过程特别耗时,建议用使用在线安装
# 设置软件源镜像
$ sudo sed -i'.bak' 's,/[a-z]*.ubuntu.com,/mirrors.tuna.tsinghua.edu.cn,' /etc/apt/sources.list
# 安装依赖库
$ sudo apt-get install ninja-build
$ sudo apt-get install zlib1g zlib1g-dev
$ sudo apt-get install libglib2.0-dev
$ sudo apt-get install libpixman-1-dev
# 下载源码
$ wget https://download.qemu.org/qemu-7.2.0.tar.xz
$ tar xvJf qemu-7.2.0.tar.xz
$ cd qemu-7.2.0
# 配置
$ ./configure
# 编译
$ make
# 安装
$ sudo make install
# 验证
$ qemu-system-arm --version
QEMU emulator version 7.2.0
Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers
2. 配置交叉编译工具链
点击该链接 跳转下载交叉编译工具压缩包:gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
# 建立目录存放交叉编译工具
$ sudo mkdir /usr/local/arm# 将下载的交叉编译工具压缩包移动到刚才目录并解压
$ mv gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz /usr/local/arm/
$ sudo tar -vxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz# 打开 /etc/profile,在文件最后添加环境变量
export PATH=$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin
$sudo vi /etc/profile# 安装依赖
$ sudo apt-get install lsb-core lib32stdc++6# 验证
$ arm-linux-gnueabihf-gcc -v
Thread model: posix
gcc version 4.9.4 (Linaro GCC 4.9-2017.01)
3. 编译内核源码
内核源码下载地址是 https://www.kernel.org/pub/ ,选择下载 linux-4.4.232.tar.xz。
# 解压源码并进入源码目录
$ tar -vxf linux-4.4.232.tar.xz
$ cd linux-4.4.232# 安装依赖要不然编译会报错
$ sudo apt-get install lzop# 开始编译
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- clean
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules -j2
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- dtbs -j2
4. 编译 busybox
busybox 下载地址是 https://www.kernel.org/pub/ ,选择下载 busybox-1.32.0.tar.bz2。
# 解压并进入源码目录
$ tar -jxvf busybox-1.32.0.tar.bz2
$ cd busybox-1.32.0# 配置
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- defconfig# 使用图形化配置, 进入Settings选项,找到Build Options,
# 点y键将选项 Build static binary(编译成静态)选中,保存退出。
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j2
$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- install
5. 制作虚拟SD卡启动镜像
这里采用 从 Qemu 模拟的SD卡启动系统
# 首先进入工作目录一次执行下列命令:
$ mkdir rootfs
$ cd rootfs/
$ cp -ra ../busybox-1.32.0/_install/* .
$ mkdir lib
$ cp -ra /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/lib/* ./lib# 创建必要的设备结点
$ mkdir dev
$ cd dev/
$ sudo mknod -m 666 tty5 c 4 5
$ sudo mknod -m 666 tty3 c 4 3
$ sudo mknod -m 666 tty4 c 4 4
$ sudo mknod -m 666 tty2 c 4 2
$ sudo mknod -m 666 tty1 c 4 1
$ sudo mknod -m 666 console c 5 1
$ sudo mknod -m 666 null c 1 3# 回到上一级目录并制作虚拟系统镜像文件
$ 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
$ sudo cp -ra rootfs/* /mnt/
$ sudo umount /mnt/ # 进入 linux 内核源码目录并启动系统(qemu 模拟的开发板),如下图所示结果
$ cd linux-4.4.232
$ qemu-system-arm -M mcimx6ul-evk -m 512M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/imx6ul-14x14-evk.dtb -nographic -append "root=/dev/mmcblk0 rw console=ttymxc0" -sd /home/yao/Desktop/rootfs.ext3也可以是其他架构开发版,注意和内核运行的是同一硬件平台
# qemu-system-arm -M vexpress-a9 -m 512M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd ../rootfs.ext3
6. 参考文献
1. 10分钟用QEMU搭建嵌入式开发环境学习Linux
2. Ubuntu2204安装qemu
3. 使用qemu搭建arm嵌入式linux开发环境