加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 安全 > 正文

基于Rust语言编写的安全嵌入式操作系统Tock

发布时间:2022-12-15 15:03:57 所属栏目:安全 来源:互联网
导读: Tock是一种用于传感器网络和物联网的安全嵌入式操作系统。Tock是第一个允许多个不受信任的应用程序在基于微控制器的计算机上同时运行的操作系统。Tock内核使用Rust(一种不依赖垃圾回收器的

Tock是一种用于传感器网络和物联网的安全嵌入式操作系统。Tock是第一个允许多个不受信任的应用程序在基于微控制器的计算机上同时运行的操作系统。Tock内核使用Rust(一种不依赖垃圾回收器的内存安全系统语言)编写。用户空间应用程序在可以用任何语言编写的单线程进程中运行。

Tock设计用于在基于Cortex-M和RISC-V的嵌入式平台上运行多个并发的、互不信任的应用程序。Tock的设计围绕着保护,包括潜在的恶意应用程序和设备驱动程序。Tock使用两种机制来保护操作系统的不同组件。首先,内核和设备驱动程序是用Rust编写的,Rust是一种提供编译时内存安全、类型安全和严格别名的系统编程语言。Tock使用Rust来保护内核(例如调度器和硬件抽象层)不受平台特定设备驱动程序的影响,并将设备驱动程序彼此隔离。其次,Tock使用内存保护单元将应用程序彼此和内核隔离开来。Tock体系结构如下图所示。

真空淬火炉 操作安全_操作系统安全_压缩空气储气罐操作安全注意事项

上图显示了Tock的体系结构。代码分为三类:核心内核、胶囊和进程。内核和胶囊都是用Rust写的。Rust是一种类型安全的系统语言;Rust语言对内核设计影响的关键思想是Rust代码不能以不同于预期的方式使用内存(例如,溢出缓冲区)。

大多数操作系统使用类似于进程的抽象来提供组件之间的隔离:每个组件都有自己的内存地址空间(用于堆栈、堆、数据),其他组件无法访问这些内存。进程很好,因为它们为隔离和并发提供了方便的抽象。然而,在资源有限的系统上,比如内存远小于1MB的微控制器,这种方法会导致隔离粒度和资源消耗之间的权衡。Tock的体系结构通过使用一个语言沙箱来隔离组件和一个协作调度模型来解决这个问题。首先,Tock中的所有组件包括内核中的组件都是相互不信任的。在内核内部,Tock通过一个基于语言的隔离抽象来实现这一点,该抽象不需要内存或计算开销。在用户空间中,Tock使用传统的进程模型,其中进程与内核隔离,并使用硬件保护机制相互隔离。Tock有利于系统的整体可靠性,并阻止组件在出现错误时阻止系统进程。

压缩空气储气罐操作安全注意事项_真空淬火炉 操作安全_操作系统安全

Tock包括三个架构组件。用Rust编写的小型可信内核实现了硬件抽象层(HAL)、调度器(Scheduler)和特定于平台的配置(Config)。其他的系统组件是用两种保护机制之一实现的:胶囊(内核编译时使用Rust的类型和模块系统来保证安全)和进程(使用MPU在运行时进行保护)。因此,每种方法都更适合实现不同的组件。一般来说,驱动程序和虚拟化层实现为胶囊,而使用现有代码/库的应用程序和复杂驱动程序实现为进程。

胶囊

胶囊是一种Rust结构和相关功能。胶囊直接相互作用,访问暴露的字段并调用其他胶囊中的函数。可信平台配置代码初始化它们,使它们能够访问所需的任何其他胶囊或内核资源。胶囊可以通过不导出某些函数或字段来保护内部状态。

胶囊以特权硬件模式在内核内部运行操作系统安全,但Rust的类型和模块系统保护核心内核不受错误或恶意胶囊的影响。由于类型和内存安全性在编译时是强制的,因此不存在与安全性相关的开销,而且胶囊需要最小的错误检查。例如,胶囊从不需要检查参数的有效性。如果引用存在,则指向正确类型的有效内存。

Rust的语言保护提供了强大的安全保证。除非胶囊能够颠覆Rust类型的系统,否则它只能访问显式授予它的资源,并且只能以这些资源公开的接口允许的方式访问。但是,由于胶囊是在与内核相同的单线程事件循环中协同调度的,因此必须信任它们以保证系统的活性。如果胶囊崩溃,或者不向事件处理程序让步,则系统只能通过重新启动来恢复。

进程

进程是与内核隔离的独立应用程序,在与内核分离的执行线程中以较低的权限运行。内核优先调度进程,因此进程比胶囊具有更强的系统活性保证。此外,Tock使用硬件保护在运行时强制执行进程隔离。这允许用任何语言编写进程,并在运行时安全加载。

内存布局

进程之间、内核和底层硬件之间由硬件内存保护单元(MPU)显式隔离。MPU限制进程可以访问的内存地址。在进程允许区域之外的访问会导致错误并陷阱到内核。

存储在flash中的进程代码可以通过只读存储器保护区访问,而其存储器被分配为RAM的一个连续区域。Tock进程的一个新方面是在地址空间的顶部存在一个“授权”区域。这是分配给进程的内存,但由进程既不能读也不能写的内存保护区域覆盖。授权区域允许内核从进程借用内存以响应系统调用。

源码结构

Tock有几个主代码目录,包括arch、boards、capsules、chips、doc、kernel、libraries、tools和vagrant。

arch:存储特定于体系结构的代码。包括用于执行上下文切换和进行系统调用的代码。

boards:包含特定Tock平台的代码。包括用于将MCU的IO管脚配置为正确状态的代码,初始化内核并加载进程。此目录中的主体文件是main.rs,主体初始化函数是reset_handler(在MCU复位时执行)。

capsules:包含独立于MCU的内核扩展,可以构建在特定外设的特定芯片实现之上。

chips:包含微控制器专用代码,如SPI、I2C、GPIO、UART等微控制器专用代码的实现。

doc:包含Tock的文档,包括内部接口和教程的规范。

kernel:包含与微控制器无关的内核代码,如调度程序、进程和内存管理。这个目录和arch是所有核心内核代码所在的位置。

libraries:包含内部使用和外部共享的库。

tools:包含帮助编译和代码维护的关联工具,例如检查代码格式、转换二进制文件和生成脚本。

vagrant:包含有关如何使Tock在类似于虚拟机的环境中运行的信息。

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!