起因
偶然报名全国大学生计算机能力大赛,刚好给自己找个学习的借口,从而开始了RISC-V内核开发学习
有个学习计划的重要性
凡事预则立,不预则废。
由于不是计算机系的学生,加上是一时兴起刚开始没有指导老师,完全不知道怎么学习,printf()
的%d
和%s
、指针的引用和解引用,练习了多少遍仍然只是停留在小孩子过家家的水平,真正意义上的计算机程序没能开始一点
x86计算机下第一个Hello World的生成
大抵是没有人监督吧,始终没有去搜索一个认真教程的想法。并且最大的一个问题是,大部分教程实际完全不针对我这样一点都不懂水平的学生,从而看不懂一点教程的内容。 但是大抵是这样的过家家实在是过不下去了吧,我开始在网上搜视频教程了。第一个视频教程刚好水平挺合适的,其假设屏幕面前的学生不懂计算机的组成原理,不懂汇编,而这和我刚好非常符合。跟着这个教程,我学会了CPU的重要单位寄存器,了解了程序在内存中的储存,学会了x86实模式的汇编。在这样的情况下,我成功加载了磁盘中的MBR,并通过MBR加载了第二个扇区,通过第一个扇区显示MBR并通过终端清空屏幕,调用二个扇区显示出了不同颜色的OK
课程的切换
但是课程迅速进入到了保护模式,迅速察觉到了这是x86架构特有的,必然不适用于我们所需要的RISC-V架构,在有了学习热情的情况下,我开始主动寻找继续适用的教程,找到了一个虽然暂时和RISCV无关,但是相当有用的教程,在这个教程中,我第一次了解了调试竟然是如此有用,是任何的数据类型哪怕是函数都无所谓,在内存只不过是位数的大小罢了,从而更深地理解了指针。
难但是胜于一切的课程
上面的两个课程是通过实战来学习知识,但是终究差了很多基础应当掌握的知识,这必然会导致我之后学习中缺失太多东西,从而我在一篇知乎问答中得知了6.S081这门课程。作为麻省理工学院的课程,它有着很多和国内课程不一样的内容。其要求学生在课前完成要求的课前预习,否则相当难以听懂课上的内容。除此外就是这个课程最大的区别:鼓励学生在Lab中完成内容而非仅仅是听课。在这个课程中,我的C语言的能力得到了很多提升,第一次去尝试读大佬的极为简洁的代码并且进行模仿(虽然我用了好久去模仿出来的代码总是出各种各样的错误)。所以现在我正在将这门课程和另一个MOOC上的RISC-V汇编的课程同步进行学习到现在。 ***
针对无计算机知识但有一部分程序经验学生的RISC-V学习路线推荐
工欲善其事必先利其器
最不能少的就是C语言或者Rust语言的掌握(大抵是太久没能接触程序了,对当前程序语言的形式有点误判,实际现在大公司已然开始尝试Rust重构大量项目,而不知情的我仍然选择了C语言的学习)。C语言的逻辑一定要掌握透彻,指针等一定要掌握牢实,否则之后的内容将会付出很多代价。
在已然熟练了C语言的逻辑后,是时候开始针对底层代码书写的逻辑了,在这里我有着以下的学习路径推荐:
-
理解程序的一切在内存中都是代码(关了灯都一样())。这是相当重要的一个思路拓展,我建议通过这个教程学习:Linux之父:如何融汇贯通汇编和C语言,成为计算机界大佬!,虽然这个老师的风评不大好,也自负过头了,但是这个思维对我影响非常大,非常建议观看。在这里还可以试着学会以前绝对不会使用的调具。
-
在对高级语言掌握了一些后,就可以开始学习汇编代码的书写。在这里呢就有些小分歧了。 2.1 如果你是个急性子,无法接受一直学习枯燥的RISC-V的汇编基础知识,可以先跟着从零开发操作系统实操x86的基础汇编从而开始熟悉汇编这种东西。但是到保护模式就可以停下照着2.2的内容跳着看或者直接照着RISC-V的官方手册学习了。 2.2 但是如果你觉得浪费时间在x86汇编上难以接受,并且觉得接触点枯燥的基础内容也无所谓,就可以跟着这个循序渐进,学习开发一个RISC-V上的操作系统 - 汪辰直接从RISC-V的汇编开始学习,这个教程的质量相当高,可惜就是开始的内容太过于应试化,加之啰嗦的基础知识过多,可以选择性观看。
-
目前通过以上的课程都可以学习到零碎的操作系统组成原理,但是这非常容易让你在之后的学习中突然遇到难以理解的知识并且难以将各种知识形成一个系统的理解。在这种情况下系统学习操作系统组成原理成为了急需。对此我给出以下的课程建议。
- 3.1 [困难]6.S081。作为麻省理工学院的的一门公开课,其拥有着相当高的质量。其使用xv6系统作为系统示例。这个课程在互联网上的评价相当高。但是就我的实际体验上来说,其授课方式和普通大学差别过于大,并且其默认你已经学过相当多的基础知识,其实不大适合类似我这样的学生。但是为什么要把它放在这里呢,其最重要的一点是你如果真的肯花时间在上面,你可以通过它学到相当多的知识。通过它你确实可以掌握一个现代的操作系统是怎么运作的,可以看到xv6这样的极度优秀的代码,如果花时间看懂它并且照着课程的Labs要求完成作业一定能有很大的收获,尤其是对C掌握不好的学生(例如我)。这门课有2020年版本的课程录像,可以在B站上找到中文翻译
- 3.2 [中等] 操作系统原理 (南京大学蒋岩炎) 这门课程相对6.S081难度小了很多,并且采用中文授课也容易理解很多。在授课方式上有些类似6.S081,将很多教学内容放在了个人的网站上。并且鼓励学生做实验。但是个人觉得学到的内容不如另外两门课。
- 3.1 [困难]6.S081。作为麻省理工学院的的一门公开课,其拥有着相当高的质量。其使用xv6系统作为系统示例。这个课程在互联网上的评价相当高。但是就我的实际体验上来说,其授课方式和普通大学差别过于大,并且其默认你已经学过相当多的基础知识,其实不大适合类似我这样的学生。但是为什么要把它放在这里呢,其最重要的一点是你如果真的肯花时间在上面,你可以通过它学到相当多的知识。通过它你确实可以掌握一个现代的操作系统是怎么运作的,可以看到xv6这样的极度优秀的代码,如果花时间看懂它并且照着课程的Labs要求完成作业一定能有很大的收获,尤其是对C掌握不好的学生(例如我)。这门课有2020年版本的课程录像,可以在B站上找到中文翻译
结语
这是我个人博客时隔三年第一次更新内容,写得不好多多包容。本篇文章是个人经历踩了太多坑后总结的内容,只能小小作为参考,若是想要深入学习相关内容请结合自身情况上网查询资料制作属于自己的学习计划。这个博客之后若是可能将会更新一个教程,针对非计算机专业的学生的RISC-V的学习教程,若感兴趣可以试着关注下去。