qemu 嵌入式linux 开发环境搭建
主要记录大致步骤.
qemu 安装
https://www.qemu.org/download/
wget https://download.qemu.org/qemu-9.2.1.tar.xz
tar --xz --get --file qemu-9.2.1.tar.xz
cd qemu-9.2.1
./configure
make -j$(nproc) # $(nproc) 获取cpu核心数
sudo make install
qemu-system-arm -M help # 查看支持的板子
交叉编译工具链安装
sudo apt-get install gcc-arm-linux-gnueabi
怎么选择交叉编译工具链: https://www.cnblogs.com/wxishang1991/p/5322499.html
u-boot 移植
git clone git://git.denx.de/u-boot.git
ls configs/ | grep vexpress
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- vexpress_ca9x4_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j$(nproc)
linux 内核移植
清理编译和配置文件
make mrproper
#下载解压内核源码
#通常来说内核源码分别可以从官方,芯片厂商,开发板厂商处获取.
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.13.1.tar.xz
tar --get --file linux-6.13.1.tar.xz
# 生成默认.config文件, 把默认配置文件复制到kernel顶层目录
# 我使用的是vexperss-a9开发板,直接找找有没有想关配置文件
ls arch/arm/configs/ | grep vexpress
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- vexpress_defconfig
#配置内核,通过menuconfig修改.config文件
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig
#编译内核
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j $(nproc)
#仿真
#仿真还需要设备树文件, Linux kernel 里有一些默认的设备树文件
ls arch/arm/boot/dts/arm | grep vexpress
qemu-system-arm -M vexpress-a9 -m 512M \
-kernel arch/arm/boot/zImage \
-dtb arch/arm/boot/dts/arm/vexpress-v2p-ca9.dtb \
-append "console=ttyAMA0" \
-nographic
#此时内核可以运行一段但会因为没有文件系统停下来.
# Unable to mount root fs on unknown-block(0,0)
不知道为什么 make menuconfig 后.config变成了x86 编译器字段也变成了gcc而不是交叉编译工具.
因为开始make后面没有带环境变量所以相当于是修改了.正常是读取顶层.config的
linux内核的配置选项很多, 通常都是基于默认或硬件厂商提供的配置文件, 然后根据需求进行修改.
编译过程中可能会因为有些依赖没有安装而报错, 根据提示安装缺少的依赖即可.
使用busybox制作根文件系统
https://www.cnblogs.com/challa/p/15291249.html#%E6%A0%B9%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E6%98%AF%E4%BB%80%E4%B9%88
- 下载安装busybox
git clone git://busybox.net/busybox.git
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- defconfig
#选择静态编译// 有其他的需求在这一步进行配置,可以参考上面的链接
make menuconfig
# 勾选 Busybox Setting-> Build Options-> [*] Build static binary (no shared libs)
make -j$(nproc)
- 制作根文件系统
目录 | 说明 | 补充 |
---|---|---|
linuxrc | 第一个执行的用户程序, 提供操作界面 | 必须存在, busybox生成 |
bin | 所有用户都可以使用的、基本的命令 | 必须存在, busybox创建并集成一些命令 |
sbin | 基本的系统命令 | 必须存在, busybox创建并集成一些命令 |
usr | 用户目录 | 可以删除, busybox创建并集成一些命令 |
etc | 存放配置文件, 被 /linuxrc 所调用执行 | 必须存在 |
lib | 存放的是当前操作系统中的动态和静态链接库文件 | 必须存在 |
dev | 设备文件 | 必须存在 |
sys | 虚拟文件系统, 不可省略, 但是只要创建了空文件夹即可 | 必须存在 |
proc | 虚拟文件系统, 不可省略, 但是只要创建了空文件夹即可 | 必须存在 |
mnt | 用来挂载 | 可以删除 |
- 创建根文件系统目录
#!/bin/sh
echo "Create rootfs directons"
# 创建文件系统目录
mkdir -p rootfs/{bin,sbin,usr,dev,etc,lib,proc,sys,mnt}
# 复制busybox生成的文件
echo "Copy busybox{bin,linuxrc,sbin,usr}"
cp busybox-*/_install/* rootfs/bin/ -arf #保留符号链接因为busybox生成的命令都是符号链接到busybox.bin
# 创建etc/inittab文件, 这个文件在启动时被linuxrc调用
echo "Create etc/inittab"
cat <<EOL > rootfs/etc/inittab
#/etc/inittab # 井号是注释
::sysinit:/etc/init.d/rcS # 系统启动以后运行 /etc/init.d/rcS 这个脚本文件
console::askfirst:-/bin/sh # 将 console 作为控制台终端,也就是 ttymxc0。
::restart:/sbin/init # 重启的话运行/sbin/init。
::ctrlaltdel:-/sbin/reboot # 按下 ctrl+alt+del 组合键的话就运行 /sbin/reboot(重启系统)
::shutdown:/bin/umount -a -r # 关机的时候执行 /bin/umount,也就是卸载各个文件系统
::shutdown:/sbin/swapoff -a # 关机的时候执行 /sbin/swapoff,也就是关闭交换分区。
EOL
# 创建/etc/init.d/rcS文件
echo "Create etc/init.d/rcS"
cat <<EOL > rootfs/etc/init.d/rcS
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH # 导出上面这些环境变量
mount -a # 挂载所有的文件系统,需存在/etc/fstab 文件
EOL
# 复制动态库文件
echo "Add dynamic library"
#直接复制交叉编译工具lib目录下的动态库
cp /usr/arm-linux-gnueabi/lib/*.so* rootfs/lib/ -arf
arm-linux-gnueabi-strip rootfs/lib/*.so* #去除动态库的调试信息
# 创建设备节点
echo "make node: dev/console dev/null"
mknod -m 600 dev/console c 5 1
mknod -m 600 dev/null c 1 3
- 把配置好的文件系统打包成ext3文件系统
#!/bin/bash
rm -f a9rootfs.ext3
dd if=/dev/zero of=a9rootfs.ext3 bs=1M count=64
mkfs.ext3 a9rootfs.ext3
mkdir -p tmpfs
chmod 777 tmpfs
sudo mount -t ext3 a9rootfs.ext3 tmpfs/ -o loop
sudo cp -r rootfs/* tmpfs/
sudo umount tmpfs
rm -rf tmpfs
- 仿真
qemu-system-arm -M vexpress-a9 -m 512M \
-kernel /home/wuuu/vmDevEnv/a9_linux/linux-6.13.1/arch/arm/boot/zImage \
-dtb /home/wuuu/vmDevEnv/a9_linux/linux-6.13.1/arch/arm/boot/dts/arm/vexpress-v2p-ca9.dtb \
-nographic \
-append "root=/dev/mmcblk0 rw console=ttyAMA0" \
-sd a9rootfs.ext3
根文件系统给linux提供了什么?
- 一些基本的命令
- 一些基本的库
- 一些配置文件
- 一些设备文件
- 一些启动脚本
本文作者:tggpx
本文链接:https://www.cnblogs.com/tggpx/p/18697071
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步