近期萌生了学习 rust 的想法,恰好了解到 Stanford CS140e 课程的内容是使用 rust 为树莓派编写一个简易操作系统,于是便着手学习,先是一股脑下载了课程文件就开始读,但是在阅读的过程中发现了一些问题,经过我反复地查找资料、反复地启动板子甚至拿着示波器查引脚电平,最后确定我是上错了课。
网上能查到的几位曾跟着 CS140e 写过学习笔记的前辈都是使用18年第一版,而之后的19、20以至于正在编写的21版都将语言换成了C,自然也就享受不到 Sergio Benitez 的优美 rust 代码,虽然18版仍然可以在 Sergio 的网站找到,但两年过去了,里面的很多代码已经不适合现在的 rust 了。 抛开语言不谈,CS140e-20win 的第一个LED闪烁实验我反复尝试也无法成功是让我最为困扰的事,这个实验仅仅使用了树莓派官方固件和一个二进制可执行文件,但启动后检测不到任何GPIO电平变化,act指示灯也是上电约一秒后熄灭,没有出现规律闪烁的情况,丝毫没有头绪。 经过又一番查找我发现了 Gatech CS3210 课程同样是使用 rust 为树莓派编写简易操作系统,从 Acknowledgments 和课程内容也能看出这门课程吸取了不少 CS140e 的优点,于是我马上把课程资料拉下来将同样是LED闪烁的第一个实验写入内存卡上电就成功了。
后期补充:关于编辑器
我最初使用的编辑器是VScode,随着代码越来越复杂VScode本身已经不能满足要求,目前在社区中公认的组合是VScode+Rust Analyzer,在安装了插件后报错,我查到是因为RA不支持Cargo的旧版本,为了避免因为升级工具链出现问题,我尝试仅更新Cargo,rustup的自定义工具链功能恰好可以在缺失Cargo时自动使用新版。最终我从工具链中卸载Cargo再将它作为自定义工具链加入rustup,达到了仅使用最新版Cargo的效果。当然,也可以选择安装旧版本的Rust Analyzer。
source Because the rust-lang/rust tree does not include Cargo, when cargo is invoked for a custom toolchain and it is not available, rustup will attempt to use cargo from one of the release channels, preferring 'nightly', then 'beta' or 'stable'.
今天学会了什么
树莓派启动过程
- 上电启动,
GPU
读取内部ROM
代码并执行 GPU
查找SD卡中第一个可识别的FAT
分区,读取根目录bootcode.bin
文件到内部Cache
并执行,用于初始化 ramGPU
读取根目录start.elf
文件到内存并执行,用于分配内存GPU
读取根目录kernel.img
文件到内存GPU
唤醒CPU
这里的kernel.img
通常就是操作系统内核,我在之前的使用中仅仅接触过更换内核和修改启动参数,但是在这个课程中我是直接把编译好的二进制可执行文件命名为kernel.img
放入根目录,也就是所谓的裸机。