B. N. Bershad, S. Savage, P. Pardyak, E. G. Sirer, M. E. Fiuczynski, D. Becker, C. Chambers, and S. Eggers. 1995. Extensibility safety and performance in the SPIN operating system. SIGOPS Oper. Syst. Rev. 29, 5 (December 1995), 267-283. DOI: http://dx.doi.org/10.1145/224057.224077


问题和背景

动机和目的

关键问题

工作介绍

基础技术

为了实现可拓展性, SPIN 的方法是 内核定义一系列接口, 然后 extension 实现这些接口. (dzy: 接口就类似回调函数, 这样内核就可以主动调用 extension 中代码了)

因此, 接口需要细粒度, 而且需要权限管理. (dzy: 防止 faulty extension 崩掉整个系统)

Modula 3

SPIN 依赖 Modula 3 的安全和模块封装措施

架构

第 3, 4, 5 节讲的就是架构.

SPIN 内核有两个组成部分

连接这两部分的软件 infrastructure 包含

Protection Model

Extension Model

有两个关键组成部分

实现中, event 是接口函数 (原型), handler 实现对应函数 (实现), 这样, 无论是表示系统状态变化的事件, 还是系统内部请求一个服务, 都可以直接调用这个接口函数 (event), 然后分派到 handler 执行.

(dzy: 这样命名让人觉得是强行面向事件, 简单的 interface / service function 就可以了啊)

权限控制就延续 protection model 的方法

这种架构当然还需要 dispatcher, registeration 等等概念. 一个 event 能有多个 handler, 默认有一个主 handler, 在其 default impl 模块中. 其他 extension 可以请求替换它或者注册额外的 handler. 主 handler 负责批准或拒绝这些请求, 以及给这些请求加上约束如这个额外 handler 是异步的, 需要在一定时间内执行完成等等.

Core Services

管理处理器和内存资源, 向 extensions 暴露细粒度的接口 (i.e. event).

管理内存包含地址分配和映射. 有三个底层接口分别是实页框分配, 虚页分配, 以及虚实映射控制. 这些接口由内核实现 (dzy: 显然为了安全), 用户可以提供 service (不是 extension 而是 core) 在其之上构建高层语义, 如 Unix 地址空间, Mach task 等.

管理处理器就是进程管理. 由简单的 Strand 接口完成, 用户应用可以提供自己的线程模型/线程实现 (如 C-Thread, Modula-3 Thread, goroutine) 和自己的 scheduler. 当然为了安全, 应用的 scheduler 只管用户态的线程, 进到内核态之后切换还是内核来做.

Core Services 应当是可信的, 它们需要符合 Spec. 如线程管理中 CheckPoint 之后不切换是违反语义的. 不过即使它们出错, 也只有使用它们的应用会受影响.