2025-02-19 21:15阅读: 11评论: 0推荐: 0

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

  1. 下载安装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)
  1. 制作根文件系统
目录 说明 补充
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
  1. 仿真
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提供了什么?

  1. 一些基本的命令
  2. 一些基本的库
  3. 一些配置文件
  4. 一些设备文件
  5. 一些启动脚本

本文作者:tggpx

本文链接:https://www.cnblogs.com/tggpx/p/18697071

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   天刚刚破晓  阅读(11)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起