双pflash 标准FIP 完整安全启动详细实操步骤一、整体硬件模拟设计原理说明1.1 真实硬件上电流程ARM开发板上电复位后CPU固定从片内ROMBL1固化在NOR Flash 0地址执行第一条指令BL1最小硬件初始化、安全RAM初始化、校验并加载FIP固件包内的BL2BL2外设初始化、安全固件完整性校验依次加载BL31、OP-TEE(BL32)、U-Boot(BL33)BL31(EL3安全监控)初始化PSCI电源管理、SMC异常转发拉起OP-TEE安全世界后将CPU切换到Non-secure EL1非安全态交给U-BootU-Boot引导Linux内核根文件系统普通业务运行在非安全世界。1.2 QEMU硬件模拟设计为什么用两块64MB pflashpflash0地址0x00000000存放bl1.bin设置为只读模拟出厂固化的片上启动ROM防止固件被误擦写篡改pflash1地址0x04000000存放fip.bin标准固件包BL1会固定从该地址解析FIP头部加载后续所有阶段固件必须填充至64MB原因QEMU virt平台硬件规范约束单块NOR Flash固定容量为64MB67108864字节原始编译出的bin只有几十KB小于硬件规定大小会直接报区域大小不匹配错误truncate仅在文件尾部补0不修改原有固件数据。1.3 完整启动链路BL1(EL3) → BL2(S-EL1) → BL31(EL3) → BL32(OP-TEE S-EL1) → BL33(U-Boot NS-EL1) → Linux(NS-EL1)第一阶段源码编译四大核心固件前置环境准备# 1. 安装AArch64交叉编译工具链 sudo apt install aarch64-linux-gnu-gcc aarch64-linux-gnu-binutils make git # 2. 全局环境变量全程保持不变保证编译平台一致 export CROSS_COMPILEaarch64-linux-gnu- export PLATqemu export DEBUG1工具用途解释CROSS_COMPILEATF、OP-TEE、U-Boot均为裸机代码无操作系统库依赖必须使用ARM64交叉编译器不能使用x86宿主机编译器PLATqemu指定硬件平台为QEMU virt自动适配该平台内存布局、GIC中断、Flash基地址、外设寄存器DEBUG1开启详细日志输出后续FIP校验失败、镜像加载崩溃时可以快速定位问题。步骤1编译ATF产出BL1、BL2、BL31 打包工具fiptool1.1 进入ATF源码目录清理旧编译产物cd arm-trusted-firmware make clean原因避免旧版本目标文件、链接脚本残留防止镜像地址错乱、编译产物不匹配。1.2 编译三大引导固件make PLATqemu ARCHaarch64 CROSS_COMPILEaarch64-none-elf- DEBUG1编译产物路径build/qemu/debug/文件名作用烧录位置bl1.bin上电第一阶段固化引导pflash0第一块Flashbl2.bin安全态第二阶段引导打包进FIPbl31.binEL3安全监控核心SMC/PSCI实现打包进FIP1.3 编译fiptool打包工具make -C tools/fiptool必须用本套ATF编译fiptool的原因FIP固件包自带魔数UUID头部校验只有同版本ATF编译出的fiptool打包的镜像才能被当前BL1正常解析跨版本工具打包会直接触发FIP header check failed校验失败BL1无法进入下一阶段。步骤2编译OP-TEEBL32安全操作系统 tee.binapt install -y gcc-arm-linux-gnueabihf g-arm-linux-gnueabihf export CROSS_COMPILEarm-linux-gnueabihf- export CROSS_COMPILE64aarch64-linux-gnu- make PLATFORMvexpress-qemu_armv8a \ ARCHarm \ CFG_ARM64_corey \ CROSS_COMPILE64aarch64-none-elf- \ -j32编译产物tee-pager_v2.bin原理原因OP-TEE运行在S-EL1安全世界作为可信操作系统处理加密、密钥、安全存储等敏感业务Linux所有安全调用都会通过SMC指令转发到EL3 BL31再路由到OP-TEE必须打包进FIP由ATF统一加载初始化。步骤3编译U-BootBL33非安全引导 u-boot.binmake clean # 重新加载配置 make qemu_arm64_defconfig # 用新工具链编译 make CROSS_COMPILEaarch64-none-elf- -j32关键注意点必须使用裸二进制u-boot.bin不能使用u-boot-dtb.bin、不能用mkimage加过头部的镜像原因FIP容器仅支持原生裸bin格式带U-Boot镜像头会导致长度、校验字段异常ATF加载镜像会失败。作用U-Boot运行在NS-EL1非安全世界负责初始化外设、加载Linux内核、传递启动参数是安全世界和普通操作系统的中间引导层。步骤4归集打包所需的4个镜像将以下4个文件拷贝到同一个工作目录./firmware/bl2.binATF编译产物bl31.binATF编译产物tee-pager_v2.binOP-TEE编译产物u-boot.binU-Boot编译产物第二阶段fiptool打包标准FIP固件包步骤1执行FIP打包命令# 切换到固件目录使用同版本fiptool打包../arm-trusted-firmware/tools/fiptool/fiptool create \ --tb-fw bl2.bin \ --scp-fw bl31.bin \ --tos-fw tee-pager_v2.bin \ --nt-fw u-boot.bin \ fip.bin参数逐行解释--tb-fw bl2.bin可信启动固件安全启动第二阶段镜像--scp-fw bl31.binEL3安全监控固件电源管理、SMC指令转发核心--tos-fw tee.bin可信操作系统镜像即OP-TEE安全系统--nt-fw u-boot.bin非可信固件非安全世界引导程序输出fip.bin带校验头部的固件容器BL1可以通过内部镜像索引表按地址、长度、校验值逐个加载固件。步骤2校验FIP镜像合法性必做前置检查../arm-trusted-firmware/tools/fiptool/fiptool info fip.bin正常结果终端打印出 TB_FW、SCP_FW、TOS_FW、NT_FW 四段镜像的加载地址、镜像长度、CRC校验信息。校验必要性提前规避FIP格式错误如果校验失败BL1上电会直接卡在FIP header check failed无法启动后续固件提前校验节省调试时间。第三阶段pflash镜像扩容至64MB适配QEMU硬件规范步骤1处理BL1镜像第一块只读Flashcp bl1.bin bl1_64m.bin truncate -s 64M bl1_64m.bincp备份原始镜像防止源文件被意外修改truncate -s 64M保留原有固件数据在文件末尾填充0字节将文件总大小扩充为64MB匹配QEMU pflash硬件容量约束。步骤2处理FIP固件包第二块Flashcp fip.bin fip_64m.bin truncate -s 64M fip_64m.bin步骤3校验镜像大小ls -lh bl1_64m.bin fip_64m.bin预期两个文件大小均为64M。异常大小不是64MQEMU启动直接抛出ROM区域大小不匹配错误。制作uramdisk.img、bootdisk.img在制作好busybox基础制作./u-boot/tools/mkimage -A arm64 -O linux -T ramdisk -C gzip -n aarch64_rootfs -d ramdisk.cpio.gz uramdisk.img制作制作bootdisk.img dd if/dev/zero ofbootdisk.img bs1M count64 mkfs.ext4 bootdisk.img mkdir -p tmp_mount sudo mount bootdisk.img tmp_mount/ sudo cp Image qemu_virt_optee.dtb uramdisk.img tmp_mount/ sudo umount tmp_mount第四阶段启动成功进入uboot日志qemu-system-aarch64 -M virt,secureon,gic-version2 -cpu cortex-a57 -smp 2 -m 1024 -nographic -drive ifpflash,formatraw,filebl1_64m.bin,readonlyon -drive ifpflash,formatraw,filefip_64m.bin -device loader,fileImage,addr0x52000000 -device loader,fileqemu_virt_optee.dtb,addr0x55000000 -device loader,fileuramdisk.img,addr0x56000000 -device virtio-blk-device,drivehd0 -drive ifnone,filebootdisk.img,idhd0,formatraw -serial mon:stdio -serial tcp:localhost:54320,server,nowait设置打印输出方便调试 setenv bootargs consolettyAMA0,115200 earlyconpl011,0x09000000 root/dev/ram init/linuxrc rw booti 0x52000000 0x56000000 0x55000000设备树修改/dts-v1/; / { interrupt-parent 0x8005; model linux,dummy-virt; #size-cells 0x02; #address-cells 0x02; compatible linux,dummy-virt; /* 新增firmware 节点 optee 子节点 */ firmware { optee { compatible linaro,optee-tz; method smc; }; }; psci { migrate 0xc4000005; cpu_on 0xc4000003; cpu_off 0x84000002; cpu_suspend 0xc4000001; method smc; //hvc你的设备树指定 PSCI 使用 hvc 调用方式Hypervisor 调用 //但当前系统运行在 EL1 特权级、没有 Hypervisor 层HVC 指令属于未定义指令直接触发异常 //调用栈完全印证了这一点psci_probe → 执行 HVC 指令 → 未定义指令异常 → 内核 panic。 compatible arm,psci-1.0\0arm,psci-0.2\0arm,psci; };无法挂载文件系统修改设备树flash0 { bank-width 0x04; reg 0x00 0x4000000 0x00 0x4000000; compatible cfi-flash; };崩溃日志分析是没有找到根文件系统[ 2.633114] ALSA device list: [ 2.633732] No soundcards found. [ 2.644052] uart-pl011 9000000.pl011: no DMA platform data [ 2.654346] /dev/root: Cant open blockdev [ 2.655059] VFS: Cannot open root device ram or unknown-block(1,0): error -6 [ 2.655320] Please append a correct root boot option; here are the available partitions: [ 2.656158] fe00 65536 vda [ 2.656424] driver: virtio_blk [ 2.656802] 1f00 65536 mtdblock0 [ 2.656866] (driver?) [ 2.657988] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0) [ 2.658848] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 6.0.12 #2 [ 2.659309] Hardware name: linux,dummy-virt (DT) [ 2.660070] Call trace: [ 2.660451] dump_backtrace0xdc/0xe8 [ 2.661054] show_stack0x18/0x50 [ 2.661329] dump_stack_lvl0x68/0x84 [ 2.661574] dump_stack0x18/0x34 [ 2.661774] panic0x16c/0x32c [ 2.661950] mount_block_root0x15c/0x210 [ 2.662157] mount_root0x1e0/0x21c [ 2.662347] prepare_namespace0x130/0x170 [ 2.662542] kernel_init_freeable0x24c/0x290 [ 2.662742] kernel_init0x24/0x130 [ 2.662936] ret_from_fork0x10/0x20 [ 2.663910] SMP: stopping secondary CPUs [ 2.664989] Kernel Offset: 0x485f02e00000 from 0xffff800008000000 [ 2.665237] PHYS_OFFSET: 0xffff94e6c0000000 [ 2.665501] CPU features: 0x4400,080cb020,00001086 [ 2.666151] Memory Limit: none [ 2.667381] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0) ]---增加root参数没有解决配置内核继续增加支持RAM DISKGeneral setup - Initial RAM filesystem and RAM disk (initramfs/initrd) support继续提示无法加载在宿主机上处理uramdisk.img去掉 U-Boot 头部生成内核可直接识别的纯 gzip 压缩镜像。跳过前64字节的uImage头输出纯压缩的根文件系统 dd ifuramdisk.img ofrootfs_raw.gz bs64 skip1 1. 先卸载之前可能挂载的镜像如果有 sudo umount bootdisk.img 2/dev/null 2. 重新格式化磁盘保证干净 mkfs.ext4 -F bootdisk.img mkdir -p rootfs_mnt sudo mount bootdisk.img rootfs_mnt mkdir -p tmp_extract zcat rootfs_raw.gz | cpio -idmv -D tmp_extract 3. 把 rootfs 子目录里的所有内容移到磁盘根目录 sudo mv tmp_extract/rootfs/* rootfs_mnt/ sudo mv tmp_extract/rootfs/.* rootfs_mnt/ 2/dev/null 5. 补全系统运行必须的空目录 sudo mkdir -p rootfs_mnt/{dev,proc,sys,tmp,run} 6. 卸载并同步数据 sudo umount rootfs_mnt 进入uboot之后启动命令 setenv bootargs consolettyAMA0,115200 earlyconpl011,0x09000000 root/dev/vda rw init/linuxrc booti 0x52000000 - 0x55000000进入qemu 的 Linux系统的控制台
TEE-TA学习轨迹第五篇:ARM 64 双pflash + 标准FIP+Linux内核+TEE驱动在完整安全启动详细实操步骤
双pflash 标准FIP 完整安全启动详细实操步骤一、整体硬件模拟设计原理说明1.1 真实硬件上电流程ARM开发板上电复位后CPU固定从片内ROMBL1固化在NOR Flash 0地址执行第一条指令BL1最小硬件初始化、安全RAM初始化、校验并加载FIP固件包内的BL2BL2外设初始化、安全固件完整性校验依次加载BL31、OP-TEE(BL32)、U-Boot(BL33)BL31(EL3安全监控)初始化PSCI电源管理、SMC异常转发拉起OP-TEE安全世界后将CPU切换到Non-secure EL1非安全态交给U-BootU-Boot引导Linux内核根文件系统普通业务运行在非安全世界。1.2 QEMU硬件模拟设计为什么用两块64MB pflashpflash0地址0x00000000存放bl1.bin设置为只读模拟出厂固化的片上启动ROM防止固件被误擦写篡改pflash1地址0x04000000存放fip.bin标准固件包BL1会固定从该地址解析FIP头部加载后续所有阶段固件必须填充至64MB原因QEMU virt平台硬件规范约束单块NOR Flash固定容量为64MB67108864字节原始编译出的bin只有几十KB小于硬件规定大小会直接报区域大小不匹配错误truncate仅在文件尾部补0不修改原有固件数据。1.3 完整启动链路BL1(EL3) → BL2(S-EL1) → BL31(EL3) → BL32(OP-TEE S-EL1) → BL33(U-Boot NS-EL1) → Linux(NS-EL1)第一阶段源码编译四大核心固件前置环境准备# 1. 安装AArch64交叉编译工具链 sudo apt install aarch64-linux-gnu-gcc aarch64-linux-gnu-binutils make git # 2. 全局环境变量全程保持不变保证编译平台一致 export CROSS_COMPILEaarch64-linux-gnu- export PLATqemu export DEBUG1工具用途解释CROSS_COMPILEATF、OP-TEE、U-Boot均为裸机代码无操作系统库依赖必须使用ARM64交叉编译器不能使用x86宿主机编译器PLATqemu指定硬件平台为QEMU virt自动适配该平台内存布局、GIC中断、Flash基地址、外设寄存器DEBUG1开启详细日志输出后续FIP校验失败、镜像加载崩溃时可以快速定位问题。步骤1编译ATF产出BL1、BL2、BL31 打包工具fiptool1.1 进入ATF源码目录清理旧编译产物cd arm-trusted-firmware make clean原因避免旧版本目标文件、链接脚本残留防止镜像地址错乱、编译产物不匹配。1.2 编译三大引导固件make PLATqemu ARCHaarch64 CROSS_COMPILEaarch64-none-elf- DEBUG1编译产物路径build/qemu/debug/文件名作用烧录位置bl1.bin上电第一阶段固化引导pflash0第一块Flashbl2.bin安全态第二阶段引导打包进FIPbl31.binEL3安全监控核心SMC/PSCI实现打包进FIP1.3 编译fiptool打包工具make -C tools/fiptool必须用本套ATF编译fiptool的原因FIP固件包自带魔数UUID头部校验只有同版本ATF编译出的fiptool打包的镜像才能被当前BL1正常解析跨版本工具打包会直接触发FIP header check failed校验失败BL1无法进入下一阶段。步骤2编译OP-TEEBL32安全操作系统 tee.binapt install -y gcc-arm-linux-gnueabihf g-arm-linux-gnueabihf export CROSS_COMPILEarm-linux-gnueabihf- export CROSS_COMPILE64aarch64-linux-gnu- make PLATFORMvexpress-qemu_armv8a \ ARCHarm \ CFG_ARM64_corey \ CROSS_COMPILE64aarch64-none-elf- \ -j32编译产物tee-pager_v2.bin原理原因OP-TEE运行在S-EL1安全世界作为可信操作系统处理加密、密钥、安全存储等敏感业务Linux所有安全调用都会通过SMC指令转发到EL3 BL31再路由到OP-TEE必须打包进FIP由ATF统一加载初始化。步骤3编译U-BootBL33非安全引导 u-boot.binmake clean # 重新加载配置 make qemu_arm64_defconfig # 用新工具链编译 make CROSS_COMPILEaarch64-none-elf- -j32关键注意点必须使用裸二进制u-boot.bin不能使用u-boot-dtb.bin、不能用mkimage加过头部的镜像原因FIP容器仅支持原生裸bin格式带U-Boot镜像头会导致长度、校验字段异常ATF加载镜像会失败。作用U-Boot运行在NS-EL1非安全世界负责初始化外设、加载Linux内核、传递启动参数是安全世界和普通操作系统的中间引导层。步骤4归集打包所需的4个镜像将以下4个文件拷贝到同一个工作目录./firmware/bl2.binATF编译产物bl31.binATF编译产物tee-pager_v2.binOP-TEE编译产物u-boot.binU-Boot编译产物第二阶段fiptool打包标准FIP固件包步骤1执行FIP打包命令# 切换到固件目录使用同版本fiptool打包../arm-trusted-firmware/tools/fiptool/fiptool create \ --tb-fw bl2.bin \ --scp-fw bl31.bin \ --tos-fw tee-pager_v2.bin \ --nt-fw u-boot.bin \ fip.bin参数逐行解释--tb-fw bl2.bin可信启动固件安全启动第二阶段镜像--scp-fw bl31.binEL3安全监控固件电源管理、SMC指令转发核心--tos-fw tee.bin可信操作系统镜像即OP-TEE安全系统--nt-fw u-boot.bin非可信固件非安全世界引导程序输出fip.bin带校验头部的固件容器BL1可以通过内部镜像索引表按地址、长度、校验值逐个加载固件。步骤2校验FIP镜像合法性必做前置检查../arm-trusted-firmware/tools/fiptool/fiptool info fip.bin正常结果终端打印出 TB_FW、SCP_FW、TOS_FW、NT_FW 四段镜像的加载地址、镜像长度、CRC校验信息。校验必要性提前规避FIP格式错误如果校验失败BL1上电会直接卡在FIP header check failed无法启动后续固件提前校验节省调试时间。第三阶段pflash镜像扩容至64MB适配QEMU硬件规范步骤1处理BL1镜像第一块只读Flashcp bl1.bin bl1_64m.bin truncate -s 64M bl1_64m.bincp备份原始镜像防止源文件被意外修改truncate -s 64M保留原有固件数据在文件末尾填充0字节将文件总大小扩充为64MB匹配QEMU pflash硬件容量约束。步骤2处理FIP固件包第二块Flashcp fip.bin fip_64m.bin truncate -s 64M fip_64m.bin步骤3校验镜像大小ls -lh bl1_64m.bin fip_64m.bin预期两个文件大小均为64M。异常大小不是64MQEMU启动直接抛出ROM区域大小不匹配错误。制作uramdisk.img、bootdisk.img在制作好busybox基础制作./u-boot/tools/mkimage -A arm64 -O linux -T ramdisk -C gzip -n aarch64_rootfs -d ramdisk.cpio.gz uramdisk.img制作制作bootdisk.img dd if/dev/zero ofbootdisk.img bs1M count64 mkfs.ext4 bootdisk.img mkdir -p tmp_mount sudo mount bootdisk.img tmp_mount/ sudo cp Image qemu_virt_optee.dtb uramdisk.img tmp_mount/ sudo umount tmp_mount第四阶段启动成功进入uboot日志qemu-system-aarch64 -M virt,secureon,gic-version2 -cpu cortex-a57 -smp 2 -m 1024 -nographic -drive ifpflash,formatraw,filebl1_64m.bin,readonlyon -drive ifpflash,formatraw,filefip_64m.bin -device loader,fileImage,addr0x52000000 -device loader,fileqemu_virt_optee.dtb,addr0x55000000 -device loader,fileuramdisk.img,addr0x56000000 -device virtio-blk-device,drivehd0 -drive ifnone,filebootdisk.img,idhd0,formatraw -serial mon:stdio -serial tcp:localhost:54320,server,nowait设置打印输出方便调试 setenv bootargs consolettyAMA0,115200 earlyconpl011,0x09000000 root/dev/ram init/linuxrc rw booti 0x52000000 0x56000000 0x55000000设备树修改/dts-v1/; / { interrupt-parent 0x8005; model linux,dummy-virt; #size-cells 0x02; #address-cells 0x02; compatible linux,dummy-virt; /* 新增firmware 节点 optee 子节点 */ firmware { optee { compatible linaro,optee-tz; method smc; }; }; psci { migrate 0xc4000005; cpu_on 0xc4000003; cpu_off 0x84000002; cpu_suspend 0xc4000001; method smc; //hvc你的设备树指定 PSCI 使用 hvc 调用方式Hypervisor 调用 //但当前系统运行在 EL1 特权级、没有 Hypervisor 层HVC 指令属于未定义指令直接触发异常 //调用栈完全印证了这一点psci_probe → 执行 HVC 指令 → 未定义指令异常 → 内核 panic。 compatible arm,psci-1.0\0arm,psci-0.2\0arm,psci; };无法挂载文件系统修改设备树flash0 { bank-width 0x04; reg 0x00 0x4000000 0x00 0x4000000; compatible cfi-flash; };崩溃日志分析是没有找到根文件系统[ 2.633114] ALSA device list: [ 2.633732] No soundcards found. [ 2.644052] uart-pl011 9000000.pl011: no DMA platform data [ 2.654346] /dev/root: Cant open blockdev [ 2.655059] VFS: Cannot open root device ram or unknown-block(1,0): error -6 [ 2.655320] Please append a correct root boot option; here are the available partitions: [ 2.656158] fe00 65536 vda [ 2.656424] driver: virtio_blk [ 2.656802] 1f00 65536 mtdblock0 [ 2.656866] (driver?) [ 2.657988] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0) [ 2.658848] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 6.0.12 #2 [ 2.659309] Hardware name: linux,dummy-virt (DT) [ 2.660070] Call trace: [ 2.660451] dump_backtrace0xdc/0xe8 [ 2.661054] show_stack0x18/0x50 [ 2.661329] dump_stack_lvl0x68/0x84 [ 2.661574] dump_stack0x18/0x34 [ 2.661774] panic0x16c/0x32c [ 2.661950] mount_block_root0x15c/0x210 [ 2.662157] mount_root0x1e0/0x21c [ 2.662347] prepare_namespace0x130/0x170 [ 2.662542] kernel_init_freeable0x24c/0x290 [ 2.662742] kernel_init0x24/0x130 [ 2.662936] ret_from_fork0x10/0x20 [ 2.663910] SMP: stopping secondary CPUs [ 2.664989] Kernel Offset: 0x485f02e00000 from 0xffff800008000000 [ 2.665237] PHYS_OFFSET: 0xffff94e6c0000000 [ 2.665501] CPU features: 0x4400,080cb020,00001086 [ 2.666151] Memory Limit: none [ 2.667381] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0) ]---增加root参数没有解决配置内核继续增加支持RAM DISKGeneral setup - Initial RAM filesystem and RAM disk (initramfs/initrd) support继续提示无法加载在宿主机上处理uramdisk.img去掉 U-Boot 头部生成内核可直接识别的纯 gzip 压缩镜像。跳过前64字节的uImage头输出纯压缩的根文件系统 dd ifuramdisk.img ofrootfs_raw.gz bs64 skip1 1. 先卸载之前可能挂载的镜像如果有 sudo umount bootdisk.img 2/dev/null 2. 重新格式化磁盘保证干净 mkfs.ext4 -F bootdisk.img mkdir -p rootfs_mnt sudo mount bootdisk.img rootfs_mnt mkdir -p tmp_extract zcat rootfs_raw.gz | cpio -idmv -D tmp_extract 3. 把 rootfs 子目录里的所有内容移到磁盘根目录 sudo mv tmp_extract/rootfs/* rootfs_mnt/ sudo mv tmp_extract/rootfs/.* rootfs_mnt/ 2/dev/null 5. 补全系统运行必须的空目录 sudo mkdir -p rootfs_mnt/{dev,proc,sys,tmp,run} 6. 卸载并同步数据 sudo umount rootfs_mnt 进入uboot之后启动命令 setenv bootargs consolettyAMA0,115200 earlyconpl011,0x09000000 root/dev/vda rw init/linuxrc booti 0x52000000 - 0x55000000进入qemu 的 Linux系统的控制台