Hacker News 中文摘要

RSS订阅

从零开始编写操作系统内核 -- Writing an operating system kernel from scratch

文章摘要

作者分享了自己在RISC-V架构上实现的一个最小化时间共享操作系统内核的原型,旨在帮助理解底层系统软件、驱动程序和系统调用等。该项目基于现代工具和RISC-V架构,并使用Zig语言而非传统的C语言进行开发,以提高实验的可重复性和易用性。

文章总结

从零开始编写操作系统内核

最近,我在RISC-V架构上实现了一个最小化的分时操作系统内核原型。本文将分享这一原型的实现细节,目标读者是那些希望深入了解底层系统软件、驱动程序、系统调用等内容的人,尤其是系统软件和计算机架构的学生。

这个项目是我本科操作系统课程作业的重新实现,功能上应类似于典型的操作系统项目。然而,这次实验更注重现代工具和RISC-V架构。RISC-V是一种易于理解的技术,相比其他CPU架构,它更快上手,并且不仅是教育用途,还广泛应用于许多新系统中。

与传统的C语言不同,我选择了Zig语言来实现这个项目。Zig不仅让实验更有趣,还使得代码更容易在本地机器上复现,因为它设置简单,无需安装,避免了交叉编译到RISC-V时可能出现的复杂问题。

项目概述

我们开发的是一个unikernel,即将应用程序代码与依赖的操作系统内核直接链接在一起,最终生成一个单一的二进制可执行文件。这种方式避免了在运行时单独加载用户代码的复杂性。

RISC-V支持分层的权限模型,系统启动时进入机器模式(M-mode),随后可以切换到较低权限的模式,如监督模式(S-mode)和用户模式(U-mode)。我们假设在软件栈的底层是SBI(Supervisor Binary Interface)层,特别是OpenSBI,它负责管理控制台输出和定时器硬件。

内核目标

我们为内核设定了几个关键功能: 1. 静态定义线程,不支持动态线程创建,且线程实现为永不结束的函数。 2. 线程在用户模式下运行,能够向运行在S-mode的内核发送系统调用。 3. 时间片分配给不同的线程,系统定时器每隔几毫秒触发一次,此时可能会切换线程。

线程与虚拟化

在分时环境中,线程允许多个任务在单个核心上运行,而每个线程的编程模型与独占核心时几乎相同。我们通过定时器和中断来实现线程的无缝切换,从而虚拟化核心资源。每个线程都有自己的寄存器视图和栈,确保它们能够独立运行。

实现细节

我们通过中断栈约定来实现上下文切换。当定时器中断触发时,内核会保存当前线程的上下文,并切换到另一个线程的上下文。这种方式使得多个线程能够在单个核心上并发执行。

内核代码运行在S-mode,而用户代码运行在U-mode。系统启动后,内核在S-mode进行初始化,随后启动用户空间的线程执行。定时器中断会触发上下文切换,用户线程可以通过系统调用与内核交互。

代码实现

项目的完整代码可以在GitHub上找到。我们使用Zig编写了内核的主要逻辑,包括I/O驱动、定时器中断处理和线程调度。用户空间的线程通过系统调用与内核通信,输出信息到控制台。

运行内核

我们可以在QEMU虚拟机上运行这个内核。通过以下命令构建和运行内核:

bash zig build qemu-system-riscv64 -machine virt -nographic -bios /tmp/opensbi/build/platform/generic/firmware/fw_dynamic.bin -kernel zig-out/bin/kernel

运行后,控制台会输出线程的打印信息,展示线程在分时环境下的切换。

结论

这个实验结合了RISC-V、OpenSBI和Zig,为操作系统内核的实现提供了一个新的视角。虽然代码可能存在一些简化,但它为学习操作系统提供了一个良好的起点,尤其适合那些已经具备计算机工程和架构基础的人。

希望这个实验对你有所帮助!

评论总结

  1. 对Linux项目的赞赏

    • 主要观点:Linux作为开源内核的成就令人印象深刻,为Unix在数十亿设备上的应用铺平了道路。
    • 关键引用:
      • "I will never not find this kind of project incredibly impressive."
      • "Linux, after all, is really just the kernel — and yet getting that work done paved the way to getting an open source version of Unix installed on billions of machines."
  2. Zig与RISC-V在操作系统开发中的优势

    • 主要观点:Zig和RISC-V在操作系统开发中表现出色,尤其是RISC-V避免了x86的遗留问题,使得开发更高效。
    • 关键引用:
      • "Zig really is amenable to OS development. And so is RISC-V."
      • "RISC-v doesn’t have any of that. It’s so much faster to get up and running."
  3. 对低成本RISC硬件的需求

    • 主要观点:用户对获取低成本RISC硬件表示兴趣。
    • 关键引用:
      • "How does one get their hands on low-cost RISC hardware?"
  4. 对IP封锁的抱怨

    • 主要观点:用户对因法律问题导致的IP封锁表示不满,认为这是过度行为。
    • 关键引用:
      • "Of FFS... one thing is using http but another this one…"
  5. 关于使用Zig和RISC-V开发微型操作系统的实验

    • 主要观点:作者分享了使用Zig和RISC-V开发微型操作系统的实验,旨在为初学者提供操作系统开发的入门指导。
    • 关键引用:
      • "I have redone the classical exercise of writing a tiny OS kernel with time sharing, which manages a couple of user threads."
      • "It’s definitely very rough around the edges, and it’s more of an experiment and an intro for people who want to go through step 0 of learning OS kernel development and computer architecture."