
先准备busyboxbusybox cd ~ wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2 tar -xvf busybox-1.36.1.tar.bz2 cd busybox-1.36.1 # 配置 BusyBox make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- defconfig # 启用静态编译关键无需动态库 make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- menuconfig # 勾选Settings - Build static binary (no shared libs) # 编译并安装 BusyBox make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- install -j$(nproc) # 创建根文件系统目录 mkdir -p ~/rootfs cd ~/rootfs # 复制 BusyBox 生成的文件 cp -r ~/busybox-1.36.1/_install/* ./ # 创建必要目录 mkdir -p dev proc sys tmp etc/init.d mnt root # 创建 init 启动脚本核心 cat etc/init.d/rcS EOF #!/bin/sh mount -t proc proc /proc mount -t sysfs sysfs /sys mount -t tmpfs tmpfs /tmp mdev -s # 自动创建设备节点 echo Welcome to QEMU ARM Linux! EOF # 赋予执行权限 chmod x etc/init.d/rcS # 创建 inittab指定启动脚本 cat etc/inittab EOF ::sysinit:/etc/init.d/rcS ::respawn:/bin/sh ::ctrlaltdel:/sbin/reboot EOF # 创建设备节点控制台/串口 sudo mknod dev/console c 5 1 sudo mknod dev/ttyAMA0 c 204 64 # QEMU 串口节点 dd if/dev/zero ofa64rootfs.ext4 bs1M count128 # 3. 格式化空镜像为ext4格式必须格式化否则无法挂载和使用 sudo mkfs.ext4 a64rootfs.ext4 # 4. 创建临时挂载目录已创建可跳过 mkdir -p tmp_mount # 5. 挂载新建的空ext4镜像到tmp_mount sudo mount a64rootfs.ext4 tmp_mount/ # 6. 复制a64rootfs目录下所有文件到镜像中保留文件权限和结构 sudo cp -rf a64rootfs/* tmp_mount/ # 7. 同步数据确保所有文件写入镜像避免丢失 sudo sync # 8. 卸载镜像完成打包 sudo umount tmp_mount/准备ubuntu22ubuntu22 make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- defconfig make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- menuconfig make -j$(nproc) ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- Image dtbs准备qemu#!/bin/bash qemu-system-aarch64 -M virt -cpu cortex-a53 \ -kernel linux-5.15.146/arch/arm64/boot/Image \ -drive filebusybox-1.36.1/a64rootfs.ext4,formatraw,idhd0,ifnone \ -device virtio-blk-device,drivehd0 \ -append root/dev/vda rw consolettyAMA0 loglevel8 init/linuxrc nokaslr \ -nographic \ -S -s准备调试// 这个cmd启动到cmd阶段有问题 但是不影响start_kernel阶段的调试.. gdb-multiarch -ex target remote :1234 vmlinux arch/arm64/kernel/vmlinux.lds.S reserved_pg_dir .; . PAGE_SIZE; swapper_pg_dir .; . PAGE_SIZE; . ALIGN(SEGMENT_ALIGN); __init_begin .; __inittext_begin .; (gdb) p swapper_pg_dir $6 (pgd_t (*)[512]) 0xffff8000096e8000 (gdb) p reserved_pg_dir $7 (pgd_t (*)[512]) 0xffff8000096e7000 (gdb) p __init_begin $8 (char (*)[]) 0xffff8000096f0000 primary_entry ///////////// (gdb) bt #0 free_area_init_core (pgdatoptimized out) at mm/page_alloc.c:7525 #1 free_area_init_node (nid0) at mm/page_alloc.c:7663 #2 0xffff800009705824 in free_area_init (max_zone_pfn0xffff800009d09d88 node_states8) at mm/page_alloc.c:8103 #3 0xffff8000096f6c84 in zone_sizes_init (minoptimized out, maxoptimized out) at arch/arm64/mm/init.c:184 #4 bootmem_init () at arch/arm64/mm/init.c:380 #5 0xffff8000096f3ca8 in setup_arch (cmdline_p0xfffffbfffdc00084) at arch/arm64/kernel/setup.c:350 #6 0xffff8000096f0c54 in start_kernel () at init/main.c:959 Breakpoint 1, 0xffff8000081e42d4 in add_to_free_list (migratetypeoptimized out, orderoptimized out, zoneoptimized out, pageoptimized out) at mm/page_alloc.c:968 968 list_add(page-lru, area-free_list[migratetype]); (gdb) bt #0 0xffff8000081e42d4 in add_to_free_list (migratetypeoptimized out, orderoptimized out, zoneoptimized out, pageoptimized out) at mm/page_alloc.c:968 #1 expand (migratetypeoptimized out, high10, lowoptimized out, pageoptimized out, zoneoptimized out) at mm/page_alloc.c:2308 #2 __rmqueue_smallest (migratetypeoptimized out, orderoptimized out, zoneoptimized out) at mm/page_alloc.c:2462 #3 __rmqueue (alloc_flagsoptimized out, migratetypeoptimized out, orderoptimized out, zoneoptimized out) at mm/page_alloc.c:2995 #4 rmqueue_bulk (zone0xffff000007fb3c00, order0, count18446462598866746560, list0x1, migratetype30, alloc_flags0) at mm/page_alloc.c:3027 #5 0xffff8000081e69d4 in __rmqueue_pcplist (listoptimized out, pcpoptimized out, alloc_flagsoptimized out, migratetypeoptimized out, orderoptimized out, zoneoptimized out) at mm/page_alloc.c:3624 #6 rmqueue_pcplist (gfp_flagsoptimized out, alloc_flagsoptimized out, migratetypeoptimized out, orderoptimized out, zoneoptimized out, preferred_zoneoptimized out) at mm/page_alloc.c:3662 #7 rmqueue (migratetypeoptimized out, alloc_flagsoptimized out, gfp_flagsoptimized out, orderoptimized out, zoneoptimized out, preferred_zoneoptimized out) at mm/page_alloc.c:3690 #8 get_page_from_freelist (gfp_mask589824, order1, alloc_flags133911808, ac0x1) at mm/page_alloc.c:4156 #9 0xffff8000081e72e4 in __alloc_pages (gfp589824, order0, preferred_nid10, nodemask0x0) at mm/page_alloc.c:5421 #10 0xffff80000820f114 in __alloc_pages_node (orderoptimized out, gfp_maskoptimized out, nidoptimized out) at ./include/linux/gfp.h:570 #11 alloc_slab_page (soptimized out, oo..., nodeoptimized out, flagsoptimized out) at mm/slub.c:1777 #12 allocate_slab (nodeoptimized out, flagsoptimized out, soptimized out) at mm/slub.c:1912 #13 new_slab (s0xffff8000097a2dc8 boot_kmem_cache_node, flags589832, node0) at mm/slub.c:1975 #14 0xffff800008216544 in early_kmem_cache_node_alloc (nodeoptimized out) at mm/slub.c:3915 #15 init_kmem_cache_nodes (soptimized out) at mm/slub.c:3970 #16 kmem_cache_open (flagsoptimized out, soptimized out) at mm/slub.c:4216 #17 __kmem_cache_create (s0xffff8000097a2dc8 boot_kmem_cache_node, flags589832) at mm/slub.c:4892 #18 0xffff800009703bb0 in create_boot_cache (s0xffff8000097a2dc8 boot_kmem_cache_node, name0xffff8000094d4a90 kmem_cache_node, size64, flags8192, useroffset0, usersize0) at mm/slab_common.c:671 --Type RET for more, q to quit, c to continue without paging-- #19 0xffff800009708c14 in kmem_cache_init () at mm/slub.c:4824 #20 0xffff8000096f0fbc in mm_init () at init/main.c:853 #21 start_kernel () at init/main.c:994 #22 0xffff8000096f03f0 in __primary_switched () at arch/arm64/kernel/head.S:468 Backtrace stopped: previous frame identical to this frame (corrupt stack?) ///////////// (gdb) p node_data $8 0xffff800009d0d818 node_data (gdb) p node_data[0] $9 (struct pglist_data *) 0xffff000007fb3c00 (gdb) p node_data[1] $10 (struct pglist_data *) 0x0 (gdb) p *node_data[0] $11 {node_zones {{_watermark {0, 0, 0}, watermark_boost 0, nr_reserved_highatomic 0, lowmem_reserve {0, 0, 0, 0}, node 0, zone_pgdat 0xffff000007fb3c00, per_cpu_pageset 0xffff800009839718 boot_pageset, per_cpu_zonestats 0xffff800009839818 boot_zonestats, pageset_high 0, pageset_batch 1, zone_start_pfn 262144, managed_pages incomplete type, spanned_pages 32768, present_pages 32768, cma_pages 0, name 0xffff8000095a2ca0 DMA, nr_isolate_pageblock 0, initialized 1, _pad1_ { x 0xffff000007fb3cc0 \310\006\t}, free_area {{free_list 0xffff000007fb3cc0, nr_free 2}, { free_list 0xffff000007fb3d28, nr_free 5}, {free_list 0xffff000007fb3d90, nr_free 2}, { free_list 0xffff000007fb3df8, nr_free 2}, {free_list 0xffff000007fb3e60, nr_free 4}, { free_list 0xffff000007fb3ec8, nr_free 3}, {free_list 0xffff000007fb3f30, nr_free 4}, { free_list 0xffff000007fb3f98, nr_free 2}, {free_list 0xffff000007fb4000, nr_free 5}, { free_list 0xffff000007fb4068, nr_free 4}, {free_list 0xffff000007fb40d0, nr_free 11}}, flags 0, lock incomplete type, _pad2_ {x 0xffff000007fb4180 }, percpu_drift_mark 0, compact_cached_free_pfn 0, compact_cached_migrate_pfn {0, 0}, compact_init_migrate_pfn 0, compact_init_free_pfn 0, compact_considered 0, compact_defer_shift 0, compact_order_failed 0, compact_blockskip_flush false, contiguous false, _pad3_ {x 0xffff000007fb41c0 \304;}, vm_stat 0xffff000007fb41c0, vm_numa_event 0xffff000007fb4210}, {_watermark {0, 0, 0}, watermark_boost 0, nr_reserved_highatomic 0, lowmem_reserve {0, 0, 0, 0}, node 0, zone_pgdat 0xffff000007fb3c00, per_cpu_pageset 0xffff800009839718 boot_pageset, per_cpu_zonestats 0xffff800009839818 boot_zonestats, pageset_high 0, pageset_batch 1, zone_start_pfn 0, managed_pages incomplete type, spanned_pages 0, present_pages 0, cma_pages 0, name 0xffff8000094d2af0 DMA32, nr_isolate_pageblock 0, initialized 0, _pad1_ {x 0xffff000007fb4300 }, free_area {{free_list 0xffff000007fb4300, (gdb) (gdb) p (node_data[0].node_zones)[0].present_pages $15 32768 (gdb) p (node_data[0].node_zones)[1].present_pages $16 0 (gdb) p (node_data[0].node_zones)[2].present_pages $17 0 (gdb) p (node_data[0].node_zones)[2].name $18 0xffff8000094d2af8 Normal (gdb) p (node_data[0].node_zones)[3].name $19 0xffff8000094d2ab8 Movable (gdb) p (node_data[0].node_zones)[4].name $20 0x0 (gdb) p (node_data[0].node_zones)[1].name $21 0xffff8000094d2af0 DMA32 (gdb) p (node_data[0].node_zones)[0].name $22 0xffff8000095a2ca0 DMA (gdb)