Redox随笔(2)-用Rust语言编写的类UNIX操作系统

与其他操作系统相比,Redox如何
我们与其他操作系统有很多共同之处。
由于
Redox syscall接口是Unix-y。例如,我们有open, pipe, pipe2, lseek, read, write, brk, execv等等。目前,我们支持31个最常见的Linux系统。
与Linux相比,我们的syscall接口要小得多。这并不是因为开发阶段,而是因为极简设计。
“一切都是URL”
这是“一切都是文件”的概括,主要是受到了计划9的启发。在Redox中,“resources”(TODO: link)既可以是类似于套接字的,也可以是类似于文件的,这使得它们可以快速地用于几乎所有的事情。
这样,我们就得到了一个更加统一的系统API。稍后,我们将在url、模式和资源中对此进行解释。
内核
Redox的核是一个微核。该设计的灵感主要来自MINIX。
与Linux或BSD相比,Redox只有16000行内核代码,这个数字还在不断减少。大多数服务都是在用户空间中提供的。
在内核中使用更少的代码可以更有效地查找和修复bug /安全问题。Andrew Tanenbaum (MINIX的作者)指出,每1000行正确编写的代码中就有一个bug。这意味着对于一个包含近25,000,000行代码的单片内核来说,可能有近25,000个bug。一个只有16000行代码的微内核意味着大约有16个bug。
应该注意的是,额外的行只是基于内核空间之外,这使它们不那么危险,而不一定是更小的数字。
其主要思想是让组件和驱动程序存在于用户空间中,并且遵循最小权限原则(POLA)。这是每一个单独的组成部分:
完全隔离在内存中,并作为一个独立的用户进程
一个组件的失败不会使其他组件崩溃
外部和不受信任的代码不会公开整个系统
错误和恶意软件不能传播到其他组件
是否限制了与其他组件的通信
没有管理/超级用户权限
bug被转移到用户空间,降低了它们的能力
所有这些都大大提高了系统的可靠性。这对于任务关键型应用程序和希望减少计算机系统问题的用户非常有用。

为什么Rust呢?
为什么要在Rust中编写操作系统?为什么还要用Rust?
Rust拥有巨大的优势,因为对于操作系统来说,安全性非常重要。实际上,很多。
由于操作系统是计算的一个集成部分,所以它们是一个非常重要的安全组件。
由于缺乏内存和类型安全,Linux、BSD、Glibc、Bash、X等系统一直存在大量bug和漏洞。Rust通过静态地加强内存安全性,做到了这一点。
设计很重要,实现也很重要。Rust试图避免这些意外的内存不安全情况(这是安全性关键bug的主要来源)。设计是一个非常透明的问题来源。你知道发生了什么,你知道什么是计划好的,什么不是。
在这一点上,内核/用户空间分离的基本设计与类unix系统非常相似。其思想大致相同:通过内核的严格执行,将内核和用户空间分离,内核负责管理内存和其他关键资源。
然而,我们有一个优势:强制的内存和类型安全。这是Rust的强大之处——在编译时消除了大量“未预料到的bug”(例如,未定义的行为)。
Linux和BSD的设计是安全的。执行情况不是:
Linux内核漏洞
Glibc漏洞
Bash的漏洞
X漏洞
点击上面的链接。您可能会注意到,许多bug都是在不安全的条件下产生的(这些条件可以有效地消除锈蚀),比如缓冲区溢出,而不是整体设计。
我们希望使用Rust最终能够生成更安全的操作系统。
不安全的
不安全是告诉Rust“我知道我在做什么!”的一种方式,这在编写低级代码、提供安全的抽象时通常是必要的。如果没有unsafes,就不能编写内核。
在这种情况下,内核不可能是100%安全的,但是不安全的部分必须标记为不安全的部分,这将不安全的部分与安全代码隔离开来。我们尽量消除不安全的地方,当我们使用不安全的时候,我们是非常小心的。
快速的grep给出了一些统计数据:在大约16000行代码中,内核大约有300次不安全调用。每一个都经过仔细审核以确保正确性。
这与用C语言编写的内核形成了对比,C语言如果没有代价高昂的正式分析,就不能保证安全性。
你可以在Rust书的相关章节找到更多关于如何不安全的工作。

Redox是一个完整的Rust操作系统。除了内核,我们还在开发几个小项目,包括:
TFS:受ZFS启发的文件系统。
Ion: Redox shell。
Orbital: Redox 显示服务器。
OrbTK:小部件工具包。
pkgutils: Redox的包管理库及其命令行前端。
Sodium:类似于vi的编辑器。
ralloc: 一个内存分配器。
libextra: libstd的补充,在整个Redox代码库中使用。
games-for-redox: Redox (类似于bsd游戏)的迷你游戏集。
以及其他一些令人兴奋的项目。
我们还有三个实用程序发行版,它们是一些小的、有用的命令行程序的集合:
Coreutils:一个可用系统所必需的最小实用程序集。
Extrautils: 如提醒、日历、拼写检查等。
Binutils:处理二进制文件的实用程序。
我们也积极参与第三方项目,这些项目在Redox中被大量使用。
uutils/coreutils: GNU coreutils的跨平台锈蚀重写。
m-labs/smoltcp: Redox使用的网络堆栈。
什么工具适合Redox?
将来,这些工具中的一些将被移出默认的发行版,放到单独的可选包中。例如,Orbital, OrbTK, Sodium等等。
列出的工具可分为三类:
关键的,这是一个完整的功能和可用的系统所需要的。
生态友好型,是为了在生态系统中建立一致性。
乐趣,这是“美好的”,并天生简单。
第一类是显而易见的:没有某些核心工具的操作系统是无用的操作系统。第二类包含了将来可能不会违约的工具,但由于其魅力,现在仍然是官方发布的。第三类是为了方便:即确保Redox基础结构是一致和集成的(例如,pkgutils、OrbTK和libextra)。

发布了385 篇原创文章 · 获赞 13 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/AI_LX/article/details/104464231