Skip to main content

Georgia Tech CS3210 学习笔记系列

· 5 min read

近期萌生了学习 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'.

今天学会了什么

树莓派启动过程

  1. 上电启动,GPU读取内部ROM代码并执行
  2. GPU查找SD卡中第一个可识别的FAT分区,读取根目录bootcode.bin文件到内部Cache并执行,用于初始化 ram
  3. GPU读取根目录start.elf文件到内存并执行,用于分配内存
  4. GPU读取根目录kernel.img文件到内存
  5. GPU唤醒CPU

这里的kernel.img通常就是操作系统内核,我在之前的使用中仅仅接触过更换内核和修改启动参数,但是在这个课程中我是直接把编译好的二进制可执行文件命名为kernel.img放入根目录,也就是所谓的裸机。