为什么不用 Go 开发操作系统?


本文整理自 GoLand 官方博客的一篇文章:《OS in Go? Why Not?》,探讨了为什么像 C 这样的编程语言在 OS 开发中占据优势,以及是否可以使用 Go 编写 OS。此外还提到了用 Go 开发操作系统的可行性、局限性,以及目前的部分成果。


操作系统 (OS) 是计算机系统的心脏和灵魂,它管理着计算机的硬件和软件资源,并为用户提供与计算机交互的方式。传统上,C 和 Assembly 等语言因其低开销和“接近机器码”的特性而被用于开发操作系统。

但诸如 Go 等高级语言的兴起引入了一些特性,这些特性或许可以使开发操作系统等复杂软件变得更加容易。例如,类型安全、错误处理和并发性在开发操作系统时应该是有益的。

因此,采用像 Go 这样的高级语言来开发操作系统理应是自然选择,但为什么并没有成功的案例?


操作系统由不同的组件构成,它们负责不同的功能,可以使用不同的编程语言编写。

操作系统的核心是内核 (Kernel),它负责与硬件交互——几乎都是采用 C 或汇编语言编写。至于面向用户的组件(例如 GUI 应用程序),可以采用任何语言编写。

例如,Android 采用 Java 编写用户层的组件,如 GUI 框架和系统应用程序(相机、电话等)。相对应的,其内核采用 C 和汇编语言编写;底层系统组件——库,则是用 C++ 编写。

C 语言“统治”内核的主要原因:

  • 可直接管理内存
  • 缺少抽象
  • 无需依赖运行时
  • 可移植性

Go 作为高级语言提供了许多令人满意的特性。从这方面来看,它似乎可以成为开发操作系统的绝佳选择:

  • 某些类型的错误在高级语言中出现的可能性要小得多
  • 并发性:在高级语言中处理并发更容易,因为几乎每种高级语言都内置处理并发所需的机制
  • 类型安全:防止像 C 的宽松类型强制执行

不过尽管 Go 提供了令人满意的特性,可以让操作系统开发者的工作更轻松,但它也有一些局限性。

作为一种具有垃圾回收功能的语言,Go 并不真正适合操作系统开发。使用 Go 编写内核意味着需要小心翼翼地绕过 Go 的垃圾收集。正如此 Reddit 中开发者提到的,鼠标滞后可能是因为中断处理程序分配了触发垃圾回收的内存。

此外,Go 还需要大量的 runtime 才能执行,这意味着它不能直接在硬件上运行。尽管 TinyGo 可以将 Go 编译为在裸机上运行,​​但与 C 相比,它只支持少量的架构,而 C 几乎可以在任何架构上运行。

总的来说,使用 Go 开发一个不是“玩具性质”的操作系统几乎是不可能。尤其是要求支持在多种架构上运行、支持不同设备(如显卡或网卡),并符合 POSIX 标准,这更是极具挑战性。

最后看一下探索用 Go 开发操作系统的案例。

Biscuit 是一个用 Go 开发的操作系统,运行在 64 位 X86 架构上。它使用经过修改的 Go 1.10 运行时实现,其中添加了更多汇编代码来处理系统调用和中断处理程序的引导和进入/退出。

Biscuit 为用户进程提供 POSIX 接口,支持 fork、exec 等。它实现了支持核心 POSIX 文件系统调用的文件系统。 Biscuit 为用 Go 编写的 Intel PCI-Express 以太网 NIC 实现了 TCP/IP 堆栈和驱动程序。使用 POSIX 接口,Biscuit 可以在不修改源代码的情况下运行许多 Linux C 程序。

然而,Biscuit 缺少许多功能,例如调度优先级、换出页面或磁盘,以及安全功能,例如用户、访问控制列表和地址空间随机化。


相關推薦

2023-02-08

再也不会被前端随时随地没完没了地烦了。 为什么选择 APIJSON? 解决十大痛点(APIJSON 可大幅提振开发效率、强力杜绝联调扯皮、巧妙规避文档缺陷、非常节省流量带宽等) 开发提速很大(CRUD 零代码热更新全自动

2023-12-21

以1.7M大小。 1.特性🔥🔥🔥🔥🔥 ✅ 1. 自带json编解码不用第三方库,标准json支持 ✅ 2. 支持多域名网站 ✅ 3. 支持多域名ssl 服务端 ✅ 4. 支持http/1.1、http/2协议 ✅ 5. 支持websocket服务端 ✅ 6. 框架自带websocket推送,支持定时推

2022-09-13

者对 Go 内置模糊测试的认知远低于泛型,并且他们对于为什么或何时考虑使用模糊测试有更多的不确定性。 第三方依赖是最重要的安全问题。避免具有已知漏洞的依赖项是受访者面临的最大安全相关挑战。更广泛地说,安全

2023-10-09

一个问题,按照该站的一贯传统——“先问是不是,再问为什么”,这个问题似乎是在哗众取宠,刻意钓鱼博眼球。 要知道发布于 2012 年的 TypeScript 目前在诸多编程语言排名、指数或开发者调查中一直位居前列,也是最受欢迎

2024-08-08

隶属于 MIT 计算机科学与人工智能实验室的并行与分布式操作系统组,据网上的资料 Austin Clements 也是在这个实验室这个组。 Russ 在哈佛大学就读期间就在 Bell Labs 贝尔实验室里实习(Russ 出生成长的家就在贝尔实验室附近,所以

2022-11-14

长期以来,TypeScript 一直是崛起最迅速的语言之一,也是为什么与流行的现有语言的互操作性可以极大地促进使用和采用的典型例子之一。但近期以来,TypeScript 在该榜单中的排名却总是停滞不前。在过去的三轮调查中,TypeScript

2023-04-28

云原生领域通用编程语言的事实标准。在这样的背景下,开发 KCL 的 Go SDK 来完成 KCL 编译器与 Go 语言的直接交互就有了必要,这也是KCL Go SDK诞生的原因。 最初版本的 KCL 编译器及运行时使用 python 编写,由于 python 语言本身的

2023-10-18

【源创会预告】1024 程序员节(的前两天),相约开源PHP办公室,我们一起聊 AI!>>> 前端生态系统的复杂性是出了名的。在每一层,似乎都存在着不兼容的,相互竞争的标准。 没有通用的导入系统。ES模块、CommonJS、异步模块

2023-06-25

议 集成C++ ORM 1.特性🔥🔥🔥🔥🔥 ✅ 1. 自带json编解码不用第三方库,标准json支持 ✅ 2. 支持多域名网站 ✅ 3. 支持多域名ssl 服务端 ✅ 4. 支持http/1.1、http/2协议 ✅ 5. 支持websocket服务端 ✅ 6. 框架自带websocket推送,支持定时推

2024-04-26

助力开发人员对新兴技术的学习和掌握。 背景 这也是为什么做 Dante Cloud 的初衷: 一方面是以 Dante Cloud 为载体,潜移默化地将过往项目建设的经验教训融入其中,尽可能地帮助使用者规避或者减少无效工作,提升工作效

2023-09-22

数据技术都能四世同堂,凭什么开发 30 岁就要被干掉? Go 团队发布了一份官方指南,帮助开发者更规范地组织/构建 Go module。 刚接触 Go 的开发者常见问题之一是,“就文件和文件夹的组织布局而言,如何组织我的 Go 项目

2023-06-04

s://github.com/hggq/paozhu C++ web框架特性 ✅ 1. 自带JSON编解码不用第三方库,标准JSON支持 ✅ 2. 支持多域名网站 ✅ 3. 支持多域名ssl 服务端 ✅ 4. 支持http/1.1、http/2协议 ✅ 5. 支持websocket服务端 ✅ 6. 框架自带websocket推送,支持定时推

2023-09-22

数据技术都能四世同堂,凭什么开发 30 岁就要被干掉? 上月正式发布的 Go 1.21 修改了 for 循环变量的语义(预览阶段,点此查看详情)。 现在,Go 团队表示 Go 1.22 会将这项特性发布为正式功能。 根据 Go 开发团队技术 l

2023-10-27

给百灵快传开发一个“电脑遥控器”,刚开始我也很疑惑为什么需要电脑键盘远程遥控器。 后来了解场景可能是这样的:一个团队的大屏电脑安装百灵快传,开会的时候一群人围上来(技术探讨、晨会...),然后: 1. 每个人