From b5e61fa0b4b6f6771e038c10d043b895cc26246d Mon Sep 17 00:00:00 2001 From: equation314 Date: Thu, 27 Dec 2018 14:36:30 +0800 Subject: [PATCH] aarch64/doc: add environment --- docs/2_OSLab/g2/environment.md | 99 ++++++++++++++++++++++++++++ docs/2_OSLab/g2/img/usb-ttl-pi3.png | Bin 0 -> 30373 bytes docs/2_OSLab/g2/overview.md | 4 +- 3 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 docs/2_OSLab/g2/img/usb-ttl-pi3.png 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 0000000000000000000000000000000000000000..32660a2fdde241e513f14974ee8b01d7ce414a2b GIT binary patch literal 30373 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 {S3IcD#7QQW?0mZr0>6E{nerUawaJdEE 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