
简介wx855 Windows/Linux启动部署资料包面向需要在双平台快速搭建服务的开发与运维人员解决部署配置、接口联调与排错等问题。压缩包合计40个文件整体约21.96MB包含可执行主程序、JSON/YAML配置、模板与HTML页面、前端静态资源、接口说明等多类文件其中Swagger调试页面和APIPost接口集合可直接用于接口验证PDF测试手册辅助排查启动问题。目前已有161人学习/下载。内容兼顾跨平台启动、目录结构梳理和常见错误定位资源内附有MySQL连接异常、登出报错截图及登录/错误模板便于对照界面快速排错微信849接口的APIPost v7/v8集合和Swagger UI资源则能显著降低联调门槛支持直接导入测试。典型场景包括首次部署、跨平台启动比对、服务配置修改和接口功能验证适合具备基础命令行操作经验的初中级后端或运维工程师。 玩过嵌入式开发板的朋友应该都有体会一块板子拿回来厂商默认只给一套Linux的烧录包跑起来倒是顺手但一旦客户或者项目需求里冒出“这板子能不能也启动Windows”这种话整个项目节奏就被打乱了。我这次手里的wx855就是这样本身是ARM架构的国产平台官方SDK和文档基本围绕Linux展开可在实际交付时现场偏偏要求Windows和Linux双系统都得能正常启动切换。折腾了几天把启动链路、固件烧录、UEFI引导、U-Boot菜单这些环节摸了一遍最后总算收尾。这篇文章不是官方文档的复述而是把我在wx855上从零折腾双系统启动的完整过程做个记录包括为什么Linux默认能启、Windows卡在哪个环节、怎么用U-Boot做双系统选择以及遇到启动失败时该怎么从日志反向定位。适合正在做ARM平台系统适配、或者被“Windows启动”需求折磨的工程师看入门的朋友也能从中了解整个启动链路的逻辑。1. wx855的启动链路与现状为什么Linux能启、Windows启不了1.1 SoC的启动顺序与boot source选择想搞懂wx855为什么“偏科”得先从它的启动链路说起。wx855这颗SoC默认的启动流程和大多数ARM平台一样芯片内部固化的一小段ROM代码先运行然后根据启动引脚的电平状态或烧录在OTP里的配置决定从哪个介质加载下一级引导程序。常见的启动源包括SD卡、eMMC、USB、UART、SPI NOR Flash和NAND。wx855的开发板一般会留一组拨码开关或者直接在PCB上标注了启动模式的选择焊盘有的板子甚至支持通过USB线进入MaskROM模式在这个模式下芯片内部的ROM会等待USB主机端发送烧录指令这时候才能用厂商提供的烧录工具把固件硬塞进去。这里有个关键的经验点很多人在wx855上折腾Windows启动失败并不是Windows镜像本身有问题而是板子根本没进入预期的启动介质。比如你明明把Windows引导盘做进了U盘结果启动引脚还停在eMMC模式那么上电后ROM直接跳去读eMMC里的U-BootU盘里的Windows安装程序再好也轮不到执行。1.2 Linux的启动链为什么顺畅Linux在wx855上能顺利起来是因为整个链条是被BSP团队完整打通的。SoC上电后ROM先加载U-BootU-Boot再引导内核和设备树最终挂载rootfs。完整链条如下ROM读取启动介质中的U-Boot二进制加载到片内SRAM并由U-Boot接管DDR初始化。U-Boot读取分区表中的boot.img包含内核Image与dtb将其加载到内存指定地址。内核启动后挂载rootfs分区执行init进程最终进入systemd。用户态服务网络、容器、SSH等依次拉起。wx855的官方SDK里U-Boot的bootcmd已经写好了从eMMC或SD卡加载内核的命令设备树里也把串口、网络、存储等外设描述清楚了所以只要烧录动作没出错Linux基本一路绿灯。1.3 Windows在ARM上的启动门槛Windows在ARM平台上的启动逻辑和Linux完全不同。它需要UEFI固件作为引导层通过UEFI Shell或Boot Manager加载bootmgfw.efi然后读取ACPI表来描述硬件资源。Linux的启动则不需要ACPI设备树就能完成同样的工作。wx855这个级别板卡的核心问题在于官方BSP默认可能只提供U-Boot加Linux内核的解决方案并不提供完整的EDK2/UEFI固件也没有针对这块板卡的ACPI表。没有UEFIWindows引导程序根本没有入口没有ACPI表Windows内核起来之后也不知道怎么去枚举内存、中断、定时器等硬件资源。我画过一张对比表能看懂这张表基本就理解了双系统启动要补哪些东西启动条件LinuxWindows引导程序入口U-BootUEFI固件硬件描述方式Device TreeACPI表驱动来源内核内置模块厂商BSP驱动包文件系统要求ext4等NTFS/FAT32启动介质限制低U-Boot可配置必须是FAT32/NTFS分区且需UEFI支持所以结论很清晰要把wx855变成能跑Windows的机器首先要解决UEFI固件问题其次要解决ACPI和驱动问题。很多号称“能启动Windows”的ARM板卡其实就是有人在U-Boot里做了一层模拟UEFI环境的兼容层把Windows安装程序骗过去后续再通过固定驱动包把硬件带起来。2. 环境准备清单固件、烧录工具与镜像选择2.1 固件分类与职责边界在动手之前先把所有涉及“启动”的固件和镜像分类理清楚这是整个双系统折腾过程中最容易混乱的地方。wx855这类板卡的固件大概分四类BootLoader固件U-Boot或UEFI负责初始化DDR、时钟加载后续系统。内核镜像与设备树Linux的Image、dtb文件或者Windows所需的EFI引导文件。根文件系统镜像Linux的rootfs.ext4、Windows的安装镜像WIM。附加驱动与固件外设固件Wi-Fi、蓝牙、GPU微码Windows需要的驱动inf和sys文件。这四类东西在烧录时可能被写进不同分区也可能捆绑在一个完整的烧录镜像里。wx855厂商发布的Linux烧录包通常是把U-Boot、Image、dtb、rootfs按固定偏移一次性写到eMMC里而Windows由于没有官方支持往往需要自己准备UEFI固件和驱动包。2.2 烧录工具的选择与实测wx855官方工具在不同阶段提供的烧录方式不太一样我实测比较好用的一共三种厂商GUI工具主要烧录出厂统一镜像界面友好适合初次烧录和救砖。输入输出都是整包不好做分区级微调但胜在稳定。fastboot如果U-Boot已经运行且支持fastboot命令可以通过fastboot烧录单独的boot.img或system.img适合不想擦除全部固件的情况。dd/balenaEtcher直接把整个镜像写到SD卡适合从SD卡启动的场景不需要厂商工具也能操作。我推荐先把调试串口线准备好wx855的调试串口通常是UART0波特率115200通过Type-C转串口模块接到电脑。整个排查过程中串口输出是判断启动进度的唯一可靠依据。2.3 镜像与驱动包的选择逻辑Linux侧镜像的选择优先匹配wx855官方SDK版本对应的内核分支不要用太新或者太旧的mainline内核。设备树差异可能导致网卡、显示等外设起不来排查起来费时费力。Windows侧如果厂商提供Windows BSP直接用对应版本的驱动包。如果没有官方支持就需要找同SoC平台通用的Windows on ARM驱动包或者从厂商提供的edk2仓库编译UEFI固件。编译好的UEFI固件一般写到SPI NOR Flash或作为U-Boot的启动子项加载。这里有一个容易踩的坑Windows镜像要选支持ARM64架构的版本常见的Windows 11 IoT Enterprise LTSC不要下成x64版ARM平台无法运行x64版本的Windows安装程序虽然Windows 11 ARM版内部可以跑x64模拟但安装引导本身必须是ARM64架构。2.4 烧录与启动前的基础检查在烧录任何系统之前先把以下信息确认好能省去后面不少麻烦板子当前处于哪种启动模式拨码开关位置是否和预期介质一致。eMMC和SD卡是否都插好Windows引导盘是否已经格式化为FAT32。串口线连接是否正常开机瞬间能否在终端里看到ROM和U-Boot输出。电源供应是否足够有些板卡在启动Windows ARM时瞬时功耗更高劣质电源会导致中途断电重启。这些基础检查看似琐碎但在双系统调试中非常关键。很多启动失败的问题根源其实不是软件而是硬件状态不对。3. Linux启动完整实操从烧录到进入用户态3.1 烧录Linux镜像到eMMC与SD卡wx855出厂时会预装一个Linux系统如果直接上电就能登录那说明U-Boot和Linux内核已经烧好在eMMC里。但如果需要重刷建议优先走SD卡启动因为SD卡的可重写性比eMMC好太多救砖也方便。SD卡启动的烧录方式最直接在电脑上执行sudo dd ifwx855-linux-sd.img of/dev/sdX bs4M statusprogress convfsync/dev/sdX要替换成实际SD卡设备名可以通过lsblk确认千万不要写错。烧完后把SD卡插回wx855调整启动拨码到SD卡模式上电后串口就能看到U-Boot从SD卡加载内核。eMMC烧录则需要厂商工具或者fastboot模式。进入fastboot模式的方式通常是用USB线连接板子按住板子上的某个功能键再上电或者通过U-Boot命令行执行fastboot usb 0。然后通过fastboot命令写入各分区sudo fastboot flash bootloader u-boot.bin sudo fastboot flash boot boot.img sudo fastboot flash rootfs rootfs.ext43.2 U-Boot环境变量和启动参数的设置逻辑U-Boot启动Linux依赖一组环境变量最核心的是bootcmd和bootargs。bootcmd告诉U-Boot“从哪加载内核”bootargs告诉内核“启动后怎么挂载根文件系统、日志输出到哪个设备”。在wx855上一个常见且稳定的bootargs配置如下setenv bootargs consolettyS0,115200 root/dev/mmcblk1p3 rw rootwait这段配置的含义是consolettyS0,115200内核日志输出到串口0波特率115200调试方便。root/dev/mmcblk1p3根文件系统在eMMC的第三个分区。rw以读写方式挂载根文件系统。rootwait内核等待根设备出现后再挂载避免SD卡初始化慢导致挂载失败。修改U-Boot环境后记得执行saveenv否则只能临时生效断电就丢。这个细节我一开始没注意调试时改了bootargs重新启动后发现还是旧参数浪费了不少时间。3.3 首次启动验证与卡顿判断烧录并设置好启动参数后上电观察串口输出正常流程会经历以下阶段U-Boot版本信息打印显示板型和DDR初始化结果。加载内核打印“Starting kernel ...”。内核启动出现大量硬件初始化日志。systemd启动出现“Reached target ...”。登录提示符出现或者DHCP分配IP成功。如果日志停在哪一步就意味着问题出在哪一层停在U-Boot启动早期可能是DDR初始化失败或启动介质没选对。停在“Starting kernel ...”之后无输出大概率是dtb与内核不匹配或者串口console参数错误。停在rootfs挂载报错说明root分区路径或文件系统类型不对。systemd阶段卡住通常是某个关键服务等待超时需要进一步看journal日志。3.4 开机自启动服务与容器配置wx855上Linux启动完成后很多实际项目还需要自动拉起业务服务比如启动容器、加载AI推理程序、设置网络等。systemd是推荐的做法的控制方式在/etc/systemd/system/下创建服务文件例如wx855-app.service[Unit] Descriptionwx855 Application Service Afternetwork-online.target Wantsnetwork-online.target [Service] Typesimple ExecStart/opt/wx855/start_app.sh Restartalways RestartSec3 [Install] WantedBymulti-user.target然后执行sudo systemctl daemon-reload sudo systemctl enable wx855-app.service sudo systemctl start wx855-app.serviceDocker容器方面如果板子内存和存储足够可以直接安装Docker并设置自启动sudo systemctl enable docker sudo systemctl start docker需要注意的是ARM平台上的容器镜像必须选arm64架构版本直接从x86服务器上拉镜像会执行失败。很多人在wx855上遇到容器启动失败基本是这个问题。4. Windows启动的实现路径UEFI引导与驱动补全4.1 获取或编译wx855的UEFI固件Windows ARM启动的第一个硬性条件就是UEFI固件。wx855如果官方没有提供现成UEFI常见做法是找同SoC平台的EDK2移植版本。在编译EDK2时平台包Platform Package里会指定SoC型号、内存大小、串口输出方式等。编译前需要安装完整的交叉编译环境Edk2的编译链比较繁琐但对熟悉Linux构建系统的开发者来说并不算难。编译产物中会包含一个FLASH或FV文件写到SPI Flash或者放到U-Boot能读取的介质上。如果不想烧SPI Flash也可以把UEFI固件放到FAT32格式的SD卡分区中通过U-Boot的go命令加载并跳转执行。这种方式的好处是调试方便坏处是每次启动都要人为干预不太适合长期使用。4.2 制作Windows ARM安装介质与分区布局UEFI固件能起来之后Windows安装介质的制作相对标准化。在电脑上准备一个FAT32格式的U盘将Windows ARM64的ISO解压进去即可。注意U盘分区必须是FAT32因为UEFI默认只支持从FAT32分区启动EFI文件。如果ISO文件超过4GB需要拆分install.wim或者改用exFAT后再用支持exFAT的UEFI固件驱动。启动介质准备完成后把U盘插入wx855进入UEFI的Boot Manager界面选择从USB设备启动。如果不出意外Windows安装程序会正常进入蓝色界面。如果卡在引导阶段或报错无法读取安装源需要检查UEFI固件中是否启用了USB设备支持。安装Windows时建议手动创建分区。一个典型的双系统分区方案如下EFI System PartitionESPFAT32存放Windows引导文件和后续Linux的GRUB引导文件。Windows系统分区NTFS安装Windows。Linux根分区ext4安装Linux。Linux Swap分区可选。4.3 驱动补全与设备管理器的排雷Windows装完后另一个大难题是驱动。wx855的绝大多数外设USB、SD卡、网卡、GPU在Windows下都没有现成驱动设备管理器里会有一堆“未知设备”。解决思路是获取SoC厂商的Windows BSP驱动包或者在EDK2的源码仓库中带上驱动模块重新编译UEFI。驱动补全的方法有两种在Windows PE环境下预先注入驱动用dism命令把驱动包添加到Windows镜像中。安装完成后在设备管理器里手动更新驱动或者用厂商提供的setup程序安装。如果一切顺利Windows至少能把串口、USB和网络跑起来。GPU和显示输出可能最麻烦没有驱动时Windows只能使用基础显示适配器分辨率低但系统能操作。4.4 无官方BSP时的替代思路如果wx855确实找不到可用的Windows BSP那“物理直接启动Windows”就不太划算了。我自己的替代思路有两个一是把重心放在Linux上通过QEMU/KVM虚机方式运行Windows ARM版性能损失虽然大但至少能跑通部分Windows应用。二是采用“远程Windows”的方案板子本身跑Linux需要Windows环境时通过网络连接另一台Windows主机的远程桌面或应用服务。这种方案对板子的性能要求低工程上最稳定。这两个方案虽然不是严格意义上的“本地启动Windows”但在交付项目中能满足业务需求才是最优先的。5. 双系统启动切换U-Boot菜单与分区管理5.1 为什么优先考虑U-Boot做启动菜单wx855如果Windows走的是UEFI引导、Linux走的是U-Boot引导那么需要有一个“启动管理器”在开机时决定进哪个系统。最直接的方法是把两个系统都纳入U-Boot的启动流程中。U-Boot本身支持多种启动协议除了直接加载Linux内核还可以通过efi命令加载UEFI应用。所以理论上可以让U-Boot先跑起来再通过菜单选择是去执行UEFI固件加载Windows还是直接加载Linux内核。这种方式的优点是不需要额外的GRUB依赖U-Boot自带的命令行足够灵活。缺点是需要手动写启动脚本和菜单环境变量对U-Boot不熟的人会有一定学习成本。5.2 编写U-Boot启动菜单脚本U-Boot的启动菜单基于bootmenu环境变量实现。在wx855的U-Boot控制台里可以这样设置setenv bootmenu_0 Boot Linuxrun boot_linux setenv bootmenu_1 Boot Windowsrun boot_windows setenv boot_linux load mmc 1:2 ${kernel_addr_r} /boot/Image; load mmc 1:2 ${fdt_addr_r} /boot/wx855.dtb; booti ${kernel_addr_r} - ${fdt_addr_r} setenv boot_windows load mmc 0:1 ${kernel_addr_r} /EFI/BOOT/BOOTAA64.EFI; bootefi ${kernel_addr_r} ${fdt_addr_r}保存后重启串口或者HDMI屏上会显示菜单通过按键选择。boot_windows里的BOOTAA64.EFI是ARM64架构下Windows引导文件的默认名称实际文件可能是bootmgfw.efi需要按路径调整。5.3 双系统的分区规划与边界防御双系统最容易互相破坏的地方是启动分区。Windows安装时可能会认为ESP分区是“空闲空间”然后重新格式化Linux的grub安装也可能会覆盖Windows的EFI启动项。我的建议是ESP分区单独划分容量至少512MBWindows和Linux都可以共用。安装Windows时用Windows安装器删除所有旧分区再手动重建确保ESP分区在最前面。安装Linux时选择“Manual partitioning”明确指定ESP分区的挂载点为/boot/efi。每次更新Windows或Linux内核后都需要重新检查启动管理器是否还能识别两个系统。如果出现Windows把Linux启动项覆盖的情况可以通过U-Boot的启动菜单直接绕过这也是为什么在wx855上我更推荐U-Boot而不是GRUB的原因——U-Boot的启动脚本相对独立不容易被系统里的更新工具破坏。5.4 时钟同步问题双系统启动还有一个容易被忽略的问题Linux默认把硬件RTC时间当作UTCWindows默认当作本地时间。如果两个系统共用一个RTC每次切换系统后时间都会错8小时。解决办法是在Linux里设置RTC为本地时间sudo timedatectl set-local-rtc 1或者把Windows设置为使用UTC时间但需要修改注册表操作繁琐。我一般推荐改Linux一条命令搞定后续两个系统的时间就能保持一致。6. 启动失败排查链路从串口日志到驱动层6.1 启动失败的第一现场串口日志无论是Linux还是Windows只要启动失败我第一件事就是接串口看日志。wx855的串口输出在正常情况下会在终端里持续滚动如果某处突然停止那行日志基本就是症结所在。Linux启动失败常见的日志现象Kernel panic - not syncing: VFS: Unable to mount root fsrootfs路径不对或者文件系统类型不支持。Failed to mount /etc/fstabfstab里引用了不存在的分区。Dependency failed for ...某个systemd服务依赖的服务没起来需要查看具体依赖链。Windows启动失败则往往表现为蓝屏错误INACCESSIBLE_BOOT_DEVICE大概率是存储驱动缺失UEFI固件和Windows之间没有正确的驱动层。卡在Windows Logo转圈可能是ACPI表错误或某个驱动超时。6.2 常见失败场景与对策我把这次调试中遇到的失败场景整理成了表格方便按图索骥现象可能原因解决方向U-Boot启动后无输出启动介质错误或DDR配置问题检查拨码开关与烧录介质U-Boot能找到内核但起不来dtb与内核版本不匹配调整设备树确认引脚复用正确Linux报rootfs挂载失败分区路径错误或rootfs损坏检查bootargs与lsblk分区表Windows蓝屏INACCESSIBLE_BOOT_DEVICE存储控制器驱动缺失注入SoC存储驱动到Windows镜像Windows启动后黑屏显示驱动或ACPI表问题用串口日志查看卡住位置更新UEFIDocker服务启动失败镜像架构不匹配或daemon配置错误检查镜像架构清理daemon.json6.3 日志分析与常用命令Linux环境下启动完成后通过journalctl查看系统服务启动情况journalctl -b -p err这个命令列出本次启动中所有错误级别的日志可以迅速定位是哪个服务出了问题。如果系统能进入命令行dmesg | grep error用来排查内核硬件报错也很有效。Windows环境下如果系统能进入桌面查看事件查看器-系统日志中的关键错误如果进不去系统则需要在WinPE中查看C:\Windows\INF\setupapi.dev.log这个文件记录了驱动安装的完整细节未知设备无法启动的原因在这里通常都有答案。6.4 保底手段SD卡救砖最后说一个很实用的保底手段。wx855整个eMMC被改得面目全非、系统完全起不来的时候SD卡救砖几乎是效率最高的方式。把一份已知可用的Linux完整镜像烧录到SD卡然后切换启动模式到SD卡启动。等系统起来后再用厂商工具或者dd命令把eMMC重新擦除烧录板子就满血复活了。这个操作我已经在wx855上做过两次第一次是因为Windows安装中途断电第二次是因为U-Boot环境变量被误删每次都是靠SD卡救回来的。写在后面这次在wx855上折腾Windows和Linux双系统启动最大的感受是ARM平台上的双系统本质上不是“装个系统”那么简单而是整个引导链路的兼容性问题。Linux能顺利启动是因为BSP团队把U-Boot、设备树、驱动全都打通了Windows要起来就得自己补上UEFI、ACPI、驱动这几块积木哪一块缺了系统就卡在哪一步。如果只是拿这块板子做Linux开发官方SDK完全够用真正要上Windows建议从一开始就确认厂商是否提供UEFI和BSP而不是像我这回一样装到一半才想办法。另一个小技巧是调试时一定要保留串口线按住启动模式切换的手势和拨码位置都要记录好关键时刻能快速救砖。希望这篇记录能帮到正在折腾同类ARM板卡启动问题的朋友。本文还有配套的精品资源点击获取