Ubuntu22.04 中搭建基于 Qemu 的内核(驱动)开发环境

1. 用源码安装 Qemu

编译过程特别耗时,建议用使用在线安装

bash 复制代码
# 设置软件源镜像
$ 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

bash 复制代码
# 建立目录存放交叉编译工具
$ 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。

bash 复制代码
# 解压源码并进入源码目录
$ 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://busybox.net/downloads/,选择下载 busybox-1.32.0.tar.bz2。

bash 复制代码
# 解压并进入源码目录
$ 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卡启动系统

bash 复制代码
# 首先进入工作目录依次执行下列命令:
$ 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

# 在rootfs下创建必要的设备结点
$ 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

# 回到rootfs同一级目录,制作SD卡系统镜像
$ 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. 参考文献

10分钟用QEMU搭建嵌入式开发环境学习Linux

Ubuntu2204安装qemu

使用qemu搭建arm嵌入式linux开发环境

相关推荐
运维行者_2 分钟前
不同规模企业如何选 OPM?参考局域网管理软件与 cpu 温度监控适配指南
大数据·运维·服务器·网络·数据库·postgresql·snmp
冰冰菜的扣jio8 分钟前
MySQL高性能优化合集
数据库·mysql
weixin_404679319 分钟前
vscode 配置cpp调试环境
数据库·ide·vscode·编辑器
TG:@yunlaoda360 云老大11 分钟前
华为云国际站代理商GaussDB主要有什么作用呢?
服务器·数据库·华为云·gaussdb
ohoy15 分钟前
业务数据聚合分析 xxl-job定时任务
数据库·oracle
数据皮皮侠AI27 分钟前
数字经济政策工具变量数据(2008-2023)
大数据·数据库·人工智能·笔记·1024程序员节
赫尔·普莱蒂科萨·帕塔29 分钟前
从 “脑梗“ 到 “功夫高手“
数据库·人工智能·agi
IvanCodes39 分钟前
openGauss 存储核心机制:从表空间到数据块
数据库·sql·oracle·opengauss
Francek Chen39 分钟前
【IoTDB】时序数据库选型指南:国产自研技术如何应对数据洪流
大数据·数据库·时序数据库·iotdb
白露与泡影41 分钟前
春招 Java 面试大纲:Java+ 并发 +spring+ 数据库 +Redis+JVM+Netty 等
java·数据库·面试