环境
macOS下面编译Busybox有点问题,换成同架构的Linux系统进行编译
创建文件系统 下载BusyBox源码并编译:
1 2 3 4 5 sudo dnf install make gcc -y wget https://busybox.net/downloads/busybox-1.37.0.tar.bz2 tar -xvf busybox-1.37.0.tar.bz2 cd busybox-1.37.0make menuconfig
常见错误:
1 2 3 4 5 6 7 8 sudo dnf install ncurses-devel -y sudo dnf install ncurses -y vim scripts/kconfig/lxdialog/Makefile always := $(hostprogs-y) dochecklxdialog
勾选Build static binary (no shared libs)
创建磁盘镜像 1 2 3 4 5 dd if =/dev/zero of=rootfs.img bs=1M count=2048sudo dnf install e2fsprogs -y mkfs.ext4 rootfs.img mkdir rootsudo mount -t ext4 -o loop rootfs.img ./root
常见错误:
1 libbb/hash_md5_sha.c:1316:35: error: ‘sha1_process_block64_shaNI’ undeclared (first use in this function ); did you mean ‘sha1_process_block64’?
使用vim编辑替换符号:%s#sha1_process_block64_shaNI#sha1_process_block64#g
1 networking/tc.c:236:27: error: ‘TCA_CBQ_MAX’ undeclared (first use in this function ); did you mean ‘TCA_CBS_MAX’?
删除networking/tc.c
文件,见Bug
1 2 3 4 /usr/sbin/ld: cannot find -lm: No such file or directory /usr/sbin/ld: have you installed the static version of the m library ? /usr/sbin/ld: cannot find -lresolv: No such file or directory /usr/sbin/ld: have you installed the static version of the resolv library ?
安装glibc-static
和libgcc
:
1 2 sudo dnf install glibc-static -y sudo dnf install libgcc -y
拷贝BusyBox到根文件系统 1 sudo make install CONFIG_PREFIX=./root
修改根文件系统 1 2 3 4 5 6 cd rootsudo mkdir proc dev etc home mnt sudo cp -r ../examples/bootfloppy/etc/* etc/ sudo chmod -R 777 . cd ..sudo umount ./root
启动内核
使用QEMU启动内核和文件系统:
启动命令 1 qemu-system-aarch64 -smp 4 -M virt,accel=hvf -cpu host -nographic -m 2048M -kernel linux-6.7.9/arch/arm64/boot/Image -hda busybox-1.37.0/rootfs.img -append "root=/dev/vda rw console=ttyAMA0" -s
关闭内核地址随机化
其他问题:
1 qemu-system-aarch64: Error: r = HV_BAD_ARGUMENT (0xfae94003, at ../target/arm/hvf/hvf.c:2234)
解决办法: 问题已修复,需要更新QEMU版本。
预编译二进制没有发版,可以源码编译QEMU
1 2 3 4 5 git clone https://gitlab.com/qemu-project/qemu.git cd qemu./configure --target-list=aarch64-softmmu,riscv64-softmmu make -j$(nproc ) codesign -d --entitlements accel/hvf/entitlements.plist --force -s - ./build/qemu-system-aarch64-unsigned
1 /Volumes/Work/qemu/build/qemu-system-aarch64-unsigned -smp 4 -M virt,accel=hvf -cpu host -nographic -m 2048M -kernel linux-6.7.9/arch/arm64/boot/Image -hda busybox-1.37.0/rootfs.img -append "root=/dev/vda rw console=ttyAMA0" -s
Xcode调试 打开Xcode自定义LLDB命令支持
1 defaults write com.apple.dt.Xcode IDEDebuggerFeatureSetting 12
使用下面的LLDB命令连接QEMU调试:
1 2 target create $PROJECT_DIR/vmlinux gdb-remote localhost:1234
生成Xcode项目 把下面的内容保存为project.yml
文件,然后使用xcodegen
生成Xcode项目:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 name: Linux options: bundleIdPrefix: top.ourfor.opensource settings: HEADER_SEARCH_PATHS: $SRCROOT/** targets: Kernel: type: tool platform: macOS deploymentTarget: 10.15 preBuildScripts: - script: export PATH="/opt/homebrew/bin:$PATH" && lkmake ARCH=arm64 LLVM=1 -j $(nproc) name: Makefile Build postCompileScripts: - script: cp $PROJECT_DIR/vmlinux $BUILT_PRODUCTS_DIR/$EXECUTABLE_NAME name: Copy Executable - script: | export PATH="/opt/homebrew/bin:/Volumes/Work/qemu/build:$PATH" cd /Volumes/Work # 检查并关闭已存在的 qemu 会话 tmux has-session -t qemu 2>/dev/null && tmux kill-session -t qemu # 在新的 tmux 会话中启动 QEMU tmux new-session -d -s qemu '/Volumes/Work/qemu/build/qemu-system-aarch64-unsigned \ -smp 4 \ -M virt,accel=hvf \ -cpu host \ -nographic \ -m 2048M \ -kernel linux-6.7.9/arch/arm64/boot/Image \ -hda busybox-1.37.0/rootfs.img \ -append "root=/dev/vda rw console=ttyAMA0" \ -s' sleep 1 echo "QEMU started in tmux session 'qemu'" echo "Use 'tmux attach -t qemu' to connect to QEMU console" name: Launch QEMU runOnlyWhenInstalling: false Dummy: type: tool platform: macOS deploymentTarget: 10.15 sources: - path: arch includes: ["**/*.[chsS]" ] - path: block includes: ["**/*.[chsS]" ] - path: crypto includes: ["**/*.[chsS]" ] - path: drivers includes: ["**/*.[chsS]" ] - path: fs includes: ["**/*.[chsS]" ] - path: include includes: ["**/*.[chsS]" ] - path: init includes: ["**/*.[chsS]" ] - path: io_uring includes: ["**/*.[chsS]" ] - path: ipc includes: ["**/*.[chsS]" ] - path: kernel includes: ["**/*.[chsS]" ] - path: lib includes: ["**/*.[chsS]" ] - path: mm includes: ["**/*.[chsS]" ] - path: net includes: ["**/*.[chsS]" ] - path: security includes: ["**/*.[chsS]" ] - path: sound includes: ["**/*.[chsS]" ] - path: virt includes: ["**/*.[chsS]" ] schemes: Linux: build: targets: Kernel: [run ] run: debugEnabled: true executable: none customLLDBInitFile: | target create $PROJECT_DIR/vmlinux gdb-remote localhost:1234
修改源码并调试 修改后编译,打开终端,执行tmux a -t qemu
查看Linux系统输出
查看局部变量