Avatar image Harlan V. Wei (aka. Wei Chen)

Google Fuchsia 的权限模型

• Photo credits: Souvik Banerjee on Unsplash

Hero image for Google Fuchsia 的权限模型

This post is only available in Chinese at this moment.

对象 (objects)

Fuchsia 的内核 Zircon 是一个面向对象的内核,它大部分代码使用 C++ 编写,与 UNIX、Linux 程序高度不兼容。

系统内核中的资源均通过“对象”这一概念进行抽象,实际上一个对象就是 C++ 代码中对应数据结构的一个实例。用户模式下的代码需要访问系统资源(即对象)时,必须通过指向对应对象的 handle 来完成,而 handle 实际上也就是一个指向对应 C++ 对象的索引。

Zircon 常见的对象包括 进程、线程、事件、虚拟内存 等。

在 Zircon 代码中,一些方法的参数只关注宏观意义上的对象,而不关注对象具体是什么;这些代码会使用 fbl::RefPtr<Dispatcher> 作为参数的类型。(Dispatcher 简单来说实现了引用计数和回收复用的特性。)

Handle

如上文所说,handle 是用户代码访问对象的途径。每个 handle 都是一个二元组 $(P, O)$,它既说明了指向的对象 (O),也表明了这个 handle 所被授予的权限 (P, Zircon 中使用 rights 这个术语来描述权限)。对 handle 或者 handle 所关联的对象进行操作,必须拥有这一操作所需要的特权。

例如,如果一个 handle 拥有 ZX_RIGHT_DUPLICATE 权限,则进程可以调用 zx_handle_duplicate 系统调用来复制这个 handle,否则不能复制。

Zircon 中的权限大都只与 handle 有关,例如是否允许复制此 handle、是否允许转移此 handle 等,这些权限并不关心 handle 具体涉及什么操作。上层程序的权限实际上是通过对 handle 的管理来实现的,例如是否具有分配内存的权限取决于这个进程是否拥有访问虚拟内存的 handle。

系统中可以有多个 handle 指向同一个 object,每个进程也可以同时持有多个 handle,但是一个 handle 任一瞬间只能被一个进程持有。Handle 可以在进程之间通过 IPC (channel)进行转移。

组件 (components)

Fuchsia 组件的概念与沙箱相关。简单来说,Fuschsia 的沙箱是包含了一份程序及其所需要资源的一个容器,它用于保证程序之间的隔离。最原始的沙箱不具有任何权限(包括分配内存的权限),需要由沙箱的创建者为其赋予权限。

组件可以再组合,即可以组合若干个组件形成一个新的组件。

FIDL

FIDL 即 Fuchsia Interface Definition Language (Fuchsia 接口定义语言),它描述了 Fuchsia 上的程序进行进程间通信时所使用的 协议,其概念和实现类似于 Google 的另一款产品 Protobuf。使用 FIDL 通信的进程遵从客户端—服务器模式,进程 a 作为服务器向外通过协议 A 提供服务,其他进程可以通过各种客户端来访问协议 A 对应的服务。

FIDL 及相关的工具链都不是内核的一部分。FIDL 使用内核中的信道 (channel) 来实现进程间通信,相当于对信道的一种封装,但内核对 FIDL 没有任何知识,也不会知道何时何处哪些进程在使用 FIDL。

Capability

Fuchsia 中的 capability 是一个使用特定 FIDL 协议进行通信的信道,它是组件之间交互的方式,具有某一 capability 的程序可以通过对应的对象访问对应的资源。例如,storage capability 允许程序使用 Directory 协议来访问为此组件所创建的持久化存储。能力有三种具体的相关操作:

到这里其实已经能发现,Fuchsia 中的 capability 与 Linux 的并不是一回事儿。Fuchsia 的 capability 已经不是内核的一部分,它是建立在内核上的一套机制。Linux 的 capability 更接近于 Zircon 的 rights。

References

你可参考 Fuchsia 的官方文档(英文)来了解更详细的内容。

  1. Fuchsia 的安全模型
  2. Zircon 内核中的权限 (rights)
  3. Zircon 中的 handle
  4. Fuchsia 组件概览

Glossary

由于中文社区尚无约定俗成的翻译,内容中涉及到的术语部分采用了直译方案。下面列出这些术语供对照: