FlingOS:用 C# 教授操作系统开发






4.97/5 (23投票s)
在本文中,我将讨论 FlingOS 采用的创新方法,即使用 C# 向高级开发人员教授操作系统和底层开发。
引言
FlingOS™ 是一个免费的、开源的、得到行业和大学支持的项目,旨在为学生和开发人员提供学习操作系统和底层开发的学习资源。该项目包括文章、教程视频和示例代码库。文章旨在提供全面的背景信息和技术细节。教程视频将开发人员从通用编程引导到理解计算机体系结构和操作系统开发。然而,所有这些都链接到 FlingOS 代码库,该代码库主要是一个用 C# 编写的示例内核。
在本文中,我将讨论使用 C# 来教授操作系统和底层开发的非同寻常的决定,以及它的一些优缺点。
背景
在一个以 C 和开发者为主导的环境中,这些开发者并没有在面向对象、高级和 Web 开发是常态的时代成长起来,对于许多当前的底层开发者来说,理解高级开发者的观点可能很困难。这导致了一个狭隘、封闭的态度,在一个日益需要开发者的社区中。
许多高级开发者,尤其是学生,在巨大的抽象和构造层次上接受了教育。这使得从高级语言转向 C 或 C++ 变得异常困难——比反向学习更难!
将语言和设计之间的差异,以及在底层几乎不能想当然的事实结合起来,你会发现进入底层开发有一个巨大的障碍。然而,物联网正在改变开发重点,对嵌入式和底层开发的兴趣日益增长。
在关键时刻,就在底层开发爆发、学习资源需求回升之际,FlingOS 正在准备缓解从高层到低层的过渡。
重要提示
读者需要认识到,在任何阶段,我(或 FlingOS)都不会建议 C# 是实现操作系统(或驱动程序)的一个好、正确或最佳的语言。FlingOS 也无意成为一个能与 Linux 或 Windows 相媲美的真实操作系统。因此,认为或说“但 C# 不适合底层开发”是完全忽略了重点。使用 C# 的全部目的是作为一个学习平台。从熟悉到陌生的垫脚石。
次要问题
当然,FlingOS 还解决了另一个次要问题。那就是大多数高级开发者不了解任何底层软件(更不用说硬件)了。这导致了一个日益不安全、不稳定的层级,高级开发者根本不知道他们代码的实际影响。
直到今年早些时候,在 Black Hat 会议上,人们才开始注意到这个问题。具体来说,许多高级开发者一直在使用定制构建或标准框架组件来实现加密。
更具体地说,许多开发人员实现了自己的伪随机数生成器,或者只是使用了一个标准的框架。两者都不适合在安全系统中使用,因为两者都没有内置适当级别的熵和熵管理。如果更多的高级开发者了解底层软件,他们就会意识到用于生成加密学上适当的伪随机数的内置函数。至少,对硬件的理解和一些额外的数学知识就能让许多人发现这个漏洞。
FlingOS 旨在通过提供一个平台来解决这个问题,在这个平台上,人们可以学习操作系统和底层概念,而无需学习全新的语言或框架;它将打开一个理解的世界。
入门障碍
如前所述,对于希望开始从事操作系统或底层开发的高级开发人员来说,存在着相当多的入门障碍。这些可以总结如下:
- 语言差异
- 设计/工程差异
- 框架/支持差异
- 理论和基础挑战
- 工具可用性
- 信息可用性
语言差异
从高级到低级开发过渡时最大的问题之一是语言的差异。虽然许多高级语言(例如 C#、Java、JavaScript)使用 C 风格的语法,但它们与现代 C 已经走了很远。C 是底层开发的事实标准语言,特别是对于新学生来说。
因此,虽然 C 保留了一些熟悉的结构(循环、变量、条件块等),但它缺少许多高级开发人员依赖的关键特性(例如命名空间、类、在方法中的任何位置声明变量等)。存在足够小的差异,使得尝试用 C 编程不仅仅是困难——对于许多人来说,它本身就是一个巨大的挑战。
因此,为了让高级开发人员能够开始在底层工作,所使用的语言必须更加熟悉。对于学生和专业人士来说,被要求学习一门新语言作为学习所有其他概念的必要条件,这是一个重大的障碍。
设计/工程差异
虽然许多设计和工程差异(例如静态和/或全局变量的使用、缺乏类和命名空间、手动内存管理)可以被视为语言差异,但最好将其视为软件工程差异。
C 语言中程序结构、头文件使用、static 关键字的不同含义、声明的使用以及声明顺序的重要性等基本知识,使得 C 编程对高级开发人员来说是一个巨大的挑战。它要求开发人员学习一种全新的软件结构和实现方式。最终,这种陌生感和难度足以掩盖学习底层开发的概念和理论。
不幸的是,在我遇到的许多底层开发者中,大多数从 C 开始的人似乎都无法理解这个挑战。看起来,从低到高(例如,C 到 C#)比从高到低容易得多。这导致了非常消极、轻蔑甚至敌视的学习底层开发的高级开发人员的环境。这种情况只会随着时间的推移而改变,并且只有当更多的项目(如 FlingOS)鼓励高级开发人员产生兴趣时才会改变。
框架/支持差异
对于那些底层开发者来说,以下内容将是显而易见的:在操作系统或底层几乎没有框架支持。
虽然存在标准库,但它们不包括自动内存管理(如垃圾回收)、简便的文件处理或 lambda 函数处理。在底层,有必要手动完成许多工作。高级语言中一个特别重要的特性,常被用作标准执行的一部分,是异常处理。在底层,try-catch-finally 块根本不存在(即使你使用 C++,仍然需要一个特殊的库和钩子才能使其工作)。
例如,在底层,通用 List 的概念并不真正存在。你只能使用数组或链表。如果你想扩展一个数组,你必须手动进行。这意味着许多高级开发人员会不知所措,不知道如何开始实现某个功能。
高级开发人员太习惯于框架、库甚至编译器提供的复杂构造了。
理论和基础挑战
在我看来,学习底层开发的主要挑战应该是理解控制硬件所涉及的理论和实践挑战。这本质上就是学习操作系统或底层开发的目的。
不幸的是,很容易陷入所有其他差异中,而从未真正理解操作系统的结构、驱动程序如何控制实际硬件以及理论挑战,例如在中断处理程序中尝试分配内存。
工具和信息的可用性
最后,这一点经常被严重低估,操作系统和底层开发可用的工具和信息非常有限(尤其是,例如,与 Web 开发相比)。
这意味着许多高级开发人员觉得底层开发很可怕且难以应对。他们发现获取关键信息几乎不可能,而尝试让工具链正常工作本身就像一种黑暗魔法(更不用说编写自己的 make 脚本了)。
与 C# 或 Web 开发的海量构建工具、预构建库和丰富的文档(包括问答论坛)相比,底层开发是一片荒芜的景象,偶尔会有人以前黑客的脑力输出。
分离概念
为了应对这些入门障碍,我们必须分离出一个人从高级到低级开发过渡所需的学习概念。FlingOS 将学习内容分为:
- 语言与软件设计
- 计算机体系结构/硬件设计
- 软件-硬件交互
- 操作系统体系结构
- 驱动程序体系结构
语言和软件设计涵盖 C 语言、如何构建 C 程序、如何编译和链接 C 程序、头文件的使用、如何实现基本框架函数和链表等构造。有大量的优秀大学课程和在线免费教程可以教授 C 语言以及如何在其中创建高级构造。
计算机体系结构和硬件设计涵盖了“硅如何制造设备”的基础知识,还包括内存和寄存器如何用于执行指令并形成一系列连贯的事件。
软件/硬件交互涵盖了在处理器上执行的软件与硬件之间发送/接收指令/数据之间的混合层。它涵盖了 I/O 端口、DMA、内存映射 I/O、设备寄存器和中断等内容。
操作系统体系结构和驱动程序体系结构涵盖了用于管理硬件、将其抽象为通用 API/ABI 并最终支持高级软件的软件结构。从虚拟内存管理器到 USB 驱动程序都属于这些主题。
分解学习
如前所述,C 语言和 C 软件设计实践已经可以在线学习。然而,目前的普遍看法是,必须在学习任何其他概念之前,甚至在能够开始接触底层开发之前,就要完成这些学习。
FlingOS 打破了这一想法。从客观的角度来看,完全有可能在不需要 C 语言的情况下学会如何管理一块硬件,如何发送 USB 请求或执行内存映射 I/O。事实上,任何支持内存间接寻址(即指针)的语言都是合适的。
因此,学习底层开发可以分为三个关键部分:适当的语言(几乎总是 C 或 ASM)以及硬件设计和软件控制/抽象层。
减少剩余障碍
FlingOS 通过使用一种熟悉、高度流行的语言——C#——来实现底层软件,从而降低了入门门槛。这意味着任何高级开发人员都可以来看代码,而无需学习一门新语言。这使得高级开发人员可以更早地深入了解操作系统开发和体系结构的细节。
C# 隐藏了内存管理(仅限堆)和其他棘手方面,使学生能够专注于代码的意图。这让他们能够理解,例如,一系列寄存器读/写操作用于处理键盘扫描码的含义,而无需不断考虑具体的代码。
用高级语言教授底层开发,可以让开发人员/学生专注于代码的意图和原因,而不是纠结于具体的操作方法。它在理论与实际操作系统开发之间提供了一个中间学习平台(你可以称之为接口)。
C# 的优点
- 易于阅读、编写和维护
- 易于理解
- 定义类型没有歧义,也没有自定义定义(C 语言中常常如此)
- 封装允许将单个组件独立查看
- 良好的软件结构支持,可以理解组件之间的链接
- 由于内存管理是自动处理的,因此减少了软件复杂性
- 更“安全”/“更受保护”/受管理的学习环境,可以很好地在宿主环境中进行测试,从而使开发和调试更快、更容易、更可靠。(更容易发现错误)
- 允许在学习新语言(例如 C 和 ASM)的同时学习操作系统/底层开发
- 允许学习操作系统软件的内容和原因,而无需学习难以掌握的“如何”步骤(即无需学习 C)
- 在线有大量关于如何用 C# 编程的优秀信息
- 功能强大、易于使用的工具,如 Visual Studio
C# 的缺点
- 学生最终仍需要学习 C
- C# 不适合商业级全功能操作系统或任何嵌入式操作系统,因为它相对较慢且体积庞大
- 当需要使用汇编代码处理操作系统开发的某些方面时,C# 会有些笨拙
- 需要使用自定义的提前编译(AOT)编译器,例如 FlingOS 编译器
结论
用 C# 编程操作系统乍一看似乎没什么意义。尤其不适合嵌入式市场。但如果你不再将其视为一个操作系统,而是将其视为高级开发与低级开发之间的垫脚石,那么它的价值就显而易见了。
FlingOS 刚刚发布了 30 篇新文章、一系列 10 个教程视频以及他们 x86 C# 内核的新版本。在 Imagination Technologies 的赞助下,他们还为编译器增加了 MIPS 支持,并正在为 x86 和 Creator CI20 开发跨平台内核。虽然这种方法是否真正有效还有待观察,但肯定有很多热情和早期证据表明他们将取得成功。
布里斯托大学(英国)也对该项目表示支持,因此,FlingOS 将在即将到来的学期举办一系列讲座和研讨会。更多信息请访问 www.flingos.co.uk/lectures
要了解有关该项目的更多信息(或开始您的低级开发之旅),请访问 www.flingos.co.uk。
完全披露
为了完全披露,我是 FlingOS 的创始人,我曾沿着从高级开发到低级开发的陡峭、蜿蜒的道路自学。因此,我倾向于支持使用这种方法,但同样,我亲身经历过这些问题和障碍。FlingOS 所采取的方法是我自己经验的结果,也是关于如何让别人更容易的想法。
历史
2015-09-16:初稿写就。