|
2 | 2 |
|
3 | 3 | ## tl;dr
|
4 | 4 |
|
5 |
| -我们拓展了`boot.S`,在第一次启动的时候调用Rust代码。在Rust的代码中先清零了[bss] section,然后通过调用`panic()`挂起CPU。再次运行`make qemu`看看新增加的代码是怎么运行的。 |
| 5 | +- 我们拓展了`boot.S`,在第一次启动的时候调用Rust代码。 |
| 6 | + 在跳转到rust代码前,对运行时进行了一些初始化工作。 |
| 7 | +- Rust通过调用`panic()`挂起CPU。 |
| 8 | +- 再次运行`make qemu`看看新增加的代码是怎么运行的。 |
6 | 9 |
|
7 | 10 | ## 值得注意的变化
|
8 | 11 |
|
9 |
| -- 链接脚本(linker script)中有了更多的section。 |
10 |
| - - `.rodata`, `.data` |
11 |
| - - `.bss` |
12 |
| -- `_start()`: |
13 |
| - - 当核心不是`core0`第0号核心的时候,挂起该CPU核心。 |
14 |
| - - `core0`会调用Rust的函数`runtime_init()`。 |
15 |
| -- `runtime_init.rs`内的`runtime_init()` |
16 |
| - - 清零了`.bss` section. |
17 |
| - - 它调用了`kernel_init()`, 这个函数又调用了`panic!()`, panic函数最终把`core0`和其他核心一样挂起了。 |
| 12 | +- 链接脚本(linker script)中的变化: |
| 13 | + - 新程序段(sections): `.rodata`, `.got`, `.data`, `.bss`. |
| 14 | + - 使用一个独立的位置(`.text._start_arguments`)来保存`_start()`引导函数所使用的参数。 |
| 15 | +- `_start()` in `_arch/__arch_name__/cpu/boot.s`: |
| 16 | + 1. 当核心不是`core0`第0号核心的时候,挂起该CPU核心。 |
| 17 | + 1. 通过清零`.bss`程序段来初始化`DRAM`. |
| 18 | + 1. 初始化堆栈指针(`stack pointer`). |
| 19 | + 1. 跳转到`arch/__arch_name__/cpu/boot.rs`文件中定义的`_start_rust()`函数 |
| 20 | +- `_start_rust()`: |
| 21 | + 1. 它调用了`kernel_init()`, 这个函数又调用了`panic!()`, panic函数最终把`core0`和其他核心一样挂起了。 |
| 22 | +- 目前依赖 [aarch64-cpu] 程序库, 这个库零成本的包装了处理 CPU 资源时的“不安全”部分。 |
| 23 | + - 详细请参考 `_arch/__arch_name__/cpu.rs`. |
18 | 24 |
|
19 | 25 | [bss]: https://en.wikipedia.org/wiki/.bss
|
| 26 | +[aarch64-cpu]: https://github.com/rust-embedded/aarch64-cpu |
20 | 27 |
|
21 | 28 | ## 相比之前的变化(diff)
|
22 | 29 | 请检查[英文版本](README.md#diff-to-previous),这是最新的。
|
|
0 commit comments