CS140e: (1) 准备与 Blinky

(题图是 Assignment 0 最终的效果(知乎貌似对 EXIF orientation的支持不完全,折腾了好久))

CS140e 是 Stanford 的一个实验性的操作系统课程。根据其介绍, 这门课的特点是采用了 Raspberry Pi 3, 代码将在真实机器上运行,而不是其他操作系统课程采用的虚拟机。其次选用了“现代编程语言”,也就是 Rust.

当我看到这门课的相关信息的时候便决定要跟着材料学习一下。因为首先 Rust 是我目前最喜欢的语言,另外自己对树莓派也有兴趣,只是缺少契机入手。(两件快乐的事情重合在一起...

(另外,我写这篇文时仔细研究了一下,这门课的教师阵容相当豪华。Sergio Benitez 是 Rust Web 框架 Rocket 的作者,相信这门课中的 Rust 应该是非常地道的。Dawson Engler 是 Frans Kaashoek 的学生,拿 exokernel 做 PhD 毕业论文,可以说是操作系统领域的大佬了。害怕.jpg 羡慕.jpg

下面简单记录下我做 Assignment 0 的经过。

首先是环境的准备,这块比较麻烦的是要准备硬件(毕竟不再像其他操作系统课程一样装个虚拟机就搞定了),指导中给出的清单是:

  • 1 Raspberry Pi 3
  • 1 1⁄2-sized breadboard
  • 1 4GiB microSD card
  • 1 microSD card USB adapter
  • 1 CP2102 USB TTL adapter w/4 jumper cables
  • 10 multicolored LEDs
  • 4 100 ohm resistors
  • 4 1k ohm resistors
  • 10 male-male DuPont jumper cables
  • 10 female-male DuPont jumper cables

因为不是正式的学生,只是借助公开的材料学习,材料只好自己准备了,下面的清单供参考:

  • 1 Raspberry Pi 3b(淘宝购入,之前一直没买怕吃灰,现在借这个项目的契机购入)
  • 1 1⁄2-sized breadboard(面包板,我不太懂 1⁄2-sized 是什么规格,查下来好像 5.5 cm x 8.5 cm 这么大,我多备了一块)
  • 1 4GiB microSD card (用了闲置的 16GB microSD card)
  • 1 microSD card USB adapter (同上)
  • 1 CP2102 USB TTL adapter w/4 jumper cables(用CP2102 USB TTL在淘宝上搜就可以找到,需要和指导里的图片对比一下,好像淘宝上有卖多合一的,那个我看和指导里不一样,没敢买,还是买了和指导里外观一样的)
  • 10 multicolored LEDs (各种颜色的LED * 10,我直接买了组合装,共100个,含多种颜色(我曾经以为是可以显示多种颜色的LED,但是看后面内容好像并不是这个样子))
  • 4 100 ohm resistors & 4 1k ohm resistors (100Ω 和 1kΩ 电阻各 4 个,这两项我也是买了组合装,各种阻值各20个)
  • 10 male-male DuPont jumper cables(公对公杜邦线 * 10,直接买了一组)
  • 10 female-male DuPont jumper cables(公对母杜邦线 * 10,直接买了一组)

除了Raspberry Pi,microSD card 和读卡器,其他材料在淘宝上购买,只花了约 30 元(不含邮费),感觉还是比较便宜的(基本上因为最小出售单位的缘故,都比需求数量多出1~2个数量级...但是依然花费不多),这套材料目前做下来没有遇到什么问题。

接下来就是利用提供的 Binary 把这个 Blinky 跑起来,这部分的指导相当详细,一步步做就可以完成,主要是熟悉操作。

第三阶段就是用 C 来实现 Blinky 了,这一阶段我认为是这一次作业的核心。主要的知识点是利用 memory-mapped I/O 和硬件通信。也就是硬件会有个规范:当特定内存地址被读/写时会发生什么,通过这个方式暴露自己的功能。

具体到这里就是查文档搞明白要实现效果需要哪些操作,用 C 写出来。指导相当详细,甚至连有关信息在文档第几页都有指出。

第四阶段,Rust 终于出现了,我们要把第三阶段完成的 C 代码翻译成 Rust,因为整个部分都在 unsafe 里,基本是直接翻译。

(个人感觉学 Rust 最好不要太快接触 unsafe, 毕竟用了 unsafe 就放弃了编译器的很多保护,不过操作系统里,脏活太多了,unsafe 还是必须的)

总之,Assignment 0 作为第一个作业,内容不是很多,主要是熟悉环境,还没有完全展开。主要的知识点就是 memory-mapped I/O.

编辑于 2018-01-30

文章被以下专栏收录