AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

谷歌的 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:0011743

评论

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

花了30天才肝出来,史上最全面Java设计模式总结,看完再也不会忘

Tom弹架构

Java 架构 设计模式

从落地效果看,转转选择TDengine的三个理由

TDengine

tdengine 后端 时序数据库

Python代码阅读(第64篇):角度与弧度互转

Felix

Python 编程 Code 阅读代码 Python初学者

硬核!阿里自爆虐心万字面试手册,Github上获赞89.7K

热爱java的分享家

Java 架构 面试 编程语言 经验分享

研发效能团队如何拥抱开源社区?一些前沿理念与朴素认知

Zilliz

IMS究竟有什么用?

鸿天hente

限量!腾讯高工用4部分讲清楚了Spring全家桶+微服务

热爱java的分享家

Java 面试 程序人生 编程语言 经验分享

InfoQ 写作平台优质创作者签约计划第二季,我们来了!

InfoQ写作社区官方

签约计划第二季 热门活动

记一次拿到后台权限的过程

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 安全漏洞

淘特 Flutter 流式场景的深度优化

阿里巴巴终端技术

flutter ios android 移动应用 客户端开发

百度ERNIE新突破!登顶中文医疗信息处理权威榜单CBLUE冠军

科技热闻

为什么工业巨头们偏爱自建5G私有专网!

鸿天hente

首次公布Java10W字面经,Github访问量破百万

热爱java的分享家

Java 架构 面试 程序人生 经验分享

AI 收藏夹 Vol.002

Zilliz

鸿蒙轻内核源码分析:虚实映射

华为云开发者联盟

鸿蒙 虚拟内存 物理内存 页表 虚实映射

WorkPlus协同办公系统的优势有哪些?

BeeWorks

这样准备面试定能轻松斩获offer!(内附精选java面试题与答案)

Geek_1df311

Java 程序员 架构 面试

完美!华为爆出Redis宝典,原来Redis性能可压榨到极致

热爱java的分享家

Java 面试 程序人生 编程语言 经验分享

直播带货软件原生开发直播带货小程序平台搭建

风行无疆

联想智慧服务获金耳唛奖总冠军暨业务交流会在京举行

科技大数据

莫慌!阿里人用五个模块讲明白了SpringCloud,可下载

热爱java的分享家

Java 架构 面试 编程语言 经验分享

汽车之家 x StarRocks:极速实时数据分析实践

StarRocks

大数据 数据分析 StarRocks OLAP数据库

PingCode Wiki 协同编辑技术揭秘

PingCode研发中心

wiki PingCode

盲盒app源码开发盲盒小程序原生开发搭建

风行无疆

参赛必读!! 签约计划第二季考核要求

InfoQ写作社区官方

签约计划第二季 热门活动

双非渣硕,在传统公司磨炼四年后成功拿到阿里offer!(附面经分享)

Geek_1df311

Java 程序员 架构 面试

爱奇艺智能内容中台|无人值守的应用与实践

爱奇艺技术产品团队

单元测试再出发

FunTester

Java 单元测试 测试框架 spock Groovy

Js 异步处理演进,Callback=>Promise=>Observer

CRMEB

智能客服"下半场":数据、技术与服务

百度大脑

人工智能

中科柏诚加入信创生态实验室,助力金融领域关键核心技术攻关

联营汇聚

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