RISC-V开发板VisionFive 2 UEFI固件移植与启动实战指南

news2026/5/19 2:16:32
1. 项目概述当RISC-V单板机拥抱UEFI对于玩惯了x86平台或者树莓派的开发者来说给一块单板计算机SBC刷写固件、配置启动项可能已经轻车熟路。但当你把目光投向RISC-V架构特别是像赛昉科技的VisionFive 2昉·星光 2这样的高性能平台时整个生态的“玩法”会有些不同。最近赛昉科技官方宣布了一个对RISC-V生态颇具意义的进展VisionFive 2正式支持了基于TianoCore EDK II的UEFI固件。这不仅仅是多了一个启动选项那么简单它标志着RISC-V在向成熟、标准化的计算平台演进的道路上又迈出了坚实的一步。简单来说EDK II是英特尔主导的开源UEFI统一可扩展固件接口实现框架而UEFI则是现代计算机中用来替代传统BIOS的固件标准。过去像VisionFive 2这样的RISC-V开发板启动流程往往依赖于特定于板级的引导加载程序如U-Boot SPL配置相对底层和封闭。现在通过引入EDK II支持开发者可以在VisionFive 2上获得一个图形化或文本化的、标准化的固件配置界面能够以更灵活、更强大的方式管理硬件初始化、启动设备选择和操作系统加载。这对于希望将VisionFive 2用于更复杂应用场景如边缘服务器、工控设备或是追求更便捷开发体验的爱好者而言无疑是个重大利好。2. 核心需求解析为什么VisionFive 2需要UEFI在深入动手之前我们得先搞清楚给一块RISC-V开发板加上UEFI支持到底解决了哪些痛点又带来了哪些新的可能性。这不仅仅是“为了支持而支持”背后有清晰的工程逻辑和生态考量。2.1 超越传统引导加载程序的限制在EDK II支持之前VisionFive 2主要依赖U-Boot作为其引导加载程序。U-Boot功能强大、高度可定制是嵌入式领域的常青树。但对于一个旨在成为通用计算平台的SBC来说纯U-Boot方案存在一些体验上的门槛配置门槛高修改启动参数、调整硬件设置通常需要通过U-Boot命令行或修改源码、重新编译来完成对新手不够友好。缺乏标准化接口不同硬件厂商的U-Boot移植版本其命令和配置方式可能存在差异增加了系统集成和软件分发的复杂度。高级功能支持有限例如对于安全启动Secure Boot、网络引导PXE、或从NVMe等复杂存储设备启动在U-Boot上实现需要更多定制工作。UEFI/EDK II的引入正是为了建立一个跨平台、跨架构的标准固件接口。它定义了一套清晰的协议Protocols和驱动模型让操作系统和应用程序可以用统一的方式与固件交互无论底层是x86、ARM还是RISC-V。2.2 赋能更丰富的应用场景与开发体验VisionFive 2搭载了赛昉自研的JH7110四核RISC-V处理器性能足以支撑不少严肃的应用。EDK II的支持进一步释放了这块板子的潜力快速原型与部署通过UEFI Shell开发者可以像在PC上一样直接浏览文件系统、加载并启动不同的内核与initrd镜像极大加快了操作系统和应用的调试周期。灵活的存储启动官方已支持从SD卡、板载eMMC和QSPI闪存启动。EDK II的块设备驱动架构使得未来支持NVMe SSD、SATA硬盘等更高速的存储介质变得相对容易为需要大容量、高性能存储的应用铺平了道路。增强的系统管理为未来实现更完善的服务管理功能如远程固件更新、硬件健康监测提供了底层框架。这对于将VisionFive 2用于工业或商业产品至关重要。降低生态适配成本越来越多的操作系统如一些Linux发行版、BSD变种将UEFI作为标准启动环境。VisionFive 2支持EDK II后这些系统移植到该平台的难度会显著降低有利于吸引更广泛的软件生态。2.3 技术选型背后的考量为什么是EDK II在开源UEFI实现中EDK II是事实上的行业标准拥有最活跃的社区和最广泛的支持。赛昉选择基于EDK II进行移植而非从头造轮子是一个明智且务实的选择生态兼容性直接融入现有的TianoCore生态可以复用大量成熟的驱动和工具加速开发进程。社区支持遇到问题时有全球性的开发者社区和英特尔等大厂的支持作为后盾。长期维护性EDK II本身是持续演进的跟随上游更新可以持续获得安全补丁和新特性。RISC-V架构支持EDK II社区本身就在积极推进对RISC-V架构的支持赛昉的贡献可以回馈上游形成良性循环。3. 环境准备与资源获取在开始动手刷写或编译EDK II固件之前我们需要准备好必要的软件环境和硬件资源。整个过程在标准的Linux开发环境下进行对主机系统的要求并不高。3.1 硬件准备清单VisionFive 2开发板这是当然的主角。确保你手头的版本是Rev 1.2A或更高早期的工程板可能在硬件细节上有差异。MicroSD卡至少8GB容量Class 10或更高速度用于制作启动盘或存放固件。这是最常用的启动介质。USB转TTL串口调试板如CP2102、CH340等。这是与开发板UEFI/Shell交互的“眼睛”和“嘴巴”至关重要。你需要连接VisionFive 2的UART0通常是板载40针GPIO排针中的特定引脚到调试板。网线用于网络引导或系统安装后的网络配置。VisionFive 2的有线网卡在UEFI下通常可以被驱动。电源官方推荐的12V/2A DC电源。稳定的电源是确保刷写过程顺利的基础。主机电脑一台运行Linux如Ubuntu 20.04/22.04的x86或ARM电脑用于交叉编译和文件操作。3.2 软件与工具链安装在你的Linux主机上需要安装一系列编译和打包工具。以下命令基于Ubuntu/Debian系统sudo apt update sudo apt install -y git build-essential uuid-dev iasl nasm python3 \ gcc-riscv64-linux-gnu g-riscv64-linux-gnu \ device-tree-compiler mtools dosfstools关键组件说明build-essential,uuid-dev,iasl,nasm,python3: 编译EDK II及其工具链的基础依赖。gcc-riscv64-linux-gnu:RISC-V 64位交叉编译器。这是编译针对VisionFive 2RV64GC架构固件的核心工具。device-tree-compiler: 用于处理设备树Device Tree文件这是描述VisionFive 2硬件拓扑的关键。mtools,dosfstools: 用于创建和操作FAT文件系统镜像制作UEFI启动盘。3.3 获取官方源码与预编译固件赛昉科技已将相关代码和文档开源在GitHub上这是我们所有工作的起点。克隆EDK II仓库包含赛昉平台代码git clone --recursive https://github.com/starfive-tech/edk2.git cd edk2使用--recursive参数确保子模块如EDK II的核心库和驱动一并拉取。获取预编译固件快速体验 如果你不想经历漫长的编译过程或者只是想先验证功能可以直接从发布页面下载预编译好的固件镜像。 访问 https://github.com/starfive-tech/edk2/releases 找到最新的发布版本下载名为VisionFive2_UEFI_*.img.gz或类似的文件。解压后即可得到一个可以直接写入SD卡的镜像文件。查阅官方Wiki重要 赛昉维护的Wiki页面 https://github.com/starfive-tech/edk2/wiki 是最权威的参考。里面包含了构建指南、已知问题、更新日志等。在开始前和遇到问题时务必先浏览这里。注意开源社区的代码和文档更新可能非常频繁。在开始重要操作前建议先git pull更新代码库并再次查看Wiki页面确保你遵循的是最新的指南避免因版本差异导致操作失败。4. 构建与编译EDK II固件详解虽然可以直接使用预编译固件但理解并尝试自己编译一遍对于深度定制、问题排查和学习UEFI开发都大有裨益。这个过程能让你清晰地看到一个UEFI固件是如何从源码变成可启动镜像的。4.1 源码结构与构建系统初探进入克隆的edk2目录你会看到如下主要结构MdeModulePkg/,MdePkg/,StandaloneMmPkg/等这些是EDK II的核心包Packages包含了UEFI规范的基础实现、通用驱动和库。Platform/StarFive/这是赛昉科技的平台特定代码所在目录里面包含了VisionFive 2代号可能为“VisionFive2”或“JH7110”的硬件描述文件DSC/FDF、驱动和ACPI/设备树配置。BaseTools/EDK II的构建工具如编译器、链接器、镜像生成工具等。Conf/存放构建配置文件target.txt,tools_def.txt。EDK II使用一套基于Python和Makefile的构建系统。我们不需要直接调用复杂的命令而是通过设置环境变量和调用预设的构建脚本build来完成。4.2 配置与编译全流程以下是基于赛昉Wiki和实际验证的编译步骤初始化构建环境cd edk2 export WORKSPACE$PWD source edksetup.sh这个脚本会设置必要的环境变量并编译BaseTools。配置目标平台 编辑Conf/target.txt文件这是构建系统的“总指挥”。vi Conf/target.txt找到并修改以下几行关键配置ACTIVE_PLATFORM Platform/StarFive/VisionFive2/VisionFive2.dsc TARGET DEBUG # 或 RELEASE。DEBUG版本包含调试信息便于排查问题。 TARGET_ARCH RISCV64 TOOL_CHAIN_TAG GCC5 # 使用GCC工具链ACTIVE_PLATFORM指定了我们要构建哪个平台的固件这里指向VisionFive 2的描述文件.dsc。执行构建命令build这个命令会读取target.txt的配置开始漫长的编译过程。它会编译所有依赖的库和模块。编译VisionFive 2平台特定的驱动和代码。将编译出的EFI可执行文件.efi、驱动.efi和库链接成一个最终的固件镜像FV Firmware Volume。整个过程视主机性能可能需要10到30分钟。如果一切顺利编译产物将位于Build/VisionFive2/DEBUG_GCC5/FV/目录下。生成可刷写镜像 编译出的固件体积FV文件可能不适合直接写入存储设备。通常需要将其与第一阶段的引导代码例如针对RISC-V平台的OpenSBI打包并格式化为存储设备能识别的形式。 赛昉的构建脚本通常会生成一个最终的.img或.itb镜像文件。具体生成命令可能需要参考Platform/StarFive/VisionFive2/下的脚本或Wiki。一个常见的后续步骤是使用dd命令将固件写入SD卡的特定扇区。实操心得第一次编译很可能因为依赖缺失或环境变量问题失败。仔细阅读终端输出的第一条错误信息。常见的坑包括Python包缺失用pip install解决、交叉编译器路径不对确认riscv64-linux-gnu-gcc已安装且版本合适、或Conf/target.txt中路径拼写错误。编译时建议使用build -n $(nproc)来启用多核并行加速。4.3 关键文件与配置解析在编译过程中有几个文件扮演了核心角色VisionFive2.dsc(平台描述文件) 定义了本平台需要包含哪些模块驱动、库、应用以及它们的源码路径和依赖关系。你可以在这里添加或移除模块来定制固件功能。VisionFive2.fdf(固件描述文件) 定义了固件镜像的最终布局即各个模块在Flash或内存中的排列顺序。这决定了启动流程。DeviceTree文件 (.dts) 在Platform/StarFive/VisionFive2/下你会找到描述VisionFive 2硬件的设备树源文件。UEFI固件在启动初期会解析它来初始化硬件。任何重大的硬件变更如外设调整都可能需要同步修改此文件。理解这些文件是未来进行深度定制例如为特定外设添加UEFI驱动的基础。5. 固件刷写与启动实战拿到编译好的固件镜像或下载的预编译镜像后下一步就是将其部署到VisionFive 2上并成功启动。这是检验我们之前所有工作的关键时刻。5.1 制作UEFI启动SD卡我们假设你使用的是预编译的VisionFive2_UEFI_*.img文件。如果是自己编译的可能需要根据Wiki指引找到最终的镜像文件。识别SD卡设备 将SD卡插入主机使用lsblk或sudo fdisk -l命令确认SD卡对应的设备名例如/dev/sdb。请务必确认无误否则可能误格式化系统硬盘写入固件镜像# 假设镜像文件为 visionfive2_uefi.img SD卡为 /dev/sdb gunzip -c VisionFive2_UEFI_*.img.gz | sudo dd of/dev/sdb bs4M statusprogress oflagsync或者如果已经是.img文件sudo dd ifvisionfive2_uefi.img of/dev/sdb bs4M statusprogress oflagsyncoflagsync确保数据完全写入后再返回statusprogress显示写入进度。验证与扩展可选 写入完成后SD卡通常会被分成两个分区一个小的FAT32分区存放UEFI固件和启动文件和一个剩余空间。你可以用sudo fdisk -l /dev/sdb查看分区情况。如果需要使用剩余空间存放数据或安装系统可以用gparted等工具将其格式化为EXT4等文件系统。5.2 连接串口与上电启动连接串口线将USB转TTL调试板的GND接VisionFive 2的GND引脚。TX接开发板的UART0_RX(通常是GPIO引脚中的RX)。RX接开发板的UART0_TX(通常是GPIO引脚中的TX)。切勿接错VCC调试板与开发板之间只连接GND、TX、RX三根线。启动串口终端 在主机上使用screen、minicom或picocom连接串口。通常串口设备名为/dev/ttyUSB0波特率为115200。sudo picocom -b 115200 /dev/ttyUSB0上电与观察 将制作好的SD卡插入VisionFive 2连接好串口线最后接通电源。在串口终端中你应该会看到大量的启动日志输出。5.3 UEFI启动流程与Shell交互如果一切正常串口输出的日志会引导你进入UEFI的启动管理界面或直接进入UEFI Shell。典型的启动日志会显示第一阶段引导可能是芯片内置ROM代码或SPLSecondary Program Loader初始化DDR内存等最基础的硬件。加载OpenSBIRISC-V平台需要一个运行在M模式机器模式的监督程序OpenSBI负责接管硬件并提供S模式监督模式的服务UEFI通常运行在S模式。加载UEFI固件OpenSBI将控制权交给从SD卡加载的UEFI固件EDK II。UEFI初始化EDK II初始化CPU、内存、时钟、总线并加载其内置的驱动如SD卡、USB、网络驱动。启动管理器UEFI固件会尝试按照预设的启动顺序Boot Order寻找可启动的设备如包含EFI/BOOT/BOOTRISCV64.EFI文件的FAT分区。如果找到了可启动的EFI应用程序比如一个Linux内核的EFI存根或GRUB等引导程序就会执行它。如果没有或者你手动中断了启动过程例如在启动时按某个键你可能会进入UEFI Shell。UEFI Shell是一个功能强大的命令行环境。在这里你可以使用map命令查看所有被UEFI识别的存储设备如fs0:代表第一个FAT文件系统。使用ls、cd命令浏览文件系统。使用load命令加载内核镜像或直接使用boot命令启动。使用dmpstore查看或设置UEFI变量如启动顺序。运行其他.efi格式的应用程序。例如从Shell手动启动一个Linux内核可能像这样Shell fs0: # 切换到SD卡的FAT分区 fs0:\ ls # 查看文件 fs0:\ load vmlinuz-5.15.0-riscv64 # 加载内核 fs0:\ boot # 启动注意事项首次启动时UEFI可能会花较长时间进行硬件自检和驱动初始化串口输出可能看起来会“卡住”一会儿这是正常的请耐心等待。如果长时间超过2分钟无任何新输出可能是固件镜像不匹配或硬件连接有问题。6. 从UEFI启动Linux系统成功进入UEFI环境后我们的最终目标通常是启动一个完整的操作系统。这里有两种主流方式直接通过UEFI Shell手动启动或者配置UEFI启动管理器自动启动。6.1 准备可启动的Linux介质要让UEFI启动Linux你需要一个包含EFI可执行文件的启动介质。对于RISC-V架构这通常意味着使用支持EFI存根EFI Stub的内核现代Linux内核在编译时可以开启CONFIG_EFI_STUB选项使得内核本身就是一个EFI应用程序.efi文件。这样UEFI固件可以直接加载并执行内核无需额外的引导加载程序如GRUB。这是最简洁的方式。使用UEFI版的引导加载程序也可以使用支持UEFI的GRUB2 for RISC-V。GRUB会提供一个菜单界面再加载内核和initrd。操作步骤以使用EFI存根内核为例获取或编译内核从发行版仓库或自行编译获取一个开启了EFI存根支持的RISC-V内核镜像通常是vmlinuz-xxx或Image。同时准备好对应的初始内存盘initrd和根文件系统。组织文件在SD卡或eMMC的FAT分区即UEFI能识别的fs0:中创建标准的UEFI启动路径EFI/BOOT/。将内核镜像重命名为BOOTRISCV64.EFI并放入该目录。这是UEFI固件默认查找的路径和文件名。fs0:/ └── EFI/ └── BOOT/ └── BOOTRISCV64.EFI (实际是Linux内核)将initrd.img和根文件系统例如一个ext4格式的镜像文件也放在FAT分区的根目录或某个子目录下。准备内核命令行你需要告诉内核根文件系统在哪里。这可以通过在UEFI Shell中手动传递参数或者更优雅地使用一个UEFI启动项。6.2 配置UEFI启动项实现自动引导手动在Shell里敲命令启动太麻烦。UEFI提供了启动管理器Boot Manager来管理自动启动项。创建启动项 在UEFI Shell中可以使用bcfg命令来管理启动项。假设你的内核作为EFI文件在fs0:\EFI\BOOT\BOOTRISCV64.EFI并且需要传递内核参数root/dev/mmcblk0p2 ro consolettyS0,115200假设根文件系统在SD卡第二个分区。Shell bcfg boot add 0 fs0:\EFI\BOOT\BOOTRISCV64.EFI My RISC-V Linux这条命令添加了一个编号为0的启动项。设置内核参数 设置启动项参数稍微复杂一些因为bcfg命令可能不直接支持。一种常见做法是编辑一个文本文件如startup.nsh放在FAT分区根目录UEFI Shell启动时会自动执行它。在startup.nsh里写入启动命令fs0: load BOOTRISCV64.EFI root/dev/mmcblk0p2 ro consolettyS0,115200 boot另一种更标准的方法是使用UEFI启动变量。这需要更深入的操作通常由操作系统安装程序如Linux发行版的安装器来完成。它会调用UEFI运行时服务SetVariable来设置BootOrder和BootXXXX变量。设置启动顺序Shell bcfg boot mv 0 0 # 确保启动项0在首位如果已经是则不用 Shell bcfg boot order 0 # 将启动项0设为第一启动顺序重启后UEFI应该会自动尝试从你设置的启动项启动。实操心得在VisionFive 2的早期EDK II支持中自动启动功能可能还不完善。startup.nsh脚本是一个可靠的后备方案。另外内核命令行参数中的consolettyS0,115200至关重要它确保内核的日志输出到串口否则你将看不到任何启动信息屏幕一片漆黑。根设备root的指定也要准确需要根据你的SD卡分区实际情况调整可能是/dev/mmcblk0p3等。7. 深度探索UEFI驱动与设备树要让VisionFive 2上的UEFI真正好用离不开对硬件的完善支持。这主要依靠两样东西UEFI驱动和设备树Device Tree。7.1 UEFI驱动模型简介与操作系统类似UEFI也有自己的驱动模型。在EDK II中驱动通常以EFI_DRIVER_BINDING_PROTOCOL的形式存在。当一个设备被枚举时例如PCIe设备、USB控制器UEFI会遍历所有已安装的驱动尝试用其Supported()和Start()函数来匹配并初始化该设备。对于VisionFive 2赛昉需要为其各种外设提供或适配UEFI驱动例如GPIO驱动用于控制LED、按钮等。SD/MMC驱动用于访问SD卡和eMMC存储。Ethernet驱动用于网络引导PXE和网络访问。USB驱动支持USB键盘、鼠标、存储设备。显示驱动为HDMI输出提供GOPGraphics Output Protocol支持以实现图形化配置界面。这些驱动源码通常位于Platform/StarFive/VisionFive2/Drivers/或EmbeddedPkg/Drivers/等目录下。编译时它们会被链接进固件。7.2 设备树在RISC-V UEFI中的关键作用在RISC-V和ARM这类非PC架构中硬件描述通常不通过BIOS Int调用或ACPI表而是通过设备树Device Tree。一个.dts文件以文本形式描述了CPU、内存、总线、外设的拓扑结构和基本属性。在VisionFive 2的UEFI启动流程中最开始的引导代码可能来自芯片ROM或SPL会加载一个基础的设备树到内存。UEFI固件启动后会从特定地址获取这个设备树。UEFI的DtPlatformDxe之类的驱动会解析这份设备树。解析出的设备节点信息会被转换成UEFI内部的EFI_DEVICE_PATH_PROTOCOL和HANDLE进而被相应的UEFI驱动识别和绑定。这意味着如果设备树描述不准确或缺失对应的硬件在UEFI下就无法工作。例如如果设备树里没有正确描述以太网控制器的寄存器地址和中断号UEFI的网络驱动就无法初始化网卡。赛昉提供的源码中设备树文件通常位于Platform/StarFive/VisionFive2/Fdt/目录。开发者如果自行修改了硬件比如通过扩展板添加了新的I2C设备可能需要同步更新这个设备树文件并重新编译固件UEFI才能识别新硬件。7.3 查看与调试硬件信息在UEFI Shell中有一些命令可以帮助你诊断硬件状态devtree以树状图形式显示UEFI枚举到的设备句柄Handle及其上安装的协议Protocol。这是查看驱动是否成功加载的利器。dmem查看内存内容可用于高级调试。drivers列出所有已加载的UEFI驱动。通过观察devtree的输出你可以验证SD卡控制器、USB主机控制器、网络控制器等是否被正确识别并绑定了驱动。如果某个设备缺失很可能是因为缺少驱动或设备树描述有问题。8. 常见问题与排查技巧实录在实际操作中你几乎一定会遇到各种问题。以下是我在折腾VisionFive 2 UEFI过程中遇到的一些典型情况及解决方法希望能帮你少走弯路。8.1 编译与构建问题问题1编译时出现“未找到交叉编译器”错误。现象build命令早期报错提示找不到riscv64-linux-gnu-gcc。排查执行riscv64-linux-gnu-gcc --version确认是否安装。如果已安装但找不到可能是路径问题。检查Conf/tools_def.txt中RISCV64_GCC5_*_PREFIX的定义或者直接在你的shell环境中export交叉编译器的路径。解决确保使用sudo apt install gcc-riscv64-linux-gnu安装的是64位版本RV64GC。有时包名可能略有不同。问题2编译某个模块时出现“未定义的引用”错误。现象链接阶段失败报错undefined reference to ‘XXX’。排查这通常是模块依赖关系未正确配置或者某个库的编译选项不匹配。解决首先清理构建目录rm -rf Build然后重新source edksetup.sh和build。如果问题依旧检查VisionFive2.dsc文件中出错的模块是否在[Components]部分被正确包含以及其[LibraryClasses]部分是否列出了所有依赖的库。对比官方仓库的最新版本看是否有遗漏。8.2 启动与运行问题问题3上电后串口无任何输出。现象电源灯亮但串口终端一片空白。排查步骤检查硬件连接确认串口线的TX/RX是否接反开发板的TX接调试板的RX开发板的RX接调试板的TX。确认地线GND已连接。确认调试板本身工作正常可以接其他设备测试。检查串口终端配置确认波特率是115200数据位8停止位1无奇偶校验无流控。确认选择的串口设备文件正确如/dev/ttyUSB0或/dev/ttyACM0。检查固件镜像确认写入SD卡的镜像是否正确、完整。可以尝试重新下载或编译并用sha256sum校验。尝试换一张SD卡。检查开发板版本确认你的VisionFive 2硬件版本与固件兼容。早期版本如Rev 1.0/1.1可能需要不同的设备树或初始化代码。问题4启动卡在“Loading OpenSBI”或“Jumping to UEFI”之前。现象有少量输出然后停止。排查这通常说明第一阶段的引导程序SPL能运行但加载或跳转到下一阶段OpenSBI或UEFI时失败。解决最可能的原因是固件镜像的布局与硬件期望的不匹配。确保你使用的固件生成脚本或预编译镜像与你的板子匹配。仔细阅读Wiki中关于不同硬件版本如是否有SPI Flash的说明。有时需要调整加载地址。问题5进入UEFI Shell后找不到存储设备map命令无输出或没有fs0:。现象Shell可以进入但map显示没有文件系统设备。排查这说明SD卡或eMMC的驱动没有成功加载。可能的原因驱动未编译进固件确认你编译或使用的固件包含了SD/MMC控制器驱动如SdMmcPciHcDxe或平台特定的驱动。设备树问题设备树中关于SD/MMC控制器的节点描述可能有误导致驱动无法绑定。硬件问题SD卡接触不良或损坏。解决在UEFI Shell中运行devtree查看是否有关于MMC或SDHCI的设备句柄。如果没有基本可以确定是驱动或设备树问题。尝试使用官方最新的预编译镜像进行对比测试。问题6从UEFI启动Linux内核时内核panic或无法挂载根文件系统。现象内核开始加载但随后报错崩溃。排查检查内核命令行通过串口日志确认内核收到的命令行参数是否正确。特别是root参数指定的设备节点必须存在且包含有效的根文件系统。在UEFI Shell中可以用ls命令查看分区情况来确认。检查initrd如果使用了initrd确保它被正确加载且版本与内核匹配。检查内核兼容性确保你使用的Linux内核版本支持VisionFive 2的SoCJH7110并且包含了必要的驱动如SD卡、USB、以太网等。最好使用赛昉官方维护或验证过的内核。检查文件系统确认根文件系统镜像本身是完整且可用的。可以尝试在主机上挂载检查。8.3 高级调试技巧启用更详细的日志在编译EDK II时使用DEBUG目标TARGET DEBUG会包含大量调试信息。在串口输出中关注以DEBUG开头的行它们能提供非常详细的执行流程和错误位置。使用QEMU模拟器在真正烧录到硬件之前可以尝试在QEMU的RISC-V虚拟机上运行你编译的UEFI固件。这能快速验证编译产物是否基本正确避免反复烧写SD卡。赛昉的EDK II仓库可能提供了QEMU的运行脚本。对比官方预编译镜像当自己编译的固件出现问题时先用官方预编译镜像测试。如果能成功启动那么问题就出在你的编译环境或配置上。如果官方镜像也有问题那很可能是硬件或基础环境如SD卡、电源的问题。折腾UEFI固件是一个深入理解计算机启动过程和硬件软件交互的绝佳机会。对于VisionFive 2这样的RISC-V平台每一次成功的启动都意味着向一个更开放、更标准的计算生态又靠近了一步。虽然过程中难免踩坑但解决问题的成就感以及获得的对底层技术的掌控感正是开发者乐趣的来源。希望这篇长文能成为你探索VisionFive 2 UEFI世界的一块有用的垫脚石。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2623563.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…