You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

7.4 KiB

Rust 开发树莓派操作系统教程


介绍

该系列教程适用于 ARM64 位ARMv8-A 架构的业余操作系统开发者。该教程会从零开始,一步步地指导你如何开发一个功能健全的 嵌入式操作系统的内核。包含了实现一般操作系统的任务,例如开发串口控制台,设置虚拟内存和处理硬件异常。 同时利用 Rust 的特性来提供系统的安全和速度。

祝你玩得开心!

带上我最诚挚的问候,
Andre (@andre-richter)

📑 教程结构

  • 每篇教程都包含一个独立可引导的二进制内核文件。
  • 每篇新的教程都在之前的基础上扩展。
  • 每篇教程的指南里面都有一个简短的章节来总结新增的代码和功能,也会展示源代码的区别,方便检查和同步。
  • 部分教程中有除了tl;dr章节外还有非常详细、具体的介绍。长期计划是所有的教程都会有详细的文字说明。但是目前只有那些我认为教程的tl;drdiff还不够详细的章节会详细说明。
  • 教程中所用的代码可以在树莓派 3 和 4上运行。
    • 教程的第一到五章是基础内容,只能运行在QEMU上。
    • 到了[第六章]时(06_drivers_gpio_uart),你可以在树莓派上加载和运行内核并通过UART来观察输出结果。
  • 虽然这些教程是以树莓派 3 和 4 为试验对象,但代码是模块化的,所以应该容易移植到其他 CPU 架构的开发板上。
    • 我希望会有人有机会去实现RISC-V架构的代码。
  • 我推荐使用Visual Studio Code,配置Rust Analyzer插件开发代码。
  • 除了文本教程之外,也可以用make doc命令利用网页的优势来浏览代码。

make doc 的输出

make doc

🛠 系统要求

本教程主要是面向Linux发行版的。理论上文中大部分内容在其他类Unix系统诸如macOS也能正常工作,但请注意,只是理论上。

🚀 tl;dr 版本

  1. 安装 Docker

  2. (仅限Linux) 确保您的用户帐户在 docker group 中。

  3. 准备Rust工具链。其中大部分将在首次使用时通过rust-toolchain.toml文件进行处理。我们要做的是:

    1. 如果你已经安装了一个版本的Rust:

      cargo install cargo-binutils rustfilt
      
    2. 如果你想要全新安装:

      curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
      
      source $HOME/.cargo/env
      cargo install cargo-binutils rustfilt
      
  4. 如果你使用 Visual Studio Code,我强烈推荐你安装Rust Analyzer 扩展

  5. (仅限macOS) 安装一些Ruby gems。

这是作者最后一次在macOS Monterey上用Ruby 3.0.2版本进行测试。如果您正在使用rbenv,那么相应的.ruby-version文件已经就位。 如果你从未听说过rbenv,请尝试使用这个指南

在存储库根文件夹中运行此操作:

bundle config set --local path '.vendor/bundle'
bundle config set --local without 'development'
bundle install

🧰 长期版本: 消除工具链烦恼

这个系列的教程会着重关注用户体验的友好性。因此,我尽量消除嵌入式开发中的最大痛点:Toolchain hassle

Rust内置的交叉编译支持在这方面帮了我们大忙。我们只需要使用rustup安装目标工具链就可以在x86宿主机上交叉编译支持树莓派的目标文件。然而除了Rust编译器我们还需要更多的工具。例如 Rust本身在这方面已经起到了很大的作用因为它内置了对交叉编译的支持。从x86宿主机到树莓派的AArch64架构的交叉编译所需的一切都将由rustup自动安装。然而除了Rust编译器我们还将使用更多的工具。例如

  • 用于在我们的宿主系统上模拟我们内核运行环境的QEMU
  • 一个叫Minipush的自制工具,可以通过UART将内核加载到树莓派上。
  • 用于调式目标文件的OpenOCDGDB

在你的宿主机上安装/编译正确版本的上述工具很可能会遇到很多麻烦。举个例子,你的发行版也许并不会提供我们需要的最新版本的软件包。又或者你在编译这些工具时会遇到一些很难处理的依赖问题。

这也是为什么我们要尽可能使用Docker的原因。我们提供了一个已经预装了所有需要的工具及依赖的容器当需要的时候它就会被自动拉取。如果你想要了解更多有关Docker和这个容器的细节请查看本仓库下的docker 文件夹。

📟 USB 串行输出

由于教程中开发的内核是在真实的硬件上运行的,因此强烈建议您使用 USB 串行调试线来进行试验。连接调试线后,树莓派需要通过额外电源供电。

  • 您可以在[1] [2]中或者淘宝上找到USB转串口线但许多其他线材也可以工作。理想情况下您的线材应基于CP2102芯片。
  • 您将其连接到GND和GPIO引脚14/15,如下所示。
  • 教程5是这个设备第一次需要使用的地方。查看它了解如何准备SD卡以从中启动自制内核的说明。
  • 教程6开始,在树莓派上启动内核变得非常舒适。在本教程中开发了一个所谓的chainloader,。 这将是您暂时需要在SD卡上手动复制的最后一个文件。这将使您能够在通过UART按需引导期间加载教程内核。

UART wiring diagram

🙌 致谢

这个教程最初是由Zoltan Baldaszti项目衍生出来的,感谢它给我开了一个头。

License

Licensed under either of

at your option.

贡献

除非您明确声明,否则有意提交给您的任何贡献(包括 Apache-2.0 许可中定义的)均应按上述双重许可,且无任何附加条款或条件。