走读Writing an OS in Rust实验(一)

Li Guangqiao - 02/12/2023

Rust

Blob Os 内容大纲

![](writing _an_os_in_rust_arch.png)

标准库需要底层操作系统的支撑,想要裸机运行代码,要求Rust可执行文件使用核心库而不是标准库。

基于X86架构和Rust语言编写最小化的64位内核。本章将构建一个向显示器打印字符串,并能被打包为一个能够引导启动的磁盘映像。

VGA 字符模式VGA text mode)是打印字符到屏幕的一种简单方式。在这篇文章中,为了包装这个模式为一个安全而简单的接口,我们将包装 unsafe 代码到独立的模块。我们还将实现对 Rust 语言格式化宏formatting macros)的支持。

本文主要讲述了在no_std环境下进行单元测试和集成测试的方法。我们将通过Rust的自定义测试框架来在我们的内核中执行一些测试函数。为了将结果反馈到QEMU上,我们需要使用QEMU的一些其他的功能以及bootimage工具。

CPU异常在很多情况下都有可能发生,比如访问无效的内存地址,或者在除法运算里除以0。为了处理这些错误,我们需要设置一个 中断描述符表 来提供异常处理函数。在文章的最后,我们的内核将能够捕获 断点异常 并在处理后恢复正常执行。

在这篇文章中,我们会探索 double fault 异常的细节,它的触发条件是调用错误处理函数失败。通过捕获该异常,我们可以阻止致命的 triple faults 异常导致系统重启。为了尽可能避免 triple faults ,我们会在一个独立的内核栈配置 中断栈表 来捕捉 double faults。

在本文中,我们会对可编程的中断控制器进行设置,以将硬件中断转发给CPU,而要处理这些中断,只需要像处理异常一样在中断描述符表中加入一个新条目即可,在这里我们会以获取周期计时器的中断和获取键盘输入为例进行讲解。

本文主要讲解 内存分页 机制,一种我们将会应用到操作系统里的十分常见的内存模型。同时,也会展开说明为何需要进行内存隔离、分段机制 是如何运作的、虚拟内存 是什么,以及内存分页是如何解决内存碎片问题的,同时也会对x86_64的多级页表布局进行探索。

这篇文章展示了如何在我们的内核中实现分页支持。它首先探讨了使物理页表帧能够被内核访问的不同技术,并讨论了它们各自的优点和缺点。然后,它实现了一个地址转换功能和一个创建新映射的功能。

这篇文章为我们的内核增加了对堆分配的支持。首先,它介绍了动态内存,并展示了借用检查器如何防止常见的分配错误。然后,它实现了 Rust 的基本分配接口,创建了一个堆内存区域,并设置了一个分配器包。在这篇文章的最后,内置 alloc crate 的所有分配和收集类型都将可供我们的内核使用。

这篇文章解释了如何从头开始实现堆分配器。它介绍并讨论了不同的分配器设计,包括凸块分配、链表分配和固定大小块分配。对于这三种设计中的每一种,我们将创建一个可用于内核的基本实现。

在这篇文章中,我们将探讨 Rust 的协作多任务处理async/await 特性。我们详细介绍了 async/await 在 Rust 中是如何工作的,包括 Future 特性的设计、状态机转换和固定。然后,我们通过创建一个异步键盘任务和一个基本的执行器,将对 async/await 的基本支持添加到我们的内核中。

Li Guangqiao
Li Guangqiao

一个正在转rust的ExtJs前端工程师。迷信rust的整体发展,十分相信rust在各个领域都能发光发热,至少目前rust在很多领域上验证了其安全性、易维护性。但说实话对于我这种菜鸡也是真的难上手哈哈哈~~。 思路总结:

  • 万物诞生都会有一个需求来源,每一个改变都是为了解决某个问题,最后应该考虑如何去做
  • 学会掌握一些宏观的知识和理论:系统论、还原论
  • 工程化思想,如何描述整体,从整体架构到模块关联等 故学习东西应该像看地图一样,先看整体了解整体的结构,然后再聚焦每一个模块,对于模块的学习,思考三个问题,“是什么?”、“为什么?”、“怎么做?”;那么设计一个东西时也应该去考虑整体性和关联性。

有关于未来的发展,以下是鄙人的粗浅的观点:

  • 编程语言未来应该是每个人必备的工具
  • 未来的交互方式应该会以语言交互为主流
  • 下一个去中心化的技术方案出来之前,区块链依然是web3建立价值体系的基础技术方案,如何将现实价值和虚拟价值联通是进入数字世界的一个大难题。
  • 未来注定是AI的世界。AI的进化会伴随绝大部分人的退化,届时除了尖端人才,人们学习的重心会放在何处?