写点什么

谷歌的 Fuchsia:一个新的操作系统

  • 2017-04-23
  • 本文字数:3235 字

    阅读完需:约 11 分钟

引言: 谷歌开发的新开源 OS Fuchsia 引发了很大的关注,但此前由于信息不足,我们只能对这个系统的具体用途、背景信息以及架构做些猜测。本文对这个系统进行了较为详细的介绍,并给出了可安装的平台和安装方式,有兴趣的开发者可以按部就班进行尝试。本文翻译已获得原文作者 Nur Hussein 和英文网站的授权。

Fuchsia 是谷歌开发的一个操作系统,这是一个差不多从头研发的新系统。2016 年 8 月,Fuchsia 的开发新闻在技术新闻网站上引发了轰动,不过很多细节依旧成谜。Fuchsia 是一个开源项目,无论开发工作还是相关的文档都还在持续完善中,除了该项目为开源之外,谷歌并未透露更多信息,包括其真正用途。根据零散分布在网上的文档、源码等信息,我们可以推测:Fuchsia 是一个专为 PC、平板电脑及高端手机所开发的一套完整的操作系统。

源码库中可以下载到Fuchsia 的源码及所有组件,如果诸位喜欢探索实验性质的操作系统,可以尝试一下这个系统——非常有趣。Fuchsia 包含一个内核,其顶层是使用者空间(User Space)组件,负责提供Library 及工具。源数据库中,在Fuchsia 目录的下面有许多子项目,主要都是协助开发者创建应用的资料库及工具项目。Fuchsia 大部分使用三条款BSD 许可证(3-clause BSD license)授权,不过其内核是基于另一个项目 Little Kernel(LK)建立的,而后者使用了 MIT 许可证,因此其内核的授权协议是混合型的。Fuchsia 中包含的第三方软件都是根据其各自的开源许可证进行授权的。

Magenta

Fuchsia 的核心是 Magenta microkernel ,它负责管理硬件,并为系统的使用者空间组件提供抽象层,类似于 Linux 对 GNU 等项目的支持。而 Magenta 建立的基础——Little Kernel 则是 Fuchasic 的开发者 Travis Geiselbrecht 在加入谷歌前所研发的一个项目。LK 的目标是要建立一个能够运行在有限资源的微型嵌入式系统(类似于 FreeRTOS ThreadX )之上的小型内核,而 Magenta 则是针对更复杂些的硬件——想要允许的话,需要至少 64 bit 的 CPU,配以一块内存管理单元。因此,Magenta 在 LK 的有限功能上进行了扩展,它使用了 LK 的“内部构造”,包含线程、互斥锁、计时器、事件(信号)、等待队列、信号及虚拟内存管理器(VMM)。在 Magenta 中,LK 原本使用的 VMM 已经有了实质提升。

Magenta 的一个关键设计在于运用了 capability,这是一个计算机科学的抽象概念,封装了访问某个对象的权限。这一概念是 1966 年由 Dennis 和 Van Horn 首次提出的(点击这里查看原PDF ),指的是一个不可伪造的数据结构,在操作系统中担任控制访问权限的基元。在Magenta 中,开发人员使用了capability 的模型,以定义某个进程与内核、与其他进程的互动方式。

具体实现中,Magenta 采用了名为handle 的构造,只要有进程请求创建内核对象,就会自动生成handle,用于处理与该内核对象的“会话”,几乎所有系统调用都需要通过handle 来实现。handle 包含与其相关的权限,也就是说它们定义了在使用时允许哪些操作。此外,handle 可以通过进程复制或转移。可授予handle 的权限包括读写相关核心对象的权限,只要是虚拟内存对象即可,无论能否被映射为可执行对象。对于沙盒中的特殊进程来说,handle 非常有用。因为经过调整,handle 可以设置为仅允许对系统的某个子集可见、可访问。

由于我们将内存作为可通过核心对象访问的资源,各个进程可通过handle 来获得对内存的应用。在Fuchsia 中创建进程,代表着一个负责创建的进程(比如shell)必须手动为子进程完成创建虚拟内存对象的工作——这一点与传统不同:在传统的Unix 类内核,比如Linux 中,内核会完成大部分的虚拟内存设置,自动处理进程。Magenta 的虚拟内存对象可通过多种方式来映射内存,而且在进程执行中灵活性很高。甚至可以想象完全不对内存做映射的场景,在此场景下,通过类似文件描述符之类的handle,也可以对系统进行读写。尽管这种设置允许任何类型的创造性使用,这也意味着想要运行进程,需要通过使用者空间的环境完成许多的基础架构工作。

由于Magenta 是按照微内核来设计的,操作系统的大多主要功能组件也是当作使用者空间进程来运行的,其中包含驱动程序、网络堆栈以及文件系统。最初从IwIP 引导的网络堆栈最终被Fuchsia 团队所编写的用户网络堆栈所取代。网络堆栈是一个中间性应用,介于使用者空间的网络驱动,以及需要网络服务的应用之间,通过网络堆栈,系统提供了一个BSD socket API。

默认的Fuchsia 文件系统被称为minfs,也是从零开发的。驱动管理器创建了根文件系统内存,为其它安装在下面的文件系统提供虚拟文件系统层(VFS)。然而,由于文件系统是作为使用者空间的服务器来运行的,需通过服务器的相应协议来访问。文件系统中的各个实例都包含后台运行的服务器,以处理所有的数据访问。借助使用者空间的C library,对于只进行调用以开关、读写文件的用户程序来说,协议都是透明的。

Fuchsia 的图形驱动程序也作为使用者空间的服务存在,按照逻辑分为系统驱动以及应用驱动。两者之间促进沟通的软件层被称为 Magma ,是一个提供合成与缓冲区共享的框架。绘图堆栈的某部分即 Escher ,这是一个基于物理的渲染器,通过 Vulkan 来提供渲染 API。

完整的 POSIX 兼容并非 Fuchsia 项目的目标,足够的 POSIX 兼容性可通过 C library 来提供,C 库也是 musl 项目连接 Fuchsia 的端口。这样一来,将 Linux 程序移植到 Fuchsia 系统会比较方便,但本身运行在 Linux 平台上的复杂程序自然需要更多的工作。

实践尝试

可按照本文档中的指南获取自己的Fuchsia 安装程序并运行,方法十分简单。该脚本设置了一个QEMU 实例,大家可自行尝试。它可以在模拟x86-64 系统的q35 或“标准PC“的机器上,以及模拟ARM-64 系统的virt 或Qemu ARM-64 虚拟机上运行,也可以在真机上运行。可按照指南来安装,针对机型包括配有Intel Skylake 的 Acer Switch 12 寸笔记本、Broadwell 超迷你电脑 NUC(next unit of computing)以及 Raspberry Pi 3 。就目前来说,虽然通过兼容外设也能在类似的硬件上运行,但对这三款机器的物理硬件支持也十分有限。

目前,针对 Fuchsia 系统编写应用的支持还不充分,还需要很长时间的开发和文档构建。据了解,谷歌的 Dart 编程语言在该系统中有着广泛应用,而基于 Dart、针对 iOS 和 Android 的移动应用框架 Flutter 的 SDK 就被移植到了这个系统中,似乎是创建图形应用程序的主要方式之一。负责窗口绘制以及用户输入的 compositor 叫做 Mozart,基本上相当于 Linux 上的 Wayland/weston。

当引导 Fuchsia OS 进入图形模式时,我们可以看到在带有选项卡的图形环境中包含了五个 dash shell。第一个标签展示的是系统消息,后面三个是可以在 Fuchsia 环境中启动应用程序的 shell。最后一个标签是 Magenta shell,里面的内容更为基础简单,由于缺少 Fuchsia 环境,无法通过它来运行图形应用。标签可以通过 Alt-Tab 来切换。

目前这套操作系统能够运行的程序并不多,用户组件的大多内容仍在积极地开发中。可以运行的案例应用包括一些命令行程序,比如经典的 Unix fortune,还有一个能在屏幕上绘制旋转方块的图形应用,叫做 spinning_square_view。尽管目前来说内容确实有限,不过敬请持续关注 Fuchsia 的资源库,开发者正在积极更新,以便让这个系统功能更加丰富。相信很快就有更多功能可以尝试。

结论

看到有新的操作系统出现,并且还需要很多开发工作才能逐渐完善,并投入使用总是颇有趣味。Fuchsia 还不完善,但目前看来发展的方向是正确的。由于谷歌在这个项目中投入了许多资源,目前针对 Magenta 以及其它 Fuchsia 组件的开发都非常活跃。对大众来说,所有承诺的功能都是能够实现的。不过目前信息还不够,想要了解项目的确切方向也有些困难。敬请大家关注这个新的开源项目,相信很快就有更多内容填充进来。


感谢郭蕾对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-04-23 19:0011542

评论

发布
暂无评论
发现更多内容

使用 Presto 和 Alluxio 在 AWS 上搭建高性能平台来支持实时游戏服务

Alluxio

游戏 AWS presto Alluxio 8月月更

【LeetCode】爱吃香蕉的珂珂Java题解

Albert

LeetCode 8月月更

Spring进阶(五):Spring事务管理(详解+实例)

No Silver Bullet

spring 事务管理 8月月更

一文搞懂EMAS Serverless小程序开发|电子书免费下载

hum建应用专家

Serverless emas

什么是企业知识库?有什么作用?如何搭建?@附源码

金陵老街

Java、 企业数字化转型 spring-boot

数字知识库-知识图谱管理系统

金陵老街

Java 数字化 知识图谱 企事业系统

[极致用户体验] 我做的《联机五子棋》是如何追求极致用户体验的?(下)

HullQin

CSS JavaScript html 前端 8月月更

手摸手告诉 UI 妹子数据可视化 20 条优化细则【切图仔直接收藏】

掘金安东尼

前端 UI 8月月更

那些你不知道的 CSS 自定义形状网格布局

南城FE

CSS 前端 布局

云原生(二十一) | Kubernetes篇之深入了解Ingress

Lansonli

云原生 8月月更

如何快速开发一个健康助手,实时守护用户健康

HarmonyOS SDK

基于RPC接口的业务侧流量回放

转转技术团队

测试工具 流量回放 测试方案

一套优秀的直播系统源码是什么样的?起码要有这五个模块

开源直播系统源码

软件开发 直播系统 直播系统源码 钠斯直播系统

从 Angular Component 和 Directive 的实例化,谈谈 Angular forRoot 方法的命令由来

汪子熙

typescript 前端开发 angular web开发 8月月更

龙蜥开发者说:我眼里的龙蜥社区:一个包容的大家庭 | 第 10 期

OpenAnolis小助手

Linux 开源 操作系统 龙蜥开发者说 参与贡献

开源一夏 | 在 STM32L051 上使用 RT-Thread (三、无线温湿度传感器 之 I2C通讯)

矜辰所致

开源 RT-Thread 8月月更 STM32L051

数据中台逼近炒作顶峰之际,Gartner给想建数据中台的一些建议

雨果

数据中台 Gartner

计算机网络(三、数据链路层)

计算机网络 8月月更

​DTSE Tech Talk丨第3期:解密数据隔离方案,让SaaS应用开发更轻松

华为云开发者联盟

SaaS 企业 华为云

前端监控系列3 | 如何衡量一个站点的性能好坏

字节跳动终端技术

字节跳动 前端 性能监控 火山引擎 站点性能

高效完成需求计划的四个关键 | 敏捷开发

LigaAI

Scrum 敏捷开发 Sprint LigaAI spring event

你以为的推荐系统,其实只是推荐模型

OneFlow

机器学习 推荐系统 推荐模型

深度解读 | 关于SBOM最基础元素,你需要知道的(Part II)

安势信息

#开源 #SBOM 软件供应链安全 SBOM最基础元素 开源安全与治理

基于keil5新建STM32F10x寄存器版本工程

DS小龙哥

8月月更

为什么程序员都不喜欢使用 switch ,而是大量的 if……else if ?

TimeFriends

8月月更

快速搞懂Mysql中BufferPool底层原理

知识浅谈

Buffer Pool 8月月更

四个层次管好设备,为生产保驾护航

PreMaint

预测性维护 设备管理 设备预测性维护

阿里云携手卫宁健康发布WinCloud智慧医疗云联合解决方案,打造新一代智慧医疗系统

阿里云弹性计算

云服务器 分布式云 云盒 本地化部署

压力测试-JMeter常用插件、服务器硬件监控

程序知音

Java 程序员 后端 后端技术

《键值型数据库系统技术及节能要求》团体标准发布,腾讯、京东、北邮等联合发起

科技热闻

博睿数据入选《2022爱分析· 银行数字化厂商全景报告》

博睿数据

银行 智能运维 博睿数据

谷歌的Fuchsia:一个新的操作系统_Google_Nur Hussein_InfoQ精选文章