WSL2下Ubuntu22.04使用Qemu搭建虚拟Vexpress-A9开发板(二)——编译Linux内核

Linux内核是Linux操作系统的核心代码,它主要负责和硬件打交道,主要实现资源调度、内存管理、存储管理、进程管理、文件系统、设备驱动、网络通信、系统调用等功能。

本节将介绍如何下载和编译Linux内核源码并将其移植到Qemu虚拟开发板上跑起来。

建立workspace工作空间

此后所有操作都在workspace内完成,编译生成的目标文件全部放在objeces内

mkdir /home/workspace
mkdir /home/workspace/objects

获取Linux内核源码

cd /home/workspace
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.186.tar.xz

解压Linux内核源码

tar -xvf linux-5.10.186.tar.xz

编译Linux 内核源码

 进入源码根目录

cd linux-5.10.191

创建automake_arm32.sh(笔者的电脑是12核CPU所以采用-j12进行编译,读者编译过程中可根据实际情况进行调整)

vim automake_arm32.sh

# 在automake_arm32.sh中填入以下内容
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- vexpress_defconfig O=../objects/vexpress-v2p-ca9
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- menuconfig O=../objects/vexpress-v2p-ca9
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j12 O=../objects/vexpress-v2p-ca9
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- LOADADDR=0x60003000 uImage -j12 O=../objects/vexpress-v2p-ca9

运行automake_arm32.sh进行编译

./automake_arm32.sh

编译过程中可能会出现以下界面,即menuconfig,目前阶段不需要管它,按两下Esc键退出这个界面继续编译即可。

 在Qemu试运行Linux内核源码

进入objects目录

cd /home/workspace/objects

创建qemu-start-vexpress-a9.sh

vim qemu-start-vexpress-a9.sh

#! /bin/sh
qemu-system-arm -M vexpress-a9 \
        -m 512M \
        -kernel vexpress-v2p-ca9/arch/arm/boot/zImage \
        -dtb vexpress-v2p-ca9/arch/arm/boot/dts/vexpress-v2p-ca9.dtb \
        -nographic

运行qemu-start-vexpress-a9.sh

./qemu-start-vexpress-a9.sh

Linux内核启动过程中会打印大量信息,最后可能会出现以下错误信息,是因为没有挂载根文件系统导致的,下一节将探讨如何挂载根文件系统。

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
CPU: 0 PID: 1 Comm: swapper/0 Not tainted 5.10.186 #7
Hardware name: ARM-Versatile Express
[<8010f264>] (unwind_backtrace) from [<8010afb4>] (show_stack+0x10/0x14)
[<8010afb4>] (show_stack) from [<80881254>] (dump_stack+0x94/0xa8)
[<80881254>] (dump_stack) from [<8087d0b4>] (panic+0x124/0x32c)
[<8087d0b4>] (panic) from [<80b017a8>] (mount_block_root+0x1e8/0x26c)
[<80b017a8>] (mount_block_root) from [<80b01aec>] (prepare_namespace+0x150/0x18c)
[<80b01aec>] (prepare_namespace) from [<80885f8c>] (kernel_init+0x8/0x118)
[<80885f8c>] (kernel_init) from [<80100148>] (ret_from_fork+0x14/0x2c)
Exception stack(0x810b9fb0 to 0x810b9ff8)
9fa0:                                     00000000 00000000 00000000 00000000
9fc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
9fe0: 00000000 00000000 00000000 00000000 00000013 00000000
---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) ]---

猜你喜欢

转载自blog.csdn.net/cotex_A9/article/details/132343727