1.2 Linux初体验之QEMU

引言

本文尝试带领观众体验uboot到应用程序执行的过程,了解Linux的基本使用和开发。也许当你跟着博文操作一次,会发现做一个Linux嵌入式镜像也没想象的困难。

QEMU是什么

QEMU是一个开源的虚拟机监视器,它可以模拟多种硬件平台,包括x86、ARM、PowerPC等。QEMU最初是由Fabrice Bellard开发的,目的是为了能够运行Linux在Windows和Mac OS X操作系统下。

Documentation - QEMUicon-default.png?t=N7T8https://wiki.qemu.org/Documentation

QEMU的好处

  • 灵活性:QEMU可以模拟各种计算机硬件,因此可以在同一物理计算机上运行多个虚拟机,并使它们具有不同的硬件配置,包括处理器、内存、网络、存储等。
  • 节省成本:使用QEMU运行虚拟机,可以避免购买开发板情况下初步接触Linux,以评估是否购买开发继续学习。
  • 节省时间:软件开发很大比例的时间开销都花费在调试上。QEMU的硬件都是虚拟的,一则减少了排查硬件因素花费的时间;二则可以在模拟环境中实时查看内核的运行情况,包括内存映射、中断处理、进程调度等细节,甚至可以让用户实时修改虚拟机中的寄存器值、内存值等。

QEMU使用

安装

# 大家根据实际环境调整,我使用的是阿里云的ubuntu镜像
apt-get install qemu-system

# 测试是否安装成功
qemu-system-x86_64 --version

QEMU emulator version 6.2.0 (Debian 1:6.2+dfsg-2ubuntu6.13)
Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers

# 查看支持的主板方案,这里选用了vexpress-a9
qemu-system-arm -M help

Supported machines are:
...
vexpress-a9          ARM Versatile Express for Cortex-A9

引导uboot(可选)

  • 编译

U-Boot(Universal Bootloader)是一种开源的引导加载程序,主要作用是提供初始化系统的启动过程,加载内核镜像,挂载根文件系统并启动操作系统。通常,U-Boot由ROM或Flash芯片上的代码启动,然后加载和执行内核。同时,U-Boot还可以提供各种其他功能,如软件升级、故障排除和系统维护。

# 安装编译中使用到的工具和库
apt-get install build-essential pkg-config zlib1g-dev libglib2.0-0 libglib2.0-dev  libsdl1.2-dev libpixman-1-dev libfdt-dev libssl-dev autoconf automake libtool librbd-dev libaio-dev flex bison libncurses5-dev libncursesw5-dev -y
# 安装交叉编译工具
apt-get install gcc-arm-linux-gnueabihf
apt-get install g++-arm-linux-gnueabihf

wget https://ftp.denx.de/pub/u-boot/u-boot-2023.07.tar.bz2
tar -jxvf u-boot-2023.07.tar.bz2 
cd u-boot-2023.07/

make vexpress_ca9x4_defconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make clean && make vexpress_ca9x4_defconfig # 不需要改配置
# 看下cpu核数,使用多线程编译,对应-j参数
cat /proc/cpuinfo 
make -j4

# 编译完成目录文件
root@aliyun:~/project/u-boot-2023.07# ls
api   board  common     disk     dts       fs       Kconfig   MAINTAINERS  post    scripts     tools       u-boot.cfg  u-boot-nodtb.bin
arch  boot   config.mk  doc      env       include  lib       Makefile     py      System.map  u-boot      u-boot.lds  u-boot.srec
bin   cmd    configs    drivers  examples  Kbuild   Licenses  net          README  test        u-boot.bin  u-boot.map  u-boot.sym
  • 引导启动
# 测试使用QEMU引导uboot启动
root@aliyun:~/project/u-boot-2023.07# qemu-system-arm -M vexpress-a9 -m 256 -kernel ./u-boot -nographic


U-Boot 2023.07-rc6 (Sep 12 2023 - 11:39:37 +0800)

DRAM:  256 MiB
WARNING: Caches not enabled
Core:  18 devices, 10 uclasses, devicetree: embed
Flash: 64 MiB
MMC:   mmci@5000: 0
Loading Environment from Flash... *** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Net:   eth0: ethernet@3,02000000
Hit any key to stop autoboot:  0 
=> 

退出 QEMU:输入 Ctrl + A 后按 X

引导Linux

  • 编译
# 下载Linux源码包
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.4.256.tar.xz
tar -xvf linux-5.4.256.tar.xz
cd linux-5.4.256/

# 根据KConfig生成对应编译配置 .config
make vexpress_defconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

# 编译内核
make -j4 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
  • 引导

# dtb是设备树文件,这里没有通过uboot拷贝内核到内存,而是通过 NFS 网络下载
# 因为没有挂载根文件系统,执行后会 Kernel panic
qemu-system-arm -M vexpress-a9 -m 512M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append "console=ttyAMA0"

进入shell

  • 下载编译busybox

busybox是一个精简的Linux工具箱,包含了许多Linux系统中最基本的命令行工具,如ls、grep、awk、sed等等。它的设计初衷是为了让嵌入式设备和低端设备也能够运行Linux操作系统,因此它具有非常小的体积和高度的兼容性。

# 下载busybox源码
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2

# 编译
tar jxvf busybox-1.36.1.tar.bz2
cd busybox-1.36.1/
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
make defconfig
# 去除 Setting -> Build static Binary...
make menuconfig
make -j4
  • 制作根文件系统
mkdir rootfs
cp _install/* rootfs/ -raf
cd rootfs/ && mkdir -p lib proc sys tmp root var mnt dev && cd -
cp examples/bootfloppy/etc rootfs/ -arf
sed -r  "/askfirst/ s/.*/::respawn:-\/bin\/sh/" rootfs/etc/inittab -i

sudo cp -arf /usr/arm-linux-gnueabihf/lib/*  rootfs/lib
sudo mknod rootfs/dev/tty1 c 4 1
sudo mknod rootfs/dev/tty2 c 4 2
sudo mknod rootfs/dev/tty3 c 4 3
sudo mknod rootfs/dev/tty4 c 4 4
sudo mknod rootfs/dev/console c 5 1
sudo mknod rootfs/dev/null c 1 3
sudo dd if=/dev/zero of=rootfs.ext3 bs=1M count=128
sudo mkfs.ext3 rootfs.ext3

# 文件拷贝到文件系统
sudo mkdir virfs && chmod 777 virfs
sudo mount -t ext3 rootfs.ext3 virfs/ -o loop
sudo cp -r rootfs/* virfs/
sudo umount virfs

cp rootfs.ext ~/~linux-5.4.256/
  • 启动rootfs的命令
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
  •  至此,成功登陆命令行终端~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值