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

news/2024/11/19 20:40:02/

39c12d4bd54f434f9574f36925f47d5e.jpeg

 

操作系统 (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 运行时实现,其中添加了更多汇编代码来处理系统调用和中断处理程序的引导和进入 / 退出。

4248f99a69724bb6a1a880600e960d39.png

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

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

 

欢迎点赞收藏转发🙏🙏

                    ----  END  ----

 

 

 

 

 

 

 

 

 

 

 


http://www.ppmy.cn/news/98545.html

相关文章

方法——慎用重载

前言: 何为重载,类中两个方法同名,但是参数列表不同,称为重载。注意,是参数列表,不是返回值,实际上同名方法同参数列表,但不同返回值是不允许的。 // 重载示例,重载方法允许有不同的…

Unity烟花特效实现(附源码)

Unity烟花特效 附代码 写在前面效果代码地址核心步骤 写在后面 写在前面 朋友过生,不知道送什么礼物,就想着用自己所学知识做个特效当礼物吧,嘿。 主要参考了 这位up的视频 ,感谢 效果 代码地址 https://github.com/hahahappyb…

(10) 朴素贝叶斯

文章目录 1 概述2 不同分布下的贝叶斯2.1 高斯朴素贝叶斯GaussianNB2.1.1 认识高斯朴素贝叶斯2.1.2 探索贝叶斯:高斯朴素贝叶斯擅长的数据集2.1.3 探索贝叶斯:高斯朴素贝叶斯的拟合效果与运算速度 2.2 概率类模型的评估指标2.2.1 布里尔分数Brier Score2…

基于STM32的IIC驱动协议实现

目录 1.简介 2.特点 3.协议细节 1.简介 IIC(Inter-Integrated Circuit)总线是一种由 PHILIPS 公司开发的两线式串行线,用于连接微控制器及其外围设备。它是由数据线 SDA 和时钟 SCL 构成的串行总线,可发送和接收数据。在 CPU 与被控 IC 之…

爆肝整理,最全单元测试-测试用例总结(全覆盖)及拿即用...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Python自动化测试&…

nginx(七十九)rewrite模块指令再探

一 rewrite模块再探 ① 知识回顾 1) 结合自己遇到过的案例场景2) 关注一些易错点、难点3) 本文内容很杂,建议读者选取感兴趣的阅读 rewrite模块 rewrite功能 ② nginx中利用if 等价&&多条件 需求背景: 1) nginx不支持&&、||、and、or等逻辑…

sqlalchemy从入门到熟悉(一)

sqlalchemy从入门到熟悉(一) 简介 SQLAlchemy SQL工具包和对象关系映射器是一套用于处理数据库和Python的综合工具。它有几个不同的功能领域,可以单独使用或组合使用。SQLAlchemy的两个最重要的面向前端的部分是对象关系映射器(O…

Makefile基础教程(自动生成依赖关系)

文章目录 前言一、makefile不包含.h依赖的后果二、gcc -M 和 gcc -MM命令三、sed命令四、makefile中命令的执行机制四、生成依赖文件并单独放入文件夹中总结前言 在前面的文章中我们都只使用到了.c文件作为依赖但是在实际的工程中肯定是不可能只有.c文件的还存在.h文件,那么在…