1.1 准备使用 Rust
01-准备使用 Rust — Comprehensive Rust
3 分钟阅读
译文 · 基于 Comprehensive Rust
原文链接: https://google.github.io/comprehensive-rust/bare-metal/aps/entry-point.html
1.1 准备使用 Rust
在开始运行 Rust 代码之前,我们需要进行一些初始化。
| |
这段代码位于
src/bare-metal/aps/examples/src/entry.S。没有必要 详细理解这一点——要点是需要一些低级设置 满足 Rust 对系统的期望。
- 这与 C 的情况相同:初始化处理器状态, 将 BSS 清零,并设置堆栈指针。
- BSS(区块起始符号,由于历史原因)是区块链的一部分 包含静态分配变量的目标文件 初始化为零。图像中省略了它们,以避免浪费空间 在零上。编译器假设加载程序将负责归零 他们。
- BSS 可能已经被清零,具体取决于内存的初始化方式和 图像已加载,但为了确定我们将其归零。
- 在读取或写入任何内存之前,我们需要启用 MMU 和缓存。如果 我们不:
- 未对齐的访问将会出错。我们构建 Rust 代码
aarch64-unknown-none设定的目标+strict-align以防止 编译器不会生成未对齐的访问,所以在这方面应该没问题 情况,但一般情况下不一定如此。- 如果它在虚拟机中运行,这可能会导致缓存一致性问题。这 问题是虚拟机在禁用缓存的情况下直接访问内存, 而主机具有同一内存的可缓存别名。即使主持人 没有显式访问内存,推测性访问可能会导致缓存 填充,然后当缓存时,其中一个或另一个的更改将丢失 已清理或虚拟机启用缓存。 (缓存由物理地址作为键控, 不是 VA 或 IPA。)
- 为了简单起见,我们只使用硬编码的页表(参见
idmap.S) 那 身份映射设备的前 1 GiB 地址空间,接下来的 1 GiB DRAM,另外 1 GiB 更高,可容纳更多设备。这和记忆相符 QEMU 使用的布局。- 我们还设置了异常向量(
vbar_el1),我们将看到更多关于 之后。- 今天下午的所有示例都假设我们将在异常级别 1 下运行 (EL1)。如果您需要在不同的异常级别运行,则需要 修改
entry.S因此。