Atmosphere 源码解读:eclct.stub 错误上报收集桩模块的完整解析

发布时间:2026/9/13 9:38:12
Atmosphere 源码解读:eclct.stub 错误上报收集桩模块的完整解析 Atmosphere 源码解读eclct.stub 错误上报收集桩模块的完整解析【免费下载链接】AtmosphereAtmosphère is a work-in-progress customized firmware for the Nintendo Switch.项目地址: https://gitcode.com/GitHub_Trending/at/Atmosphere导读eclct.stub是 AtmosphèreNintendo Switch 自定义固件中针对 Horizon OS 官方eclctError Collection系统模块的重实现。官方eclct负责在系统层面收集错误报告而 Atmosphère 的这一实现以空桩stub形式彻底移除错误报告收集的全部功能从而从源头减少遥测信息。本文以 eclct.stub.md 为骨架结合stratosphere/eclct.stub/目录下的源码、构建配置与 JSON 进程配置深入剖析该模块的设计意图、实现方式、进程属性和在整套系统启动流程中的定位帮助你理解用最小实现裁剪系统功能这类定制固件模块的工程手法。eclct.stub 模块概述官方 eclct 模块与 Atmosphère 的重实现在 Horizon OS 中eclct是一个系统模块其职责是收集错误报告error reports。它与另一个系统模块erptError Report 管理模块紧密配合erpt负责生成、管理错误报告例如崩溃转储、系统诊断信息eclct负责收集这些报告并向上如任天堂的遥测服务传递。Atmosphère 对二者的处理策略截然不同值得对比模块官方职责Atmosphère 策略对应文档erpt管理错误报告保留功能但把新报告重定向写入 SD 卡/atmosphere/erpt_reports/目录避免报告被上传docs/components/modules/erpt.mdeclct收集错误报告完全桩化stub移除一切与错误报告收集相关的功能docs/components/modules/eclct.stub.md从 erpt 模块入口源码 可以看到Atmosphère 明确注释了策略意图/* Atmosphere always wants to redirect new reports to the SD card, to prevent them from being logged. */ erpt::srv::SetRedirectNewReportsToSdCard(true);也就是说报告可以生成、可以保存在本地但不允许被收集并上传——eclct.stub正是这条断流链路中关键的一环。erpt与eclct.stub一存一断共同构成 Atmosphère 的隐私与遥测控制方案。桩stub模块的设计理念桩化是一种常见的嵌入式/定制系统裁剪手法进程仍然存在、仍然以正确的 Title ID 注册在系统中但内部逻辑被替换为空实现。这样做的收益包括系统兼容性其他模块仍能像往常一样通过服务端口或进程 ID 找到eclct不会因模块不存在而报错功能裁剪把官方eclct中收集并上报错误报告的行为彻底关闭减少遥测数据外流资源最小化空实现几乎不消耗 CPU 与内存也不需要维护状态机。源码实现一个空模块长什么样eclct.stub的全部业务源码只有一个文件stratosphere/eclct.stub/source/eclct_stub.cpp完整内容如下已省略文件头 GPL-2.0 许可证注释#include stratosphere.hpp namespace ams { namespace init { void InitializeSystemModule() { /* ... */ } void FinalizeSystemModule() { /* ... */ } void Startup() { /* ... */ } } void Main() { /* ... */ } }这个文件非常直白地展示了 Atmosphère 系统模块的标准入口骨架ams::init::InitializeSystemModule()——系统模块初始化入口桩版本为空实现ams::init::FinalizeSystemModule()——系统模块反初始化入口桩版本为空实现ams::init::Startup()——启动阶段钩子桩版本为空实现ams::Main()——模块主函数桩版本同样为空。对比 erpt 模块入口真实的InitializeSystemModule需要依次初始化sm、set、setsys、pscm、time等系统服务11.0.0 以上还要初始化ectxreclct.stub的这些函数体内连一条服务初始化调用都没有。所有函数体都是空注释块主函数Main()什么都不做进程启动后即无事可做地驻留或按系统模块约定被管理。从源码结构看可以推断Atmosphère 保留了eclct的系统模块外壳进程、Title ID、构建产物但把所有可能产生收集/上报行为的内部逻辑全部移除。它不初始化sm、不注册任何 IPC 服务service_host为空数组见下文、不调用任何系统 API因此从行为层面彻底杜绝了错误报告的收集与传输。进程配置解析eclct.stub.jsoneclct.stub的系统进程配置位于 stratosphere/eclct.stub/eclct.stub.json这份 JSON 定义了该进程在 Horizon 中的完整元数据。逐字段解析如下。基本身份与 Title IDname: eclct.stub, title_id: 0x0100000000000032, title_id_range_min: 0x0100000000000032, title_id_range_max: 0x0100000000000032,name模块名即eclct.stubtitle_id进程的 Title ID0x0100000000000032正是 Horizon OS 中eclct系统模块的官方 Title ID——桩模块占用与原版相同的 ID保证系统按 ID 查找模块时行为不变title_id_range_min/title_id_range_max均为同一个值表示该进程不占用 ID 区间只对应单个 Title。线程与 CPU 配置main_thread_stack_size: 0x00004000, main_thread_priority: 49, default_cpu_id: 3, process_category: 0, is_retail: true, pool_partition: 2, is_64_bit: true, address_space_type: 3, disable_device_address_space_merge: true,main_thread_stack_size主线程栈大小0x400016 KB。作为对比需要承载完整服务逻辑的erpt在内存堆上分配了196_KB见 erpt_main.cpp而空桩只需极小的栈main_thread_priority主线程优先级 49数值越大优先级越低属于较低优先级的后台进程default_cpu_id/ 内核能力中的lowest_cpu_id/highest_cpu_id均为 3即固定运行在 CPU 3系统模块通常被限定在保留核上is_retailtrue表示该模块在零售版固件正式发行版中也生效——这正是遥测裁剪的目的所在pool_partition2内存池分区is_64_bit/address_space_type64 位进程地址空间类型 364 位地址空间disable_device_address_space_mergetrue禁用设备地址空间合并。文件系统与服务访问filesystem_access: { permissions: 0xFFFFFFFFFFFFFFFF }, service_host: [], service_access: [fatal:u],filesystem_access.permissions为全0xFF掩码即对文件系统拥有完整访问权限权限由更低层策略进一步约束service_host为空数组桩模块不注册/不托管任何 IPC 服务。这也是无功能的直接证据——官方eclct必然对外提供错误收集相关的服务端口而桩版本一个都不提供service_access只声明了fatal:u即允许调用 fatal 服务用于在异常时触发 fatal 界面的用户端接口是系统模块保底可用的最小依赖集。内核能力kernel_capabilities配置声明了进程可用的内核能力包括kernel_flags: { highest_thread_priority: 63, lowest_thread_priority: 24, lowest_cpu_id: 3, highest_cpu_id: 3 }线程优先级允许范围 246363 为最高优先级24 为最低CPU 仅允许使用核 3。syscalls段逐条列出了可用的系统调用号0x010x7F 区间内的约 60 项覆盖了内存管理svcSetHeapSize、svcMapMemory、svcQueryMemory、线程管理svcCreateThread、svcStartThread、svcSetThreadCoreMask、同步原语svcSignalEvent、svcArbitrateLock、svcWaitForAddress、IPCsvcConnectToNamedPort、svcSendSyncRequest、svcReplyAndReceive、安全监控svcCallSecureMonitor等标准系统调用全集。这是 Atmosphère 系统模块模板的标准能力集即使桩模块不实际使用也保持了与同族模块一致的进程形态。最后min_kernel_version: 0x0030min_kernel_version为0x0030对应 3.0.0 固件表示该进程要求内核版本不低于 3.0.0与 Atmosphère 整体支持的固件范围一致。构建集成模块如何进入固件eclct.stub作为 Stratosphere 系统模块集合的一员参与构建这体现在两处模块清单stratosphere/stratosphere.mk 中列出了全部 Stratosphere 模块ALL_MODULES : loader boot ncm pm sm ams_mitm spl eclct.stub ro creport fatal dmnt boot2 erpt pgl jpegdec LogManager cs htc TioServer dmnt.gen2eclct.stub与erpt、creport崩溃报告等遥测相关模块并列其中说明它是在编译期就固定纳入固件镜像的组成部分而非运行时按需加载。模块构建规则Makefile 通过system_module.mk复用 Atmosphère 统一的系统模块构建模板目标板卡nx-hac-001Nintendo SwitchCPUarm-cortex-a57每个模块生成release、debug-DAMS_BUILD_FOR_DEBUGGING、audit-DAMS_BUILD_FOR_AUDITING三种构建配置all: nx_release默认构建 release 版本。system_module.mk 引入 stratosphere.mk 模板产物类型为nspATMOSPHERE_SYSTEM_MODULE_TARGETS : nsp构建流水线为elf ← nso ← nsp.nso .npdm其中.npdm由 npdmtool 依据模块的 JSON 配置即上文分析的eclct.stub.json生成。整个流程与其它系统模块完全一致——外壳完全标准只是内容为空。启动链中的定位为什么不启动本身就是策略一个空实现模块是否会被启动答案藏在启动器boot2的模块清单中。在 boot2 的板级实现 里eclct被显式地从启动列表中注释掉/* ncm::SystemProgramId::Eclct, */ /* eclct */ /* Skip launching error collection in Atmosphere to lessen telemetry. */这段注释直白地说明了设计意图Atmosphère 不启动错误收集模块以减轻遥测telemetry。同类处理还出现在该文件的另一处第 113 行即用户态与内核态的对应路径。由此可以梳理出 Atmosphère 对错误报告链路的完整处理逻辑报告生成erpt允许生成但强制重定向到 SD 卡本地目录/atmosphere/erpt_reports/阻止其进入系统日志通道报告收集eclct模块本身被桩化源码为空实现并且在启动链中干脆不启动结果错误报告既不会上传也不会被收集遥测数据流在系统层面被双向截断。eclct.stub因此扮演了一个双保险角色即使未来某次固件更新中boot2误启动了eclct进程它也只是个无服务、无逻辑的空壳不会产生任何收集行为。小结eclct.stub是理解 Atmosphère 定制固件工程哲学的一个绝佳样本行为层面以空函数体彻底移除官方eclct的错误报告收集能力eclct_stub.cpp进程层面以原版 Title ID0x0100000000000032、标准系统模块形态eclct.stub.json保持系统兼容性却不托管任何服务启动层面在 boot2 启动列表中被显式跳过从源头减少遥测生态层面与 erpt 模块的 SD 卡重定向实现源码协同构成本地可留档、外部零上报的完整隐私策略。如果你希望进一步研究同类裁剪手法可以继续阅读 docs/components/modules/ 目录下其他模块文档或直接对照 creport、erpt 等相邻模块的源码观察 Atmosphère 如何针对不同系统服务采取重实现、重定向、桩化三种差异化策略。【免费下载链接】AtmosphereAtmosphère is a work-in-progress customized firmware for the Nintendo Switch.项目地址: https://gitcode.com/GitHub_Trending/at/Atmosphere创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考