操作系统嵌入式嵌入式OS【免费下载链接】tockA secure embedded operating system for microcontrollers项目地址https://gitcode.com/gh_mirrors/to/tock点击查看免费下载本篇指南以 doc/README.md 为入口系统梳理 Tock 安全嵌入式操作系统的完整文档体系涵盖用户态与内核间的系统调用接口syscall、内核内部硬件接口层HIL参考、开发环境搭建、代码规范与仓库结构以及工作小组、代码评审、发布与安全漏洞处理等项目管理机制。读完本文你将能够依据文档地图快速定位任意开发主题并了解每类文档背后的实际仓库布局与源码依据。Tock 文档仓库的整体定位Tock 的文档以doc/目录为集中存放地与源码仓库同库维护这使得文档可以紧贴代码演进、随 PR 同步更新。根据 doc/README.md 的自述doc/内主要存放Tock 的各类政策与开发实践说明同时包含两部分接口规格通用内核文档与教程位于独立的 Tock Book本目录重点收录 syscall 接口文档doc/syscalls/与内核内部接口参考doc/reference/。从仓库结构看doc/下实际包含 13 个顶层 Markdown 文件外加reference/Tock 参考文档 TRD、rfcs/请求评论、syscalls/系统调用规格、wg/工作小组、images/CI 硬件图片等子目录。整体可分为三大类接口细节系统调用接口syscalls与内核内部接口reference/HIL环境搭建与开发Getting_Started、CodeGoals、Repository、NestedBoards、OutOfTree、Style、ExternalDependencies项目管理Working Groups、CodeReview、Maintenance、SecurityProtocol。下文逐一展开。接口细节用户态与内核的契约Syscall 接口文档doc/syscallsdoc/syscalls/README.md 是用户态与内核之间 ABI 的详细规格涵盖 ABI 接口、内核自带 syscall以及基于allow、subscribe、command三原语的驱动级接口。其核心价值在于为每个已分配**永久驱动号driver number**的驱动建立登记表并标注该驱动是否已在 Tock 2.0 中稳定✓ 表示稳定。核心内核提供的 syscall内核自身只提供一个核心 syscallmemop规格文档。它负责内存相关操作所有调用均以操作类型作为第一参数部分调用在第二参数携带参数签名形如memop(op_type: u32, argument: u32) - [[ VARIES ]]doc/syscalls/memop.md 完整列出了操作类型定义操作类型 0brk将程序断点program break即进程最大可访问地址移动到给定绝对地址返回Result(), ErrorCode内存不足时返回NOMEM操作类型 1sbrk按指定字节数i32上下移动程序断点返回移动前的程序断点地址即新分配内存的起始地址失败返回NOMEM操作类型 2Memory start获取进程 RAM 分配的起始地址操作类型 3Memory end获取进程 RAM 分配末尾之后第一个地址操作类型 4Flash start获取进程 flash 区域起始地址即 TBF 头所在位置操作类型 5Flash end获取进程 flash 区域末尾之后第一个地址操作类型 6Grant start获取进程 grant 区域的最低地址grant 末尾即内存末尾故无对应 grant end syscall。在源码层面memop的处理入口位于 kernel/src/memop.rs由 kernel/src/kernel.rs 在内核循环中根据系统调用号分派memop::memop(process, operand, arg0)与之相关的进程内存管理实现可见 kernel/src/process.rs含brk相关注释与可访问内存区约束以及 kernel/src/process_standard.rs进程必须通过brkmemop syscall 扩展可访问内存。Capsule 提供的驱动号登记表doc/syscalls/README.md 按功能域列出所有已分配的永久驱动号是用户态开发者查找驱动接口的第一手资料分类驱动号示例说明Base0x00000 Alarm、0x00001 Console、0x00002 LED、0x00003 Button、0x00008 Low-Level Debug用户态基础服务前四个已稳定Kernel0x00009 ROS、0x10000 IPC、0x10001 DBS、0x10002 ProcessInfo内核级服务进程间通信、动态二进制存储/进程加载等Hardware Access0x00004 GPIO、0x00005 ADC、0x00010 PWM、0x20000-0x20007 UART/SPI/I2C/USB/CAN外设访问GPIO 在 Tock 2.0 中计划重编号Networking0x30000 BLE、0x30001 802.15.4、0x30002 UDP/6LoWPAN网络协议栈Cryptography0x40000 AES、0x40001 RNG、0x40002 CRC加密与随机数Storage0x50000 App Flash、0x50003 Key-Value、0x50004 Isolated Nonvolatile Storage持久化存储Sensors0x60000-0x60006 环境与运动传感器、0x90002 Touch、0x60009 Distance传感器温度/湿度/光照已稳定Sensor ICs0x70000-0x70006 TSL2561、TMP006、L3GD20 等具体传感器芯片Other ICs0x80000-0x80004 电量计、I2C 多路复用、GPIO Async 等杂项芯片Display0x90001 Screen、0x90003 Text Screen显示Miscellaneous0x90000 Buzzer、0x90009 Servo杂项这些驱动的稳定状态记录由 doc/Maintenance.md 定义的驱动稳定化流程维护二者联动详见下文发布管理一节。每个有文档的驱动在doc/syscalls/下有独立规格文件如 00001_console.md、00004_gpio.md驱动实现则以SyscallDrivertrait 呈现。从源码印证SyscallDrivertrait 定义于 kernel/src/syscall_driver.rs约定command方法中命令 0 为保留命令用于探测驱动是否安装且必须返回CommandReturn::successsubscribe相关实现要求使用 upcall 的驱动必须为每个使用它的应用分配 grant 区域以保证 Yield-WaitFor 场景下 upcall 可正常调度。内核内部接口参考doc/referencedoc/reference/README.md 以Tock Reference DocumentsTRD形式记录内核内部 API是内核开发者特别是 HIL 设计者的权威依据。当前收录TRD 1Tock 参考文档本身的定义与规范TRD 102ADC HILTRD 103GPIO HILTRD 104系统调用TRD 105Time HIL。在doc/reference/中还存放着更多 HIL 与机制设计文档例如 trd3-hil-design.mdHIL 设计原则代码评审中要求新 HIL 遵循之、trd101-time.md、trd-appid.md、trd-dynamic-process-loading.md 等。这些 TRD 与 doc/CodeGoals.md 的重大变更须附 TRD原则呼应TRD 不仅记录设计还记录设计背后的直觉、利弊与未采用的备选方案。环境搭建与开发实践从零开始搭建开发环境doc/Getting_Started.mddoc/Getting_Started.md 是 Tock 的上手指南覆盖工具链安装、内核编译、硬件烧录与应用安装全流程。极速上手Super Quick Setup——按平台执行macOS$ curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh $ pipx install tockloader $ pipx ensurepathUbuntu$ sudo apt install -y build-essential python3-pip curl $ curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh $ pipx install tockloader $ pipx ensurepath $ grep -q dialout (groups $(whoami)) || sudo usermod -a -G dialout $(whoami) # 如需密码会提示重启Nix直接执行$ nix-shell仓库根目录提供 shell.nix。之后进入boards/platform目录运行make即可编译内核。详细安装需要四类基础依赖Rust、rustup 1.23.0、宿主工具链gcc、glibc、命令行工具make、find。当前仓库要求nightly-2026-07-21版本由根目录 rust-toolchain.toml 固定通过 rustup 安装以便多版本共存$ curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh $ rustup install nightly-2026-07-21安装后需source ~/.profile或重开 shell 使.cargo/bin进入$PATH。编译内核Tock 为每个板卡board构建唯一内核板卡负责聚合正确的芯片与引脚配置。选择板卡后进入其目录例如cd boards/nordic/nrf52840dk make。所有板卡共享的常用 make 目标all默认编译该板卡的 Tock 内核debug生成带调试支持的构建细节因板而异doc为板卡构建文档clean清理该板卡构建产物install将内核烧录到板卡。各板卡的详细说明见 boards/README.md 与各板卡子目录 README。硬件与运行需要一块受支持的板卡或 QEMU 配置、Tockloader、以及多数板卡必需的编程适配器。没有实体硬件时Tock 提供有限的 QEMU 支持——boards/README.md 中标注了支持 QEMU 的板卡如 QEMU RISC-V 32/64 位virt平台、HiFive1 等并以make ci-job-qemu目标为 QEMU 支持与否的权威依据。Tockloader是 Python 应用负责把内核与应用烧录到板卡并内置串口管理、以及通过 JTAG或安装 bootloader 后的 USB对应用进行 list/add/replace/remove 等操作$ pipx install tockloader $ pipx ensurepath编程适配器有五种形态可对照 boards/README.md 的 Interface 列选择Bootloader板卡支持 Tock bootloader无需额外适配器jLinkSegger 专有工具需安装 J-Link Software and Documentation Pack版本要求 5.0openocd自由软件适配器要求 0.10.0安装方式(Ubuntu): sudo apt-get install openocd (MacOS): brew install open-ocd (Fedora): sudo dnf install openocdprobe-rsRust 编写的编程与调试工具安装见 probe-rs 官方安装文档 对应说明custom板卡使用微控制器专属工具见板卡 README。烧录内核进入tock/boards/board目录执行$ make install各板卡的 Makefile如 boards/nordic/nrf52840dk/ 内文件中定义了默认烧录方式与可选方案。安装应用内核本身还不够好玩可以用 Tockloader 一键安装示例 blink 应用$ tockloader install blinkTockloader 会自动识别板卡、下载应用并烧录成功后板卡 LED 会显示二进制计数器。若要自己编译应用用户态代码分属两个仓库C/C 应用libtock-c与 Rust 应用libtock-rs按各自 README 操作即可。日常开发仓库根目录运行$ make format可自动格式化全部 Rust 代码基于 rustfmt.toml工具链升级由构建系统自动检测rustc/rustup版本并更新安装好初始四项依赖后无需手动维护。仓库结构与代码目标doc/Repository.md、doc/CodeGoals.mddoc/Repository.md 阐述了 Tock 仓库的主要代码目录分工这是理解文档对应代码在哪的地图arch/架构相关代码Cortex-M 各变体、RISC-V、x86 等含上下文切换与系统调用陷入如 arch/cortex-m/src/syscall.rsboards/具体平台代码imix、Hail、nrf52dk 等核心文件是main.rs其中with_driver函数定义系统调用设备标识符到 capsule 的映射capsules/与 MCU 无关的内核扩展如 SPI capsule 基于芯片 SPI 实现向上提供 syscallchips/微控制器专属代码SPI、I2C、GPIO、UART 等具体实现芯片与板卡的区别在于微控制器 vs 完整平台——芯片提供 UART 实现板卡决定哪个 UART 用于什么kernel/与 MCU 无关的内核核心调度器、进程、内存管理与 arch 一起构成全部核心内核代码libraries/Tock 内部使用也对外共享的库如 tock-cells、tickv、riscv-csr、tock-tbf 等tools/编译与维护辅助工具格式检查、二进制转换、构建脚本vagrant/在虚拟机环境中运行 Tock 的说明。doc/CodeGoals.md 记录了 Tock 十余年形成的开发约定是理解为什么这样设计的钥匙支持已知与未知的多样用例Tock 预期运行于多种硬件平台、满足多种需求上游开发会在合理范围内权衡不同用例的利弊某些贡献即使明显利好某一用例也可能需要更多审查优先可维护性与长期代码Tock 的价值观之一是精心设计许多重大变更需附 TRD 记录设计直觉、利弊与备选方案宁可数月合并也不草率推进拥抱安全信条Tock 自诞生即用 Rust坚信内存安全检查与编译器安全收益甚至在某些场景认为 Rust 过于宽松、期望更强保证因此低层组件的贡献会接受更严格的审查。嵌套板卡与树外板卡doc/NestedBoards.md、doc/OutOfTree.md嵌套板卡doc/NestedBoards.md解决硬件平台被其他硬件扩展如扩展板、插接传感器或作为其他平台基础的场景。每个板卡是独立 crate平台板卡成为依赖板卡的依赖平台板卡 crate 同时是库与二进制二进制几乎完全在库内实现依赖板卡继承平台板卡全部功能并可实例化额外 capsule 进行扩展。其设计目标有三普通板卡无需改动即可成为平台板卡仅用标准 Rust/cargo 机制、无宏依赖板卡的功能易于推演。由于 Rust 二进制 crate 不能作为依赖平台板卡的Cargo.toml需同时声明库与二进制目标[package] name nrf52840dk [lib] name nrf52840dk_lib [[bin]] name nrf52840dk path src/main.rslib.rs暴露形如下方的start()函数main.rs在加载进程、启动内核循环前调用它pub unsafe fn start() - ( static kernel::Kernel, Platform, static nrf52840::chip::NRF52static, Nrf52840DefaultPeripheralsstatic, static Nrf52DefaultPeripheralsstatic, );树外板卡doc/OutOfTree.md指导维护不在 Tock master 中的子系统。要点Tock 保证 syscall ABI 稳定但不保证内核接口稳定需通过 tock-dev 邮件列表与 Tock 的 PR 流程跟进开发动态建议镜像 Tock 目录结构boards/my_board、capsules/等代码置于独立 Cargo crate 中以便用 Cargo 引入依赖含上游 Tock 内核 crate板卡可先用 Cargo 构建cargo build --release若想用 Make需复制Makefile.common并在板卡目录编写 Makefile定义programbootloader 直连烧录与flashJTAG/外部编程器烧录目标板卡Cargo.toml需通过 git 依赖引用 Tock 各 crate并创建调用tock_build_scripts::default_linker_script()的build.rs链接脚本通过layout.ld定义内存映射并INCLUDE tock_kernel_layout.ld该文件位于 boards/build_scripts/tock_kernel_layout.ld自定义芯片/驱动只需一个 Cargo.toml示例项目包括 Signpost 项目的七个 Tock 板卡与早期的 STM32 移植。代码风格与外部依赖政策doc/Style.md、doc/ExternalDependencies.mddoc/Style.md 明确 Tock 的代码风格约定格式统一使用 rustfmt遵循 rustfmt.toml与 rustfmt 默认配置注释三类并用//记录文件内部细节与作者等元数据///为公开数据结构和函数提供 API 文档每个公开函数/对象应有//!置于文件顶部概述文件内容首行作为描述性标签行一般不超过 80 字符第二行留空//!以标识标签行命名尽量避免缩写使用描述性名称例如ArrayIdx→ArrayIndex、BtnInterrupt→ButtonInterrupt、RegVoltOut→RegulatedVoltageOutput、GPIO.low_power()→GPIO.deactivate_and_make_low_power()。doc/ExternalDependencies.md 定义 Tock 内核的外部依赖政策总原则是内核不引入标准库之外的 Rust crate 外部依赖但可在个案基础上、在适当保障下有限使用。政策按 crate 的反向依赖规模分层放宽内核 cratekernel/零外部依赖arch/、chips/、kernel/的外部依赖必须 vendor 进仓库板卡 crateboards/最宽松可用外部库如无线协议实现因时序与认证成本高capsule cratecapsules/capsules/core与capsules/extra必须零外部依赖其余 capsule crate 可按需引入如 BLE、TCP 等复杂子系统依赖内部层级规则板卡 crate 不被任何 Tock 内部 crate 依赖芯片 crate 只被板卡或其他芯片 crate 依赖capsule crate 只被其他 capsule 或板卡依赖arch crate 只能依赖内核 crate 与其他 arch crate内核 crate 不依赖 arch/chip/board/capsule。选择外部依赖的通用准则提供重要功能如密码学库、syn/quote/proc-macro2过程宏支持、项目可理解性聚焦单一功能、代码高质量、只用标准 Rust 机制、有限的子依赖树。唯一被批准的内核级例外是tock-registersMMIO 寄存器接口被 chips/ 广泛使用独立仓库开发以鼓励更严格的向后兼容与定期发布与flux-rs基于 refinement types 的形式化验证仅作可选依赖、只用于测试不影响构建产物。每个引入外部依赖的 crate 必须在 README 中增加 External Dependencies 小节列出依赖及其树可用cargo tree生成并在 PR 描述中填写固定的四段式模板Important Functionality / Project Maturity / Limited Sub-dependencies / Included as board or optional capsule。项目管理机制工作小组doc/wgdoc/wg/README.md 介绍 Tock 的**工作小组Working Groups**体制由于 Tock 子系统庞大且维护者难以跟进全部讨论工作小组对特定子领域负责成员成为该领域专家并决定贡献的审查力度、设计讨论频率等。结构上以Core Working Group为核心外加领域小组核心工作小组统筹项目全局定义高层设计目标与方向建立/解散工作小组处理跨小组贡献冲突并正式控制各 Tock 仓库的直接提交权领域工作小组在各自子领域内拥有接收贡献、设计、方向的委派决策权但成员不被期望成为主要贡献来源而是建立审查标准、传达设计方向、支持贡献者。组织准则每个小组有 Lead至少包含一名核心工作小组成员以保证信息同步默认按共识决策、每周语音会议、公开会议记录、邮件列表异步沟通也可自定规则。当前活跃小组Core、OpenTitan、Network、Documentation、x86、Cryptography已退休Legacy。各小组详情见 doc/wg/core/README.md 等对应目录。代码评审流程doc/CodeReview.mddoc/CodeReview.md 详细规定了主仓库的 PR 合并流程。PR 分为两类Upkeep PR维护型对现有实现的小改动bug 修复、非规格文档、小型重实现。又细分为极微小错别字/格式/clippy、微小少量行改动、Tier 2/3 板卡功能等、中等新 capsule、内核 crate 小改、Tier 1 板卡改动、HIL 实现等Significant PR重大型新模块、重大重实现、新 trait、新内核组件或构建系统变更需全体核心团队在一周内回复 Accept / No Comment / Discuss。CI 体系全部由 make 规则驱动make prepush是提交 PR 前应本地运行的标准开发者 CI元目标细粒度测试规则统一放在ci-job-*中不做一次性设置操作ci-setup-*负责安装依赖应缓存结果、本地运行时系统级变更必须提示ci-runner-*精确对应各 CI runner 执行内容且须能在本地复现ci-all运行全部 CI。评审原则强调unsafe代码必须附 Safety 注释含调用方不变量模板、trait 方法实现与代码块三种模板、回调只能在中断中发出不可从 downcall 直接回调、static_init!()只能出现在板卡 crate、敏感导出须用 capability 保护等。合并要求两个 Accept 且无 Discussunsafe评审还按仓库子系统kernel/HIL/capsules/chips/boards/arch/libraries给出专项指南例如新 HIL 应遵循 TRD 3、syscall 驱动须支持多进程访问且command_id0返回成功、chip 外围必须实现至少基础功能方可合并等。发布与驱动稳定化doc/Maintenance.mddoc/Maintenance.md 描述核心工作小组的维护职责重点是里程碑式发布策略约每 3-12 个月一个版本替代早期每两个月的时间制发布发布前决定包含的功能给相关 issue/PR 打release-blocker标签开启 Release 跟踪 issue含目标清单、逐板卡测试模板、核心成员签核清单逐项关闭 release-blocker发布测试在release/$major.$minor发布分支上逐板卡测试——从上一版本跟踪 issue 复制并取消勾选测试清单、认领板卡、补充新测试失败项在 issue 评论中标记X并描述失败方式随后提交修复 PR 或发布求助 issue必要时可打发布候选release candidate标签打标签所有板卡测试通过、更新 CHANGELOG、将 kernel/src/lib.rs 中KERNEL_PRERELEASE_VERSION置 0、更新根目录 Cargo.toml 版本号后以注解标签annotated taggit tag -a按release-$major.$minor.$patch格式打标签首个 minor 版本 patch 为 0开启下一轮branch 切出后立即在 master 上递增 minor 号、patch 置 0根 Cargo.toml 设为new version-devkernel/src/lib.rs 更新KERNEL_MAJOR/MINOR/PATCH_VERSION并将KERNEL_PRERELEASE_VERSION置 1。Syscall 驱动稳定化是 Tock 的核心兼容性承诺稳定后的驱动在同 major 版本内保证不破坏使用该驱动的应用在同 major 内核上持续可用但允许在同一 major 内扩展接口、加功能或修 bug。流程为驱动在doc/syscalls/有完整文档开发者提交 PR 将驱动移入capsules/corecrate并在 doc/syscalls/README.md 稳定列标记 ⏰稳定化 PR 恒为P-Significant需核心工作小组支持驱动接口须保持四个月不变期间合理测试可回溯起算若需修改则等待期重置缓刑期结束后在下一个 major/minor 发布时将稳定列更新为该发布版本号。对照 doc/syscalls/README.md 的表格可见 Alarm、Console、LED、Button、ADC、Ambient Temp.、Humidity、Luminance 等已标 ✓ 稳定而 GPIO、IPC、DBS 等仍处于未稳定状态——这正是该流程落地执行的直接证据。安全漏洞处理流程doc/SecurityProtocol.mddoc/SecurityProtocol.md 定义安全漏洞的内部处理流程角色分工明确Triage Coordinator负责 5 天内初审、分类、指派、协调响应团队、与利益相关方沟通并跟踪解决进度Security Response Team由各子系统维护者组成。子系统联系人表Kernel、Drivers、libtock-c、libtock-rs、Build、ARM、RISC-V、x86 等均配有主/备联系人确保漏洞能直达对应专家。漏洞处理六阶段接收与初审5 天漏洞统一经securitylists.tockos.org接收回执确认并分配唯一 IDuuidgen | cut -d- -f1生成如C2C47E9A评估严重性Critical/High/Medium/Low、受影响组件与优先级P0-P3有效漏洞创建私有 GitHub Security Advisory指派与响应规划5 天-1 周指派给子系统维护者必要时建立响应团队频道按严重性定义解决时间线秘密通知利益相关方修复开发私下开发并测试修复、彻底代码评审、验证无新问题、内部记录、准备披露说明公开披露准备确定披露日期准备完整公告详细描述、受影响版本、缓解措施、升级指引、报告者致谢发布安全公告与修补版本发布与披露合并修复到主分支、发布修补版本、发布公告并通知安全公告邮件列表、报告者与利益相关方更新公开文档披露后活动监控修复效果、进行复盘、更新文档。文档还附有三套通信模板初始回执、状态更新、披露通知以及 GitHub Security Advisories、私有邮件列表等工具资源供处理者直接套用。如何在文档迷宫中继续深入面对 Tock 庞大的文档与源码建议的导航路径是先读 doc/README.md建立全局地图明确当前需求属于接口、开发还是管理范畴用户态开发从 doc/syscalls/README.md 的驱动号表入手找到目标驱动号后阅读doc/syscalls/下对应规格文件再对照capsules/中该驱动的SyscallDriver实现内核开发从 doc/reference/README.md 的 TRD 入手理解 HIL 设计后在kernel/src/hil/与chips/、arch/中查看具体实现并遵循 doc/CodeReview.md 的子系统评审指南环境与板卡以 doc/Getting_Started.md 为操作手册以 boards/README.md 的板卡矩阵Tier 1/2/3 与 Other含架构、MCU、烧录接口、QEMU 支持为选型依据贡献与治理对照 doc/CodeGoals.md、doc/Style.md、doc/ExternalDependencies.md、doc/Maintenance.md 与 doc/SecurityProtocol.md确保贡献符合项目长期演进方向。这套文档体系与仓库源码同库演进、互相印证——规格文件定义契约TRD 记录设计理性源码实现落地行为管理文档约束流程共同构成 Tock 作为安全嵌入式操作系统可审计、可维护、可长期演进的工程基础。赞分享操作系统嵌入式嵌入式OS【免费下载链接】tockA secure embedded operating system for microcontrollers项目地址https://gitcode.com/gh_mirrors/to/tock点击查看免费下载相关推荐Tock 内核胶囊Capsules架构指南从 Driver 接口到多 crate 组织的驱动开发全景Tock 内核胶囊Capsules架构指南从 Driver 接口到多 crate 组织的驱动开发全景 Tock 是一个面向微控制器的安全嵌入式操作系统。本操作系统嵌入式嵌入式OSRisingWave 开发者文档体系构建 rustdoc 索引页与核心 crate 导航指南RisingWave 开发者文档体系构建 rustdoc 索引页与核心 crate 导航指南 RisingWave 在 docs/rustdoc https:数据库流处理后端数据工程Steel Browser 文档体系全览从开发环境搭建、系统架构到插件开发的导航指南Steel Browser 文档体系全览从开发环境搭建、系统架构到插件开发的导航指南 Steel Browser 是一个面向 AI Agent 与应用的开源浏浏览器控制AI 应用上一篇3步为Word添加APA第7版引用格式学术写作效率提升指南下一篇Claude Code ExitWorktree 工具详解退出隔离工作区保留或清理会话工作树创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?