#bootloader #networking #server #dhcp-server #x86-64 #base #require

nightly app gamozolabs/kernel

纯 Rust x86_64 启动加载程序和内核

1 个不稳定版本

0.1.0 2020 年 4 月 12 日

#1643 in 网络编程

478 星 & 25 关注者

450KB
8K SLoC

摘要

这是一个几乎完全使用 Rust 编写,且没有任何第三方依赖的启动加载程序和内核。此代码库中的一切都是您在代码上所需的所有内容。

构建

要求

要构建此项目,您需要 Rust、nasmlld-link(来自 LLVM 的链接器)。此启动加载程序和内核的构建方式与构建系统无关。它应该可以在 Linux、Windows、OSX、BSD 等操作系统上构建。

您可以从这里获取 nasm:[nasm](https://nasm.us/) 或通过 apt install nasm

您可以从这里获取 LLVM 二进制文件:[LLVM](https://llvm.net.cn/builds/) 或通过 apt install lld

您可以从这里获取 Rust:[Rust](https://rustup.rs/)。您必须使用 nightly Rust!

此项目需要您安装 i586-pc-windows-msvcx86_64-pc-windows-msvc Rust 目标。

rustuptarget add i586-pc-windows-msvc x86_64-pc-windows-msvc

特别是 nasmlld-linkrustupcargo 必须在您的 PATH 中。如果这些中的任何一个不在您的路径中,您可能需要创建指向特定版本的符号链接(例如:lld-link-10

构建

要构建此项目,只需运行 cargo run 即可。这将创建一个名为 pxe 的文件夹,其中包含需要通过TFTP服务器公开的文件夹。可选地,您可以将 pxe 文件夹中的文件复制到您现有的PXE部署文件夹中。

使用方法

此引导加载程序和内核需要PXE启动。它们以任何方式都不支持磁盘。所有操作都在网络上完成。要使用此引导加载程序和内核,您需要设置一个有效的PXE启动环境。这通过DHCP服务器和TFTP服务器完成。

TFTP服务器必须指向包含 chocolate_milk.bootchocolate_milk.kern 的目录。DHCP服务器应配置为使用 chocolate_milk.boot 作为启动映像。这是一个特定于BIOS的引导加载程序,不会与EFI/UEFI兼容。

设计

构建系统

我们使用了一个基于Rust的构建系统,位于 src/main.rs。我们使用Rust构建了这个构建系统,这样我们就不需要在构建过程中承担任何其他依赖。这个构建系统对安装的必需程序进行了一些检查,构建并扁平化了引导加载程序,并组装了引导加载程序。

引导加载程序

引导加载程序是一个简单的i586 Rust程序,以MSVC调用约定PE的形式发出。我们的构建系统 src/main.rs 将其扁平化为加载PE的内存映像。然后它直接附加到初始 bootloader/src/stage0.asm 入口存根。一旦进入32位模式并设置了选择器,我们就直接跳转到 bootloader::entry()

依赖项