主要是参考网上的例子,网上的一些例子可能用的busybox 老旧,编译各种问题,以及rootfs hda的方式或者ramfs的方式。可能有些概念还是不清楚,以下是最终完成测试成功的案例。
下载kernel
https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.138.tar.xz
安装qemu arm
sudo apt install qemu-system-arm
QEMU emulator version 4.2.1 (Debian 1:4.2-3ubuntu6.27)
Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers
更新国内阿里的镜像然后安装
备注:这里标准版本防止出现版本差异的各种问题,后面busybox 就遇到了
安装交叉编译工具链
sudo apt install gcc-aarch64-linux-gnu
Using built-in specs.
COLLECT_GCC=aarch64-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/aarch64-linux-gnu/9/lto-wrapper
Target: aarch64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 9.4.0-1ubuntu1~20.04.2' --with-bugurl=file:///usr/share/doc/gcc-9/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++,gm2 --prefix=/usr --with-gcc-major-version-only --program-suffix=-9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --without-target-system-zlib --enable-libpth-m2 --enable-multiarch --enable-fix-cortex-a53-843419 --disable-werror --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=aarch64-linux-gnu --program-prefix=aarch64-linux-gnu- --includedir=/usr/aarch64-linux-gnu/include
Thread model: posix
gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)
编译内核
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make defconfig
make menuconfig
make –j$(nproc) #开始编译
备注:遇到什么百度,这里基本都没什么问题,就是安装一些库
使用qemu-system-aarch64
常见帮助
Qemu-system-aarch64 –h
Qemu-system-aarch64 –machine help
Qemu-system –cpu help
内核编译好,这里就能用qemu启动了,只不过没有rootfs,最终会panic
qemu-system-aarch64 -M virt -cpu cortex-a57 -m 1024 -nographic -kernel path-to-Image-file
备注:path-to-Image-file 在arch/arm64/boot下面,Image这个文件
,参数的含义自行百度
添加rootfs
编译busybox
busybox-1.35.0 #注意网上一些老版本的busybox 可能有各种编译问题,省的麻烦就用新一点的。
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
make
make install
#最终_install 目录下面的文件是需要的
创建rootfs
在busybox目录
cd _install
find . | cpio -o --format=newc > ../rootfs.img
cd ..
gzip -c rootfs.img > rootfs.img.gz
注意这里的rootfs.img.gz文件
到这里我们有了kernel 有了rootfs.img.gz,组合起来。
qemu-system-aarch64 \
-M virt \
-cpu cortex-a57 \
-m 1G \
-nographic \
-kernel Image \
-initrd rootfs.img.gz \
-append "root=/dev/ram rdinit=/bin/sh"
备注:写个sh文件把上面的语句拷贝进去,省的来回的练输入。Image 是arch/arm64/boot/Image
最终成功启动