前言
在前面vscode+clangd阅读Linux内核源码一文已经编译生成了内核镜像,可以看到,在/home/yukeyang/myfile/linux-6.6.30/arch/arm/boot/zImage路径下生成了内核镜像zImage,但要启动内核镜像还需要初始化文件系统initramfs。
初始化文件系统initramfs
输入以下命令,制作initramfs,这里假定前面已经完成了根文件系统rootfs的制作,在rootfs文件夹下有生成initramfs文件所需要的文件。
$ cd ~/rootfs
$ find . | cpio -H newc -ov --owner root:root > ../initramfs.cpio
$ cd ..
$ gzip initramfs.cpio
$ mkimage -A arm -O linux -T ramdisk -d initramfs.cpio.gz uRamdisk
在输入上面的命令后,可以看到在home目录下生成了initramfs.cpio.gz文件和uRamdisk文件。initramfs.cpio.gz文件就是我们启动内核所需要的初始化系统文件,它是一个独立的初始化文件系统(standalone initramfs),没有被集成到其它文件中。
yukeyang@ubuntu:~/rootfs$ cd ..
yukeyang@ubuntu:~$ ls
arm-cross-compiler Documents Downloads initramfs.cpio.gz Music myfile Pictures rootfs Templates uRamdisk Videos x-tools
启动内核
在生成了initramfs后,已经准备好启动内核所需要的文件。接下来就是在QEMU环境下启动linux内核,QEMU可以简单理解为一块仿真的开发板,可以让我们在脱离硬件的情况下调试linux内核。启动linux内核命令如下:
#设定环境变量
PATH=${HOME}/x-tools/arm-unknown-linux-gnueabi/bin/:$PATH
#在QEMU启动内核
QEMU_AUDIO_DRV=none qemu-system-arm -m 256M -nographic -M versatilepb -kernel /home/yukeyang/myfile/linux-6.6.30/arch/arm/boot/zImage -append "console=ttyAMA0 rdinit=/bin/sh" -dtb arch/arm/boot/dts/arm/versatile-pb.dtb -initrd /home/yukeyang/initramfs.cpio.gz
可以看到在启动内核过程中terminal会输出很多打印,右上角的环境名也变成了qemu开头的名字,说明我们已经进入QEMU环境。
如果想要退出QEMU,可以按下Ctrl + A,然后按下x键即可。