Multiprogramming a 64 kB Computer Safely and Efficiently


Multiprogramming a 64 kB Computer Safely and Efficiently

引言

这篇Paper是SOSP‘17上面关于利用Rust编程语言来实现一个嵌入式操作系统的Paper。TockOS面向的是资源非常有限的环境,与现在的一般的系统使用数GBor数十GB的内存不同,TockOS的环境一般只会有几十KB的内存。不仅仅是内存,其它的资源也十分有限。TockOS水用Rust语言实现,利用了Rust带来的一些安全的功能。

基本架构

与一般的通用的操作系统类型,早TockOS也主要就是Kernel和Processes组成。在TockOS中,Kernel中的组件被抽象为Capsule。下图中的一个个蓝色长椭圆就是代表了一个个的Capsules。Capsule的实现中利用了Rust语言的特性,它们实现在一个编译时处理的语言沙箱里面。Process即进程,和一般OS中进程的概率类似。TockOS中的进程支持抢占式调度,使用syscall与Kernel交换,利用硬件的一些功能进程被在内存上隔离。TockOS将使用者的角色分为4中,提供建立一个安全系统的一个机制,而不提供具体的 threat model的解决方案,

  • Board integrators。这个与硬件直接相关,能够直接控制微控制器中的固件。
  • Kernel component developers,这个角色实现Kernel中的大部分功能。他们编写的代码的主要抽象形式就是Capsule。一般情况下,一个Kernel中的Capsule组件不能认为Kernel中其它的组件都是可信or可靠的。TocOS可以可以限制错误行为的组件造成的影响在一个范围内。一个Capsule可以占据CPU或者是强制重启系统,但是不能违反一些资源共享的限制,比如未授权访问外设。
  • Application developers,一个开始者的角色,编写应用程序。和一般的系统一样,TockOS认为这些代码都是不可信任的;
  • End-users,一个终端用户的角色。

tock-arch

Capsules

Capsule是Kernel中组件的一个抽象。根据不同的功能有着不同的类型。Capsule是使用Rust语言编些的,所以Capsule的对其它的Capsules的隔离性也利用了Rust语言类型安全和模块系统等的一些特性。Capsules之间彼此的隔离可以在一些Capsules的Bug或者是一些错误行为的时候保护其它的Capsules。一个Capsules只能访问其明确被授权使用的资源。另外,Capsule会暴露出结构供其它的部分使用。在并发性方面,TockOS的调度是一个事件驱动,这些事件有硬件产生or进程通过syscall产生。Capsules本身不会去产生新的事件,这样可以降低系统的负载和内存使用。

tock-kernel

Processes

TockOS中进程概念和其它的系统中进程的概率很类似。在自己一个逻辑上独立的区域上有栈、堆和静态变量等的内容。TockOS中每个进程的栈是独立的,而内核的栈只有一个共享的。另外,编写应用的语言不一定就是Rust。在TockOS中,进程与Kenrel交换的方式也是syscall。

tock-syscall

Grants

Grant的抽象主要是TockOS为了解决资源有限情况下的内存分配的问题。Kernel对于一些组件的内存的分配是静态分配还是动态分配都不能很好地适应TockOS面临的资源受限的环境和TockOS对系统灵活性的要求。Grant是位于每个进程内存空间中的内核堆的一个单独部分,TockOS提高用于访问它们的API,如下图所示。与一般的内核堆分配不同, Grant的分配不会影响分配内存给其他进程。当一个进程消耗完其Grant内存时, 可以保障系统的其余部分继续正常运行。此外, 一个进程死亡或被更换的情况下, 一个进程的所有资源都可以立即和安全地回收。这个Grant的作用可以看作是带有限制性的动态分配。

tock-grant

实现的一些信息 和 评估

这里的具体的信息可以参看[1].

tock-perf

参考

  1. Multiprogramming a 64 kB Computer Safely and Efficiently. SOSP ’17.