Qemu模拟arm64启动Uboot + Linux
目的由 U-Boot 引导 Linux 是一套非常经典的“全栈”仿真玩法虽然Qemu可以跳过U-Boot直接启动Linux但是要还原真实硬件的启动流程U-Boot是绕不开要调试和学习的以此简单记录下。使用Qemu可以用于早期的方案验证提前排除风险。无实物纯模拟不用担心硬件bug省去了很多调试力气。一、uboot1.1 安装依赖库编译uboot时需要编译主机工具而编译工具又依赖于一些常用的开发库。sudo apt install -y uuid-dev libssl-dev libgnutls28-dev libncurses-dev swig python3-dev u-boot-tools mtd-utils pkg-config cpio1.2 编译uboot下载编译启动不再赘述。ubifs依赖于ubiubi依赖于mtdmtd可以是norspinand。#下载 wget https://ftp.denx.de/pub/u-boot/u-boot-2026.01.tar.bz2 tar -jxvf u-boot-2026.01.tar.bz2 cd u-boot-2026.01 #配置已开启ubi配置 make ARCHarm CROSS_COMPILEaarch64-linux-gnu- qemu_arm64_defconfig make ARCHarm CROSS_COMPILEaarch64-linux-gnu- menuconfig 或以下方法 cat EOF .config CONFIG_CMD_MTDy CONFIG_MTDy CONFIG_FLASH_CFI_DRIVERy CONFIG_SYS_FLASH_CFIy CONFIG_MTD_NOR_FLASHy CONFIG_MTD_DEVICEy CONFIG_CMD_UBIy CONFIG_CMD_UBIFSy EOF make ARCHarm CROSS_COMPILEaarch64-linux-gnu- olddefconfig #编译 make ARCHarm CROSS_COMPILEaarch64-linux-gnu- -j4 cp u-boot.bin ../ 启动 qemu-system-aarch64 -machine virt -cpu cortex-a53 -smp 2 -m 512 -kernel u-boot -nographic1.3 启动uboot启动uboot可以识别两个mtd设备以及操作ubi卷。镜像文件可以裸放到支持norflash上ubi卷上或者ubifs文件系统中。需要uboot支持读接口获取镜像文件并启动因为重心不在此就不继续考究了。Bloblist at 0 not found (err-2) alloc space exhausted ptr 400 limit 0 Bloblist at 0 not found (err-2) U-Boot 2026.01 (Jun 11 2026 - 11:35:10 0800) DRAM: 512 MiB using memory 0x5e637000-0x5f677000 for malloc() Core: 51 devices, 14 uclasses, devicetree: board Flash: 64 MiB Loading Environment from Flash... *** Warning - bad CRC, using default environment In: serial,usbkbd Out: serial,vidconsole Err: serial,vidconsole No USB controllers found Net: eth0: virtio-net#32 Hit any key to stop autoboot: 0 mtd list List of MTD devices: * nor0 - device: flash0 - parent: root_driver - driver: cfi_flash - path: /flash0 - type: NOR flash - block size: 0x20000 bytes - min I/O: 0x1 bytes - 0x000000000000-0x000002000000 : nor0 * nor1 - device: flash0 - parent: root_driver - driver: cfi_flash - path: /flash0 - type: NOR flash - block size: 0x20000 bytes - min I/O: 0x1 bytes - 0x000000000000-0x000002000000 : nor11.4 初探UBI擦除norattach mtd设备创建ubi卷。uboot下似乎只支持读没有支持ubifs格式化、写入的操作因此无法挂载ubifs文件系统。我想这是安全的行为如果在uboot下创建文件系统要做好和kernel的版本同步。这个很麻烦也很容易把不一致性传递给kernel导致长期使用后ubifs的累加错误。 protect off all Un-Protect Flash Bank # 1 Un-Protect Flash Bank # 2 erase all Erase Flash Bank # 1 ................................................................................................................................................................................................................................................................ done Erase Flash Bank # 2 ................................................................................................................................................................................................................................................................ done ubi part nor0 0 force ubi0: attaching mtd0 ubi0: scanning is finished ubi0: empty MTD device detected ubi0: attached mtd0 (name nor0, size 32 MiB) ubi0: PEB size: 131072 bytes (128 KiB), LEB size: 130944 bytes ubi0: min./max. I/O unit sizes: 1/1, sub-page size 1 ubi0: VID header offset: 64 (aligned 64), data offset: 128 ubi0: good PEBs: 256, bad PEBs: 0, corrupted PEBs: 0 ubi0: user volume: 0, internal volumes: 1, max. volumes count: 128 ubi0: max/mean erase counter: 0/0, WL threshold: 4096, image sequence number: 0 ubi0: available PEBs: 252, total reserved PEBs: 4, PEBs reserved for bad PEB handling: 0 ubi create system 0xa00000 dynamic Creating dynamic volume system of size 10485760 ubi info layout Volume information dump: vol_id 0 reserved_pebs 81 alignment 1 data_pad 0 vol_type 3 name_len 6 usable_leb_size 130944 used_ebs 81 used_bytes 10606464 last_eb_bytes 130944 corrupted 0 upd_marker 0 skip_check 0 name system Volume information dump: vol_id 2147479551 reserved_pebs 2 alignment 1 data_pad 0 vol_type 3 name_len 13 usable_leb_size 130944 used_ebs 2 used_bytes 261888 last_eb_bytes 2 corrupted 0 upd_marker 0 skip_check 0 name layout volume ubi ubi ubifsload ubifsls ubifsmount ubifsumount ubifsmount system UBIFS error (pid: 1): cannot open system, error -22 Error reading superblock on volume system errno-22!二、kernel2.1 编译kernel编译启动不再赘述。#配置去掉nor后续模拟nand make ARCHarm64 defconfig ./scripts/config --enable DEBUG_INFO \ --enable DEBUG_KERNEL \ --enable GDB_SCRIPTS \ --enable KALLSYMS_ALL \ --enable FRAME_POINTER ./scripts/config --disable MTD_CFI \ --disable MTD_GENPROBE \ --disable MTD_CFI_AMDSTD \ --disable MTD_CFI_UTIL \ --disable MTD_PHYSMAP \ --disable MTD_PHYSMAP_OF cat EOF .config # MTD 核心与分区支持 CONFIG_MTDy CONFIG_MTD_PARTITIONSy CONFIG_MTD_CMDLINE_PARTSy CONFIG_MTD_CHARy # 核心 1启用 block2mtd 驱动 CONFIG_MTD_BLOCKy CONFIG_MTD_BLOCK2MTDy # 核心 2启用 nandsim 驱动及其依赖的 NAND 框架 CONFIG_MTD_RAW_NANDy CONFIG_MTD_NAND_NANDSIMm # UBI 与 UBIFS 配置 CONFIG_MTD_UBIy CONFIG_MTD_UBI_WL_THRESHOLD4096 CONFIG_MTD_UBI_BEB_LIMIT20 CONFIG_UBIFS_FSy CONFIG_UBIFS_FS_ADVANCED_COMPRy CONFIG_UBIFS_FS_LZOy CONFIG_UBIFS_FS_ZLIBy EOF make ARCHarm64 olddefconfig #编译 make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- -j8 cp arch/arm64/boot/Image ../ #启动 qemu-system-aarch64 \ -machine virt,virtualizationon \ -cpu cortex-a53 \ -kernel arch/arm64/boot/Image \ -append consolettyAMA0 nokaslr \ -nographic2.2 制作rootfs解决Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)问题需要busybox做个rootfs。#下载 wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2 tar -jxvf busybox-1.36.1.tar.bz2 cd busybox-1.36.1/ #配置启用静态链接 ,配置为静态编译。简单无需拷贝动态链接库 make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- defconfig sed -i s/^# CONFIG_STATIC.*/CONFIG_STATICy/ .config #关闭tc解决编译问题 sed -i s/CONFIG_TCy/CONFIG_TCn/ .config #编译 make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- -j4 make ARCHarm64 CROSS_COMPILEaarch64-linux-gnu- install #打包rootfs mkdir -p rootfs cp -av busybox-1.36.1/_install/* rootfs/ cd rootfs mkdir -p {dev,etc,lib,proc,sys,mnt,root,etc/init.d,tmp} #创建基础设备节点 sudo mknod -m 666 dev/tty1 c 4 1 sudo mknod -m 666 dev/tty2 c 4 2 sudo mknod -m 666 dev/tty3 c 4 3 sudo mknod -m 666 dev/tty4 c 4 4 sudo mknod -m 666 dev/console c 5 1 sudo mknod -m 666 dev/null c 1 3 #创建初始启动脚本 cat etc/init.d/rcS EOF #!/bin/sh mount -t proc proc /proc mount -t sysfs sysfs /sys mount -t devtmpfs devtmpfs /dev mount -t tmpfs tmpfs /tmp EOF chmod x etc/init.d/rcS #制作initramfs镜像 find . -print0 | cpio --null -ov --formatnewc | gzip -9 ../initrd.img cd .. #容量信息 :~/linux$ ls -alh ./ -rw-r--r-- 1 l16952 l16952 33M Jun 16 10:24 Image -rw-r--r-- 1 l16952 l16952 1.2M Jun 16 10:45 initrd.img -rw-r--r-- 1 l16952 l16952 1.6M Jun 16 09:37 u-boot.bin三、uboot启动kernel3.1 制作镜像创建虚拟磁盘存放Imageinitrd.img。让uboot通过virtio读取并加载启动#创建128MB的空磁盘文件 dd if/dev/zero ofdisk.img bs1M count128 #烧录内核 Image 到磁盘的 0 偏移处 dd ifImage ofdisk.img bs1M convnotrunc #烧录根文件系统 initrd.img 到磁盘偏移 50MB 处 dd ifinitrd.img ofdisk.img bs1M seek50 convnotrunc3.2 启动镜像#定义一块virtio块设备运行程序访问该设备获取disk.img中的镜像 qemu-system-aarch64 \ -machine virt,virtualizationon \ -cpu cortex-a53 \ -m 1024M \ -bios u-boot.bin \ -drive filedisk.img,formatraw,ifnone,idmydisk \ -device virtio-blk-device,drivemydisk \ -nographic #进uboot命令行执行以下操作 #读取内核Image virtio read 0x40080000 0x0 0x11170 #读取initrd.img virtio read 0x44000000 0x19000 0xBB8 #设置启动参数 setenv bootargs rdinit/sbin/init consolettyAMA0 loglevel8 #指定 initrd 内存段的起始地址和具体十六进制大小 booti 0x40080000 0x44000000:0x125cb4 $fdtcontroladdr3.3 自动启动使用环境变量或者脚本但是因为没有固化到介质中所以重启qemu仍会丢失#设置环境变量 setenv bootcmd virtio read 0x40080000 0x0 0x11170; virtio read 0x44000000 0x19000 0xBB8; setenv bootargs rdinit/sbin/init consolettyAMA0 loglevel8; booti 0x40080000 0x44000000:0x125cb4 $fdtcontroladdr #保存环境变量 saveenv #kernel下reboot Please press Enter to activate this console. ~ #reboot umount: devtmpfs busy - remounted read-only umount: cant unmount /: Invalid argument swapoff: cant open /etc/fstab: No such file or directory The system is going down NOW! Sent SIGTERM to all processes Sent SIGKILL to all processes Requesting system reboot #boot下reset Hit any key to stop autoboot: 0 reset resetting ...3.4 固化启动配置让uboot拥有两块flash使用文件来模拟存储boot镜像和环境变量。#生成第一块 64MB 的 Flash并把 u-boot.bin 重新烧进去 dd if/dev/zero ofpflash.img bs1M count64 dd ifu-boot.bin ofpflash.img convnotrunc #生成第二块 64MB 的 Flash专门给 U-Boot 存环境变量 dd if/dev/zero ofpflash_env.img bs1M count64 #用双flash命令启动QEMU qemu-system-aarch64 \ -machine virt,virtualizationon \ -cpu cortex-a53 \ -m 1024M \ -drive filepflash.img,formatraw,ifpflash \ -drive filepflash_env.img,formatraw,ifpflash \ -drive filedisk.img,formatraw,ifnone,idmydisk \ -device virtio-blk-device,drivemydisk \ -nographic #保存环境变量这次是真实写入pflash_env.img中 setenv bootcmd virtio read 0x40080000 0x0 0x11170; virtio read 0x44000000 0x19000 0xBB8; setenv bootargs rdinit/sbin/init consolettyAMA0 loglevel8; booti 0x40080000 0x44000000:0x125cb4 $fdtcontroladdr saveenv #后续直接用QEMU命令即可启动ubootkernel qemu-system-aarch64 \ -machine virt,virtualizationon \ -cpu cortex-a53 \ -m 1024M \ -drive filepflash.img,formatraw,ifpflash \ -drive filepflash_env.img,formatraw,ifpflash \ -drive filedisk.img,formatraw,ifnone,idmydisk \ -device virtio-blk-device,drivemydisk \ -nographic

相关新闻

094、 PCIE动态链路速度与宽度控制:一次深夜调试的启示

094、 PCIE动态链路速度与宽度控制:一次深夜调试的启示

094、 PCIE动态链路速度与宽度控制:一次深夜调试的启示 凌晨两点,示波器上的眼图突然塌陷,链路训练反复失败。设备管理器里那个熟悉的黄色叹号再次出现——这是今年第三次遇到PCIE链路降速问题。上次是热插拔后链路宽度锁死在x1,上上次是系统休眠唤醒后速率卡在Gen2。今晚…

2026/7/5 22:59:31阅读更多 →
百度网盘下载神器pdown:免登录高速下载终极指南

百度网盘下载神器pdown:免登录高速下载终极指南

百度网盘下载神器pdown:免登录高速下载终极指南 【免费下载链接】pdown 百度网盘下载器,2020百度网盘高速下载 项目地址: https://gitcode.com/gh_mirrors/pd/pdown 还在为百度网盘下载速度慢而烦恼吗?百度网盘下载器pdown帮你彻底告别…

2026/7/5 21:00:39阅读更多 →
【Qt】界面优化:绘图API

【Qt】界面优化:绘图API

🎬 个人主页:艾莉丝努力练剑❄专栏传送门:《C语言》《数据结构与算法》《C/C干货分享&学习过程记录》 《Linux操作系统编程详解》《笔试/面试常见算法:从基础到进阶》《Python干货分享》⭐️为天地立心,为生民立命…

2026/7/5 22:38:44阅读更多 →
huggingface注册失败418

huggingface注册失败418

1.官网地址 https://huggingface.co/2.解决方法: 手动开启代理,切换wanwan的代理可以直接注册成功

2026/7/6 13:36:27阅读更多 →
Decoupled and Reusable Adaptation for Efficient Cross-Modal Transfer

Decoupled and Reusable Adaptation for Efficient Cross-Modal Transfer

Abstract跨模态迁移方法在将基于 RGB 的基础模型扩展到非 RGB 模态方面取得了显著进展。然而,现有的迁移范式主要是面向任务的,这意味着一旦任务发生变化,就需要重新训练并重新存储模型,从而在数据、计算和存储方面造成大量冗余。…

2026/7/6 13:36:27阅读更多 →
使用Lambda表达式编写递归函数

使用Lambda表达式编写递归函数

例如&#xff0c;我们想要使用Lambda表达式编写一个计算递归的fac函数&#xff0c;一开始我们总会设法这样做&#xff1a; <span style"color:#333333"><span style"background-color:#ffffff"><span style"color:#2b91af">Fu…

2026/7/6 13:36:27阅读更多 →
阶段二:AI手工测试3 敏捷开发与APP发布全攻略

阶段二:AI手工测试3 敏捷开发与APP发布全攻略

目录 1 软件开发方法 1.1 敏捷开发&#xff08;scrum&#xff09;模型 2 项目上线发布策略 3 APP发布简介 3.1 APP软件包类型 3.2 APP测试包如何发布和管理 3.3 APP如何发布给客户 1 软件开发方法 迭代速度不同&#xff1a;开发模型不一样 传统行业&#xff1a;瀑布模…

2026/7/6 13:36:27阅读更多 →
huggingface下载模型

huggingface下载模型

1.浏览器输入网址&#xff0c;登录huggingface官网 注册huggingface失败的&#xff0c;请看&#xff1a;https://www.cnblogs.com/Leonardo-li/p/19769436 https://huggingface.co/ 2.创建access token 首次创建access token需要先按照它的提示给注册邮箱发送连接&#xff0…

2026/7/6 13:36:27阅读更多 →
Spring Boot Actuator 暴露 heapdump,内存里的密码可能全漏了

Spring Boot Actuator 暴露 heapdump,内存里的密码可能全漏了

Spring Boot Actuator 暴露 heapdump&#xff0c;内存里的密码可能全漏了线上开了 Actuator&#xff0c;本来是为了方便排查问题。 结果 /actuator/heapdump 也暴露出去了。 一份堆转储文件下载下来&#xff0c;数据库连接串、Redis 密码、Token、用户请求参数&#xff0c;都可…

2026/7/6 13:31:26阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述&#xff1a;从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目&#xff0c;叫 skills4/skills &#xff0c;它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景&#xff1a;一个旨在展示或教授某种技能的仓库&#xff0c;本身却成了安…

2026/7/6 4:26:20阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示&#xff1a;因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战&#xff1a;从“黑箱预测”到“可信推理”2026年6月&#xff0c;第7届机器学习与趋势国际会议&#xff08;MLT 2026&#xff09;将在悉尼召开。会议议程中&#xff0c;“因果与可解释机器学习…

2026/7/6 2:48:33阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时&#xff0c;通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中&#xff0c;是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/6 0:10:35阅读更多 →
Seraphine:基于LCU API的英雄联盟智能游戏助手技术解析与应用指南

Seraphine:基于LCU API的英雄联盟智能游戏助手技术解析与应用指南

Seraphine&#xff1a;基于LCU API的英雄联盟智能游戏助手技术解析与应用指南 【免费下载链接】Seraphine 英雄联盟战绩查询工具 项目地址: https://gitcode.com/gh_mirrors/se/Seraphine 技术架构先行&#xff1a;官方接口的合规应用 你是否曾在BP阶段手忙脚乱&#x…

2026/7/6 0:03:39阅读更多 →
多协议远程连接管理工具mRemoteNG:告别混乱,统一你的远程桌面管理

多协议远程连接管理工具mRemoteNG:告别混乱,统一你的远程桌面管理

多协议远程连接管理工具mRemoteNG&#xff1a;告别混乱&#xff0c;统一你的远程桌面管理 【免费下载链接】mRemoteNG mRemoteNG is the next generation of mRemote, open source, tabbed, multi-protocol, remote connections manager. 项目地址: https://gitcode.com/gh_m…

2026/7/6 0:03:39阅读更多 →
COUNT(DISTINCT) 与 GROUP BY 去重统计:5 亿数据量下的性能实测与选型指南

COUNT(DISTINCT) 与 GROUP BY 去重统计:5 亿数据量下的性能实测与选型指南

COUNT(DISTINCT) 与 GROUP BY 去重统计&#xff1a;5 亿数据量下的性能实测与选型指南在数据分析和处理领域&#xff0c;去重统计是最基础也是最频繁使用的操作之一。当数据量达到亿级规模时&#xff0c;不同的去重统计方法在性能上可能产生天壤之别。本文将基于 5 亿行数据的实…

2026/7/6 0:03:39阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时&#xff0c;发现推理速度只有可怜的 1-2 FPS&#xff0c;而别人的演示视频却能跑到 30 FPS 以上&#xff0c;那么问题很可能不在模型本身&#xff0c;而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后&#xff0c;会直接使用官方示例…

2026/7/6 4:45:01阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一&#xff1a;为什么你需要了解 Coze 和 Dify&#xff1f;如果你对 AI 应用开发感兴趣&#xff0c;但一看到“大模型”、“智能体”、“工作流”这些词就头疼&#xff0c;觉得门槛太高&#xff0c;那这篇文章就是为你准备的。很多开发者&#xff0c;包括我自己&#…

2026/7/6 4:45:01阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会&#xff1a;配图一直是个让人头疼的问题。2026年&#xff0c;AI生图工具已经非常成熟了&#xff0c;但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1&#xff1a;速度之王2026年6月11日&#xff0c…

2026/7/6 4:45:03阅读更多 →