UEFI Shell加载EFI应用程序的三种方式与实战踩坑记录
做固件开发这些年我有一半的调试时间都是在UEFI Shell里度过的。系统还没起来、Windows和Linux都进不去的时候Shell是唯一还能交互的环境。你可能以为在Shell里加载一个标准应用程序就是敲个文件名回车那么简单但实际情况远比这个“简单动作”复杂镜像格式对不对、文件放在什么文件系统上、加载器和被加载程序之间如何传递数据、加载失败后怎么定位问题每一样都能把人卡住半天。这篇就把我在Shell下加载标准EFI应用程序的完整经验写出来从环境准备到三种加载方式再到踩过的坑尽量一次讲透。1. 为什么要在Shell里加载应用先把环境和概念对齐1.1 Shell到底是一个什么样的环境UEFI Shell本质上也是一个EFI应用程序只不过它提供的是命令行解释能力。固件完成基础初始化之后如果找不到可启动的操作系统或者用户在启动菜单里主动选择进入Shell固件就会加载并执行Shell这个应用然后屏幕上出现一个Shell提示符。这个提示符背后的环境非常特殊它运行在操作系统内核加载之前所以你能直接访问固件暴露的所有Boot Services和Runtime Services。说得直白一点在这里你能直接读写内存映射、访问PCI设备配置空间、操作NVRAM变量、读取SMBIOS信息而这些能力在已经启动的操作系统里往往需要驱动和特殊权限才能碰。这也是为什么Shell常被叫做“固件界的DOS”但它的能力比DOS要底层得多。也因为Shell本身只是一个普通应用它加载其他应用时走的是UEFI规范定义的LoadImage和StartImage这两条核心服务。这意味着你在Shell里运行一个.efi程序和操作系统引导器加载一个EFI应用底层机制是一致的。搞懂Shell下的加载过程等于搞懂了整个UEFI启动链条的一个关键截面。1.2 “标准应用程序”和脚本、驱动的区别很多人把“.efi文件”都叫驱动这是最常见的误解。UEFI规范把可执行镜像分成好几种类型其中和我们这次主题直接相关的是标准应用程序。判断一个镜像是“标准应用程序”核心看PE32镜像头里的Subsystem字段。如果这个值是EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION数值是10那它就是标准应用程序。Shell脚本.nsh文件不是可执行镜像它只是一堆命令文本由Shell逐行解释。UEFI驱动则是另一个类型入口点返回后镜像往往要继续驻留内存向系统注册Protocol或者在设备匹配时执行绑定操作。这三种东西的区别我经常用一个类比标准应用是“临时过来干活的工人”干完活就离开驱动是“常住设备管理员”负责管理某个硬件并为其他程序提供服务脚本则是“写在纸条上的指令清单”Shell照着执行本身没有被加载成镜像。加载方式也不同脚本用start或直接执行路径就能跑驱动通常用load命令而标准应用可以同时被load、start和直接路径调用。1.3 什么场景需要用到Shell加载应用Shell下加载标准应用程序不是给人炫技用的我正在做的几个项目里它几乎是不可替代的环节。最典型的是固件调试。设备起不来系统或者新硬件初始化出了奇怪的问题我要在Shell里加载一个自写的硬件诊断工具直接枚举PCI设备、读取内存映射、检查某个Protocol是否安装成功。这类工具做成标准EFI应用编译出.efi文件扔到FAT分区里然后Shell加载执行是最快的验证路径。其次是产线测试和现场维护。很多工控设备没有完整的操作系统或者操作系统损坏到无法进入这时候在Shell里加载内存压测程序、固件升级校验程序、NVRAM读写工具能完成绝大部分故障定位。我还在部分设备遇到过需要临时加载一个文件系统驱动才能访问特定存储介质的情况这个时候就是要通过load把驱动型EFI镜像加载进来。2. 加载一个标准应用前需要准备什么2.1 推荐用虚拟机搭建一个零风险的试验环境在真实主板上反复加载调试用的EFI应用是有风险的尤其是不小心通过Shell写坏了NVRAM变量轻则启动项混乱重则设备无法引导。我在实际工作中养成的习惯是先用虚拟机搭一套和真实固件行为足够接近的模拟环境把程序行为验证清楚了再上真实硬件。虚拟机部分不需要太复杂用常见的开源虚拟机配合一套支持UEFI引导的开源固件镜像即可。这套固件镜像很多平台下被称作OVMF已经内置或支持加载UEFI Shell加载标准EFI应用的路径和真实主板上的行为非常接近。比起直接在机器上试虚拟机的好处很明显固件镜像损坏了随时重新创建虚拟磁盘里放了什么工具心里有数还能随时截取启动阶段的日志。我以前吃过亏在真实板子上想加载一个没有处理好的驱动结果设备直接死机只能清空CMOS才恢复。从那以后所有需要加载的EFI镜像我都会先在虚拟机里过一遍确认不会导致固件卡死再拿到板子上用。2.2 写一个最简单的标准EFI应用为了清晰演示加载过程准备一个非常简单的EFI应用程序就够了。它不依赖任何第三方库只调用UEFI规范提供的标准接口在屏幕上输出一段话然后返回成功状态。核心代码大概长这样#include Uefi.h EFI_STATUS EFIAPI UefiEntryPoint( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { SystemTable-ConOut-OutputString(SystemTable-ConOut, LHello from EFI Application\r\n); return EFI_SUCCESS; }注意这个入口函数它接收两个参数ImageHandle是当前加载镜像的句柄SystemTable是系统表指针。所有UEFI应用的标准入口都是这个签名这一点和普通Linux/Windows程序完全不同也是很多人第一次写EFI应用时最容易懵的地方。编译这类应用有两种常见路径一是用专门的开源固件开发环境EDK2二是用更轻量的GNU-EFI。我在做快速验证时更常用GNU-EFI因为它能直接借助已有的交叉编译工具链几分钟就能生成.efi文件。编译完之后用objdump -x看输出文件的头部确认Subsystem字段是10就能确定它被识别为标准的EFI应用程序可以被Shell正常加载。还有一个必须检查的点镜像架构要和Shell所在平台一致。在X64的Shell里只能直接加载X64架构的应用如果你把一个IA32的EFI应用扔进X64 Shell加载会直接失败。ARM平台同理对应架构的Shell加载对应架构的应用。2.3 应用要放到Shell能访问的文件系统里Shell要加载一个应用程序前提是先能访问到存放应用程序的存储介质。UEFI规范强制要求固件支持FAT文件系统所以最常见的做法是把.efi文件放在FAT32分区里再把这块分区通过平台映射给Shell。我在实验里会准备一块小容量的虚拟磁盘镜像格式化成FAT32分区然后在里面建一个\EFI\Tools目录把编译出来的程序复制进去。这样做的原因是标准且通用在真实设备上UEFI的启动分区ESP分区默认就是FAT格式你这个工具将来放进任何机器的ESP分区都能被识别。需要注意分区表类型。现在的大部分固件对GPT分区表的支持更完备ESP分区被识别并映射成fs0:这类盘符的成功率更高。如果用老式MBR分区表部分固件也能识别但在混合分区表或特殊布局下容易出幺蛾子我在某块主板上就遇到过MBR格式的FAT分区怎么map -r都刷不出来的情况换成GPT后一次通过。2.4 进入Shell的几种常见姿势准备就绪后进入Shell有几种常见方法。第一种是固件内置Shell部分开发主板和开源固件镜像会在启动菜单里直接提供一个“EFI Internal Shell”的选项选中就进入。第二种是把Shell的.efi文件放在启动介质上再在固件中通过“从文件启动”功能手动加载它。第三种是通过启动脚本自动进入如果EFI分区根目录下存在一个叫startup.nsh的脚本Shell启动时会自动执行里面的命令因此你可以在脚本里放一行命令用来加载你的应用程序实现开机自动运行工具。在实际调试场景里我更喜欢第一种或者第二种因为交互性更强可以先手动执行map、ls这些命令确认环境状态再决定下一步怎么操作。自动脚本适合产线或现场重复性测试不适合前期排障。3. Shell下加载标准应用的三种实操方式3.1 方式一直接输入路径运行最符合直觉进入Shell之后第一步通常是刷新文件系统映射。设备上可能接了多个磁盘、U盘、光驱Shell并不一定在启动时把全部文件系统都正确识别出来。手工敲一下map -r这个命令会让Shell重新扫描所有可访问的设备并为每个文件系统分配盘符比如fs0:、fs1:。盘符定了之后切到对应文件系统fs0:这里需要注意fs0:后面的冒号不能丢而且要按下回车。这个行为和当年DOS下切换盘符几乎一样。切换成功后提示符前面的内容会变成fs0:\说明当前目录已经落在该分区的根目录上。接下来就可以用ls查看目录内容ls EFI\Tools确认Hello.efi在那个目录里之后直接敲相对路径或者绝对路径就能运行EFI\Tools\Hello.efiShell收到这个命令后会调用LoadImage把镜像加载进内存然后调用StartImage启动它应用入口函数被执行屏幕输出Hello from EFI Application。整个过程顺畅的话看到那行输出你就已经完成了第一个标准EFI应用的加载和运行。如果需要给应用传递参数直接把参数跟在文件路径后面即可EFI\Tools\Hello.efi -v应用内部可以通过UEFI规范中的Shell参数协议拿到这些命令行参数具体怎么取后面再展开。3.2 方式二用load命令加载适合驱动和常驻镜像直接运行方式适合干完就走的一次性应用但有些场景需要把镜像加载进内存并得到一个句柄方便后续跟踪。这时候用load命令更合适。命令格式是load fs0:\EFI\Tools\Hello.efiload和直接运行最大的区别是它更强调“加载”这个动作。执行成功后Shell会返回一个镜像句柄。通过这个句柄可以用dh命令去查看该镜像的相关信息dh -d 12这里的12是load返回的句柄编号-d参数让Shell去打印这个句柄对应的设备路径和加载状态。如果你的目标是加载一个UEFI驱动比如某个NVMe控制器驱动或者文件系统驱动load就是标准操作。驱动被加载后Shell还会自动尝试连接相应的Controller驱动入口点注册的Protocol开始发挥作用。同一类工作如果用直接运行方式执行往往得不到这样的效果因为直接运行更偏向“跑一次程序就结束”的语义。有一点要提醒不同版本Shell对load之后的行为处理有细微差异。有的Shell在加载应用后并不会自动启动它这时候你需要再用start命令或者通过句柄操作来触发运行。我在调试某块主板的Shell环境时就碰过这个问题最后还是靠查询对应Shell版本的帮助文本解决了。如果你发现load之后屏幕上没有任何输出不要急着判断应用有问题先确认一下当前Shell对load的语义是“仅加载”还是“加载并启动”。3.3 方式三用start命令显式启动并传递参数start命令是另一个专门用于启动应用的入口。它和直接输入路径执行在多数情况下效果类似但语义更明确加载镜像并启动它而且支持更规范的参数传递方式。start fs0:\EFI\Tools\Hello.efi HelloArg在某些Shell环境里直接输入路径运行时如果路径中带有空格或特殊字符解析会出问题而start命令对参数的处理更稳妥。另外start也可以用来执行.nsh脚本算是一个多面手。我在需要把“加载应用”和“检查它的返回状态”作为一个明确步骤写入自动化脚本时习惯使用start。比如在startup.nsh里start fs0:\EFI\Tools\diag.efi -fulltest if %lasterror% neq 0 then echo diag failed endif这里的%lasterror%是Shell提供的一个环境变量用来获取上一个命令的返回值。应用入口点返回什么状态码Shell就会把它记录在这个变量里。这样就能在脚本里做条件分支实现简单的自动化测试这些都是直接运行方式也能做但写起来不够清晰的事情。3.4 加载之后如何确认应用真的跑起来了加载一个应用后除了看它有没有打印输出还有几个手段可以确认它确实作为镜像存在于系统中的合适生命周期里。最常用的是内存映射命令。输入memmapShell会打印当前内存图。如果你的应用在运行过程中动态分配了内存这里能看到相应区域。不过对单次执行的应用等它返回后相关内存可能已经被回收这个手段更适合调试常驻型程序。再就是刚才提到的dh命令。它能列出当前存在的所有句柄其中包含镜像句柄。通过dh -d handle能看到该镜像的加载路径、设备路径等详细信息这在调试“应用到底加载到没有”时非常有效。我自己常用的一个组合是先用load加载再执行dh找到新出现的句柄然后针对这个句柄执行dh -d查看详情。这一套在加载驱动时尤其有用可以确认驱动是否成功安装、关联了哪个设备。如果应用已经通过直接运行方式跑完并退出镜像句柄往往已经被销毁掉你就看不到它了这是正常现象。4. 加载标准应用时最容易踩的坑4.1 文件看不见、路径对不上文件系统相关的坑现象设备明明插了U盘分区里也确实放着.efi文件但Shell里输入ls就是找不到或者map之后根本没有新的盘符出现。原因这类问题多发于分区表格式和文件系统类型不匹配。UEFI标准要求的文件系统是FAT12/FAT16/FAT32如果U盘被格式化成了NTFS或exFAT绝大多数固件的Shell根本识别不了。另外新分区的盘符不会自动出现必须执行map -r重新扫描。排查顺序可以固定为先map -r刷新映射再用map查看所有盘符接着切换到对应盘符用dir或者ls查看根目录。如果盘符根本没出现就要回到分区表问题上去检查看分区类型是否是GPT或MBR可识别的FAT分区。路径分隔符也是个经典坑。UEFI Shell使用反斜杠\作为目录分隔符这和Windows类似但同时很多命令也接受正斜杠/。问题在于如果你习惯性地写成了Linux风格的/EFI/Tools/Hello.efi部分Shell实现会试着把它当成绝对路径从根目录找结果却找不到文件。我现在的习惯是统一写成反斜杠形式减少不必要的麻烦。4.2 加载失败、无输出、直接死机镜像本身的问题现象文件路径没问题也能定位到.efi文件但执行时报错或者屏幕上什么都没有甚至整个Shell直接重启。原因绝大多数情况下是镜像格式或者入口点不符合规范。先确认子系统类型。如果编译出来的是EFI_IMAGE_SUBSYSTEM_EFI_DRIVER而不是EFI_IMAGE_SUBSYSTEM_EFI_APPLICATIONShell会认为它不是一个标准应用程序直接执行的语义就不对。用objdump -x检查PE头里的Subsystem字段能快速判定问题。再看架构匹配。X64的Shell加载X64应用没问题但如果你交叉编译时指定了IA32目标然后拿到X64的Shell里跑就会报“不支持的镜像类型”。这也是开发环境里非常常见的错误。还有一个隐蔽的坑是入口点调用约定。UEFI在X64平台上使用的是Microsoft x64调用约定如果你的代码没有正确声明EFIAPI编译器默认用了其他调用约定那么入口点一执行就可能导致参数错乱、栈不对齐表现为Shell瞬间卡死或者重启。这个问题在从ARM交叉编译环境迁移到X64平台时特别容易出现。我之前写过一个快速内存读写工具编译后在自己的X64测试平台跑得好好的换到另一台机器上就无输出。排查了很久最后发现是那台机器固件的Shell版本比较老对某些PE格式特性的支持不完全。所以在测试新工具时最好在不同固件版本上都过一遍不要只看一个平台的表现。4.3 Secure Boot和安全策略拦截现在越来越多的设备默认开启Secure Boot。Secure Boot的本质是只允许加载带有合法签名的EFI镜像如果你自己编译的应用没有进过签名白名单Shell加载时会被固件拒绝。现象非常直接加载命令执行后报一个安全策略错误或者屏幕提示镜像校验失败。这时候不要试图通过Shell参数绕过没有意义。合规的做法有两种一是临时进入固件设置关闭Secure Boot开发和测试阶段常用二是将应用签名加入固件的签名数据库。后者的操作链条要复杂一些通常需要自签证书配合固件里的签名管理功能。我在某台商用设备的调试中因为忽略了这个环节整整耗了半天。从那以后我拿到一台新设备的第一件事就是先确认固件Secure Boot状态这能帮你省下大量无意义的排查时间。4.4 Shell版本差异不是所有Shell都一样UEFI Shell有不同的版本实现常见的有Shell 2.0和基于其他项目衍生的Shell版本。不同版本对命令参数、环境变量、脚本语法甚至load命令语义的支持都有差异。一个很实际的例子是alias命令。在Shell 2.0里alias可以把常用命令映射成短命令非常方便。但在某些精简版的Shell里alias的持久化行为不同重启后就没有了。又比如pci命令有的Shell版本提供完整的PCI设备枚举和配置空间读取能力有的版本则只是简单输出列表甚至可能不存在这个命令。我的建议是准备一个自己手头最熟悉的Shell版本把它放到启动介质中固定使用而不是依赖机器内置的Shell版本。这样做的好处是你在虚拟机上验证过的所有命令行为到了真实设备上依然成立不会因为Shell实现差异导致误判。5. 加载失败的快速排查清单和深度排查思路5.1 高频问题速查表下面这张表是我在实际调试里沉淀下来的排查顺序每一个问题都对应至少一次真实踩坑。你可以直接截图保存遇到加载问题时按表格顺序逐项排查。症状大概率原因处理思路map看不到盘符分区未格式化FAT / 分区表不被固件识别重新格式化为FAT32使用GPT分区表路径正确但显示文件不存在路径分隔符错误 / 目录层级不对检查反斜杠与绝对路径写法加载报非EFI应用Subsystem类型是驱动而非应用检查PE头Subsystem字段重新编译加载即重启或卡死入口点调用约定错误 / 架构不匹配检查EFIAPI声明确认X64匹配X64提示签名校验失败Secure Boot拦截关闭Secure Boot或签名镜像应用无输出Shell版本load语义差异 / 入口点崩溃改用直接路径运行或start加调试打印返回错误但无详细信息镜像依赖库未静态链接确认链接时使用静态方式脚本自动加载失败startup.nsh路径不在根目录将脚本放在ESP分区根目录5.2 深度排查打开疯背后的日志快速排查无效时就要往更深一层走。我的习惯是在应用入口点的最前面加一个SystemTable-ConOut-OutputString打印确保应用只要有幸加载并启动就必然留下痕迹。如果连这个打印都没有出现那基本确定镜像没有被加载或加载过程在入口点执行之前就失败了。另一个思路是利用Shell自身的调试能力。部分Shell版本支持输出详细加载过程比如load -nc可能涉及不连接控制器的处理方式或者通过设置特定环境变量打开更大的输出。这些能力不同版本差异很大我在遇到顽固问题时会直接在Shell里敲help查看当前版本支持的全部命令和参数往往能发现平时没注意到的开关。内存视角也很重要。加载应用前先执行一次memmap记录内存分布加载失败后再执行memmap对比差异。虽然这不能直接告诉你失败原因但能帮你判断加载过程到底推进到了哪一步是镜像文件读取失败还是镜像初始化时崩溃。5.3 几个值得长期坚持的实验习惯经常在Shell里加载应用之后我总结了几个非常实用的日常习惯。第一所有自研工具统一放到\EFI\Tools目录下不要散落在根目录或者和驱动混在一起。Shell脚本也好EFI应用也好统一目录便于快速定位和维护。真实设备的ESP分区本来就包含\EFI\Boot、\EFI\Microsoft这些系统目录自研工具集中存放避免误操作。第二常备一个U盘和一个镜像文件各自维护一份完整的Shell环境和工具链。U盘对应真实设备的维护场景镜像文件对应虚拟机调试场景。两边保持同步可以保证“虚拟机跑通了真机大概率也能跑”。第三每次加载一个不熟悉的第三方EFI应用之前先查看它的编译信息和依赖情况。用objdump -x file.efi查看它的头信息确认识别为EFI Application再进入加载流程能避免大量不清不楚的失败。第四维护一个属于你自己的startup.nsh。不要把启动脚本做成花哨的菜单就放最常用的命令map -r、进入fs0:、cd \EFI\Tools、加载日志工具。固定的启动顺序能大幅缩短每次进Shell后的准备时间。6. 再往前一步Shell加载之外还有哪些可以扩展Shell里能加载标准应用程序本质上是因为Shell能调用UEFI的启动服务。一旦理解了这一层你就能举一反三做很多比“运行HelloWorld”更有价值的事情。我自己常用的是通过Shell给EFI应用传参做自动化测试。应用的入口点可以通过SystemTable去拿Shell提供的参数协议拿到命令行字符串后解析就能实现一个工具支持多种测试模式。比如同一个内存诊断程序传入-quick做快速冒烟测试传入-full做完整跑测这比维护多个独立工具高效得多。再就是通过Shell应用修改NVRAM变量。我写过一个小的EFI工具用来批量设置和导出设备的启动项和固件配置项。用Shell加载这个工具后工具内通过gRT-SetVariable和gRT-GetVariable直接读写NVRAM。直接在Shell里用环境变量做不到这么细粒度的控制所以这类需求必须用标准EFI应用来完成。还有一类很实用的扩展是加载Shell扩展协议相关的工具比如读取启动日志、导出HOB列表、抓取ACPI表。这些工具做出来后你在Shell环境里的调试能力会上升一个台阶。很多固件问题尤其是内存初始化、PCI资源分配相关的光看现象根本定位不了必须靠这些底层信息的输出。我个人在实际操作中的体会是Shell加载标准应用的能力是整个UEFI生态里被低估的一环。它不像写驱动那么复杂却能让你在最短时间内验证一个固件层面的假设。尤其是接触一套新平台时先用Shell加载一个枚举类工具快速获取平台信息几乎已经成了我的固定流程。建议所有做底层开发和系统维护的朋友都花时间把这条路趟通。它会在你真正需要它的时候带来极大的效率提升。

相关新闻

百科系统源码全解析:从词条管理到MySQL全文搜索的实战部署指南

百科系统源码全解析:从词条管理到MySQL全文搜索的实战部署指南

简介:这是一套仿百度百科的百科建站资源,核心为HDWiki,基于PHP的开源百科系统,可快速搭建知识分享与协作编辑平台,适合个人站长、PHP二次开发者及需要建设团队知识库的用户。相比从零开发,它能节省大量框架…

2026/10/14 4:09:47 阅读更多 →
Canvas globalAlpha 透明度属性详解:从原理到避坑实战

Canvas globalAlpha 透明度属性详解:从原理到避坑实战

做 Canvas 开发的人,十有八九都会碰到 globalAlpha 这个属性。你翻文档,它只有一句话:设置图形的透明度。很简单是吧?但我见过太多人,包括我自己早期,都在它身上栽过跟头——要么画出来颜色不对&#xff0c…

2026/10/14 4:09:47 阅读更多 →
RocketMQ核心机制与生产实践:从消息队列原理到高可用部署

RocketMQ核心机制与生产实践:从消息队列原理到高可用部署

先说明一点,这个标题看着简单,但"学习总结"四个字最容易写成流水账。我这边梳理了完整的学习路径和实战心得,重点放在那些官方文档里不会写的"为什么"和"怎么做"上,希望对正在啃RocketMQ的朋友有点…

2026/10/14 4:09:47 阅读更多 →

最新新闻

POST型SQL注入实战全解:从原理到防御的完整链路

POST型SQL注入实战全解:从原理到防御的完整链路

我不是来讲理论的。这篇东西的起因,是上周我帮一个朋友看他的后台系统,他一脸委屈地说“我们这系统登录接口绝对安全”,结果我拿Burp随手改了一个POST参数,三分钟不到就把用户表整个捞出来了。他那个登录接口用的就是POST传参&…

2026/10/14 4:55:59 阅读更多 →
GitHub新手快速上手:从安装配置到分支协作

GitHub新手快速上手:从安装配置到分支协作

很多同学第一次接触 GitHub 的体验并不愉快。计算机导论课老师强调“GitHub 是计算机专业学生的必修课”,你下载了一个安装包,却不知道安装对象是什么;接着是 SSH 密钥、远程仓库、分支、Pull Request。这个过程在 2020 年的教程中非常典型&a…

2026/10/14 4:55:59 阅读更多 →
AI视频运动控制实战:提示词轨迹与MotionLoRA训练指南

AI视频运动控制实战:提示词轨迹与MotionLoRA训练指南

1. AI视频运动控制到底在控什么1.1 从“画面动起来”到“画面按我的意思动”接触AI视频生成有一段时间的朋友应该都有同感:早期玩文生视频,最兴奋的是“它居然真的动了”,但新鲜劲过去之后,痛点立刻暴露——画面确实在动&#xff…

2026/10/14 4:55:59 阅读更多 →
企业微信API开发案例解析:如何打造企业专属消息机器人

企业微信API开发案例解析:如何打造企业专属消息机器人

通用机器人回复千篇一律,企业要的是懂自己业务的专属机器人——知道产品信息、客户分级、内部流程。我们做了一个可配置的企业专属机器人,运营自己配规则和知识库,不用研发改代码。这篇讲机器人的设计思路。底层用的是 Eyun 平台开放的企微 A…

2026/10/14 4:55:59 阅读更多 →
测试求职黄金期:接口自动化与内推如何提升捞人概率

测试求职黄金期:接口自动化与内推如何提升捞人概率

每年3月中旬,都是测试求职帖子最密集的时候。最近在某技术社区刷到一个帖子,标题只有一句:“3月中旬了,测试求捞呀额,不知道有没有人能看到。”就这么一句话,评论区聊出了上百层共鸣。我当时的第一反应是&a…

2026/10/14 4:55:59 阅读更多 →
Agent Lightning强化学习框架:Qwen 9B编程成功率提升14.6个百分点实战

Agent Lightning强化学习框架:Qwen 9B编程成功率提升14.6个百分点实战

1. 从“能跑”到“跑对”:一个9B模型编程成功率提升14.6个百分点的背后如果你最近在折腾小参数模型的代码生成能力,大概率会遇到一个很尴尬的局面:模型明明能把代码写出来,语法也没问题,但跑起来就是不对,单…

2026/10/14 4:54:59 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →