diff --git a/docs/2_OSLab/g2/environment.md b/docs/2_OSLab/g2/environment.md index 58c35fd7..17e972b7 100644 --- a/docs/2_OSLab/g2/environment.md +++ b/docs/2_OSLab/g2/environment.md @@ -1 +1,100 @@ # 环境配置 + +## 软件需求 + +* [Rust](https://www.rust-lang.org/) nightly 编译器 + + ``` + curl https://sh.rustup.rs -sSf | sh + rustup component add rust-src + ``` + +* Cargo tools: [cargo-xbuild](https://github.com/rust-osdev/cargo-xbuild) + + ``` + cargo install cargo-xbuild + ``` + +* [QEMU](https://www.qemu.org/) >= 3.0.0 +* [AArch64 GNU toolchain](https://web.stanford.edu/class/cs140e/assignments/0-blinky/) + + + macOS: 从 [homebrew](https://brew.sh/) 安装: + + ``` + brew tap SergioBenitez/osxct + brew install aarch64-none-elf + ``` + + + Linux: 下载 [aarch64-none-elf-linux-x64.tar.gz](https://web.stanford.edu/class/cs140e/files/aarch64-none-elf-linux-x64.tar.gz) 并解压到任意目录。 + +## 硬件需求 + +* 1 块 Raspberry Pi 3 Model A+/B/B+ +* 1 块 4GB 及以上的 microSD 卡与读卡器 +* 1 个 CP2102 USB 转 TTL 模块 +* 若干杜邦线 + +## 在模拟器中运行 + +* 构建并运行 + + ``` + git clone https://github.com/wangrunji0408/RustOS.git --recursive + cd RustOS/kernel + rustup override set nightly + make run arch=aarch64 [board=raspi3] + ``` + +* 使用 GDB 调试 + + ``` + make debug + ``` + +* 反汇编 + + ``` + make asm + ``` + +* 更多 Makefile 选项 + + * `mode=debug|release`:指定 `debug` 还是 `release` 模式。默认 `debug`。 + * `graphic=on|off`:是否启用图形输出。默认 `on`。 + * `smp=1|2|3|4|...`:指定 SMP 的核数。目前 aarch64 的 SMP 未实现,该选项无效。 + * `raspi3_timer=system/generic`:使用 Raspberry Pi 的 System Timer 还是 Generic Timer。默认 `generic`,且在 QEMU 中只能使用 Generic Timer。 + * `prefix=`:指定 aarch64 工具链前缀。默认 `aarch64-none-elf-`,某些 Linux 中的工具链前缀为 `aarch64-linux-gnu-`。 + * `LOG=off|error|warn|info|debug|trace`:指定输出日志的级别。默认 `warn`。 + * `SFSIMG=`:用户程序 SFS 镜像路径。默认 `../user/img/ucore-aarch64.img`,即用 C 语言编写的直接从原 uCore 中移植过来的用户程序。如欲使用 Rust 编写的用户程序可将其设为 `../user/build/user-aarch64.img`。 + +## 在真机上运行 + +1. 往 SD 卡中写入 [Raspbian](https://www.raspberrypi.org/downloads/raspbian/) 原版系统镜像:直接看 。然后需要将原版的 `config.txt` 替换为 `tools/raspi-firmware/config.txt`。 + +2. 写入 RustOS 内核镜像: + + ``` + make install + ``` + +3. 连接 Raspberry Pi、CP2102 模块与 PC: + + ![](img/usb-ttl-pi3.png) + + 注意最好使用 Raspberry Pi 自带的电源适配器供电,而不要用 CP2102 模块的 +5V 供电(即不用连上图中的红线)。 + +4. 使用 [screen](https://www.gnu.org/software/screen/manual/screen.html#Overview) 与串口进行通信: + + ``` + screen /dev/ 115200 + ``` + + 在 macOS 中 CP2102 模块的设备路径一般为 `/dev/tty.SLAB_USBtoUART`,在 Linux 中一般为 `/dev/ttyUSB0`。 + +5. 插入 SD 卡,上电,看终端的输出结果。如果连接了 Raspberry Pi 的 HDMI 接口与显示器,还能看到显示器中有输出。 + + +## 实用技巧 + +1. 从 QEMU 中退出:按 ` c`,再输入 `q`。 +2. 从 screen 中退出:按 ` k`,再输入 `y`。 diff --git a/docs/2_OSLab/g2/img/usb-ttl-pi3.png b/docs/2_OSLab/g2/img/usb-ttl-pi3.png new file mode 100644 index 00000000..32660a2f Binary files /dev/null and b/docs/2_OSLab/g2/img/usb-ttl-pi3.png differ diff --git a/docs/2_OSLab/g2/overview.md b/docs/2_OSLab/g2/overview.md index 2313e8b3..41d9badd 100644 --- a/docs/2_OSLab/g2/overview.md +++ b/docs/2_OSLab/g2/overview.md @@ -7,14 +7,14 @@ | Raspberry Pi 3B+ | | |-------|---------| | 指令集 | ARMv8-A 64 bit | -| 片上系统(SoC) | Broadcom BCM2837 | +| 片上系统(SoC) | Broadcom BCM2837B0 | | 处理器(CPU) | 4 x Cortex-A53 1.4Ghz | 图形处理器(GPU) | Broadcom VideoCore IV | | 内存 | 1GB(与 GPU 共享) | ## 官方文档 -* [ARM Architecture Reference Manual ARMv8, for ARMv8-A architecture profile](https://static.docs.arm.com/ddi0487/da/DDI0487D_a_armv8_arm.pdf):Aarch64 的完整文档,有 7000 多页,最为详细。 +* [ARM Architecture Reference Manual ARMv8, for ARMv8-A architecture profile](https://static.docs.arm.com/ddi0487/da/DDI0487D_a_armv8_arm.pdf):AArch64 的完整文档,有 7000 多页,最为详细。 * [ARM Cortex-A Series Programmer’s Guide for ARMv8-A](http://infocenter.arm.com/help/topic/com.arm.doc.den0024a/DEN0024A_v8_architecture_PG.pdf):可认为是上一文档的精简版,仅有不到 300 页。 * [BCM2837 ARM Peripherals](https://web.stanford.edu/class/cs140e/docs/BCM2837-ARM-Peripherals.pdf):Raspberry Pi SoC BCM283x 系列的外围设备文档,包含对 GPIO、中断控制器、mini UART、System Timer 等外围设备的访问。 * [BCM2836 ARM-local peripherals](https://www.raspberrypi.org/documentation/hardware/raspberrypi/bcm2836/QA7_rev3.4.pdf):仅用于如何使用 ARM Generic Timer。