为什么没06
因为新代码就不要求虚拟内存
我写完这些剩下的时间也不多了,而且还有别的课设
所以这部分就摸了
对pintos整个的体验
说实在的,这个项目挺难的
很多时候感觉这个项目太自由,导致我几乎无从下手
但这个项目其实也挺好的
因为它给了一个不高不低的起点
pintos本身已经实现了基本的启动之类的功能
实际开发时是不需要动很多汇编的东西的
但起码要看懂寄存器之类的含义
目前pintos主要有两个版本
一个是使用最广泛的版本,PKU、KAIST等都在用的版本
另一个就是我们用得跟CS162同步的版本
使用广泛的版本相对简单些,参考多,实现的功能也少一点
我也建议如果是自学的话还是用这个流传广泛的版本会舒服一些
等写完这个版本再看看CS162的版本也来得及,大部分代码思路还是通用的
新版本和老版本比较
新版本不要求vm的部分,然后userprog作为project-1
跟老版本比的话新版本的内核空间和用户空间判断更严了
然后每个子项目对比userprog多了fpu
threads多了user thread的内容,少了BSD调度
filesys之前没写,所以我也不清楚
新版本的门槛比老版本高许多
毕竟是userprog起手,上来就要了解下调用约定
而且introduction部分还有一点啸问题
不像老版本起手alarm-sleep修改,前置知识少很多
起码我之前写老版本的时候逻辑是连贯的
但写新版本的代码很容易卡住,然后到处查东西
测试机的体验
我是历史学家,这就是史
会出现相同代码跑测试会跑出不同的分数
我只能说我没意见好吧
如果说测试机上面跑两次就会有不同的结果
那我线下测试这么多次老早就改明白了,所以是谁的问题呢
然后还有交threads的部分
老代码确实有THREADS的编译宏,但新的代码基有THREADS、USERPROG、FILESYS这仨
测试机编译莫名其妙只有THREADS的部分,过不了是我的问题吗
而且最猛的是,我直接交代码基,一行不改,也是这样,只能说真没人检查过啊
(我当然知道只要我的代码跟代码基用同样的编译宏就肯定有一样的问题,只是这样测试过之后更觉得学校草台)
make[1]: Entering directory '/home/vagrant/ag/pintos/src/threads/build'
gcc -m32 -c ../../threads/thread.c -o threads/thread.o -ggdb3 -O0 -march=i686 -fno-pic -fno-inline -fno-stack-protector -nostdinc -I../.. -I../../lib -I../../lib/kernel -Wall -W -Wstrict-prototypes -Wmissing-prototypes -Wsystem-headers -DTHREADS -MMD -MF threads/thread.d
../../threads/thread.c: In function 'init_thread':
../../threads/thread.c:467:6: error: 'struct thread' has no member named 'pcb'
t->pcb = NULL;
^~
../../Make.config:53: recipe for target 'threads/thread.o' failed
make[1]: *** [threads/thread.o] Error 1
make[1]: Leaving directory '/home/vagrant/ag/pintos/src/threads/build'
../Makefile.kernel:10: recipe for target 'check' failed
make: *** [check] Error 2
理论上这个的编译指令应该是这样的
gcc -m32 -c ../../threads/thread.c -o threads/thread.o -ggdb3 -O0 -march=i686 -fno-pic -fno-inline -fno-stack-protector -nostdinc -I../.. -I../../lib -I../../lib/kernel -Wall -W -Wstrict-prototypes -Wmissing-prototypes -Wsystem-headers -DTHREADS -DUSERPROG -DFILESYS -MMD -MF threads/thread.d
可以看到少了什么,少了那几个编译宏
虽然经过我一晚上的测试,发现测试机只测试threads的部分,不会测试userprog和filesys部分
但本地测试的时候是会全部测试的,谁知道测试机只测threads
那测试机只有THREAD编译宏确实是能跑的
而且使用初始代码基也没法跑,所以是谁的问题呢
而且如果跑filesys测试,会出现下面更搞笑的东西
以下文件必须包含在您的代码中, 但无法找到. 请确认以下文件都存在 :
./pintos/src/inode.c
filesys的源文件inode.c直接放跟目录是吧
原始代码基也会这样
(不过把这个文件复制一份到根目录也就行了,只不过意义不明)
或许就不应该有这样的期待,我还以为学校总算有点好的课程了,但期待越高,砸得越狠
但经过这学期别的抽象课程洗礼后,只能说这门课好歹尝试引入国外优秀课程,但结果坏了
总比某门vc6.0实践技术要好一点点
我为什么完整记录我的开发过程
其实很简单,因为我发现中文互联网上貌似没有高质量的pintos的开发记录
以至于我前期遇到一些问题的时候只能啃外网的资料
(也不是不能啃,但不是原生语言,效率就比较低)
学校给的文档是机翻的,还不如啃原文
(生草机强力驱动)
而且后来发现之前写的和学校要求的都不是一个版本
(操作系统老师开学就开始提,也没说这个事情)
加上新的代码,又缺少相关的文档,连起码的任务说明都没有,写得是真的很难受
项目是好项目,但学校执行的是真的很烂
pintos在正主学校里面,是一个持续一个学期的项目
除了pintos的源码与文档,还配有完整的视频课程和助教阵容
而我们就没那么好运了,学校给的只有文档,这我认为是不够的
考虑到我是数媒专业的学生,汇编语言这门课不在我的专业课中
所以在我写到系统调用的时候,我基本上是再学一门汇编语言这样写下去的
好在油管上我能找到KAIST大学的pintos的视频课,很多概念看着视频也就理解了
于是我觉得我有必要完整记录我的开发过程
还有一件小事
我们学校操作系统课程设计是有一个QQ群的
有一次我看到有个同学发一个错误
里面写的是大概意思就是找不到clang,问怎么解决
我写这段不是想表示怎么这个都不懂
如果我是老师,我都不会怪这位同学
因为学校确实是没讲过C/C++有哪些编译器,编译是怎么样的流程
甚至这个课设也没讲该怎么讲环境配置
(准确来说讲的是老版本的环境配置)
你说这些东西基础吗,那确实是基础
但现状就是大部分人可能连自己写的程序用什么编译器都不知道
我认为,如果学校觉得这个是常识但有人还不知道,那就是学校没教好
因为起码目前看,大学是不会按学生的专业能力分专业的
一路考试过来,能确定的是学生的语数英和选课成绩但不能确定学生的计算机水平
如果想从这样的生源中培养计算机学生,学校必须把完整的一整套知识全部梳理一遍
这样可以保证对计算机不熟的学生,在大学4年后能有足够的能力应对工作
不然就像现在,我觉得我们基本就是自学,老师的作用就是布置课设
通过课设筛选有能力的学生,剩下相对没能力的学生就好像被抛弃了一样
关于C和Rust
这个算题外话
我写这个项目前,我习惯用的都是“GC系”的语言
(就是使用垃圾回收机制的语言)
虽然C++会一点,但一直不敢入门C,感觉会非常烧脑
全是指针,完全面向过程,没有一点对象,我感觉把握不了
学校操作系统课设要写这玩意,那不得不上马了
真上手写C的时候,刚开始确实很痛苦
怎么没函数重载,怎么没class,指针还满天飞
然后写了几段代码,很快就上手了
我现在感觉,C其实C++简单
C里面很纯粹,就是值传递和指针传递
而且万物都可以是指针,只要能穿明白类型,非常自由
就像真的手操内存一样,写起来也像是汇编一样自由
而且没有重载之类的,链接器也不容易出问题
反观C++,在入门的时候,连接器是天天报错的,而且很容易一头雾水
然后有赋值传递,指针传递,引用传递,很容易乱
其他还有很多比较劝退的点
当然也可以说我学的不好,但不得不承认C在概念上确实是比C++简单得多
在写这段项目前,我室友学Rust的时候,我跟着看了一段时间
他是站Rust拥护者那边,我那时候是站对立面的
我每天都会在那边扣Rust语法怎么神秘,缺少什么语法糖
他就说这样设计挺好的,没啥问题,能用
在我写这个项目之后,我现在对Rust改观还是挺大的
我不应该把Rust看作是Java、C#的代替品
如果把Rust看着是C和C++的代替品,那确实能解决很多问题
可以既有足够底层的交互又有强类型的限制
我觉得对于一门编程语言,首先要考虑的是它面对的问题
对于Python、C#之类的语言,它们面对的更多是业务代码
那就需要足够多的语法糖来提高代码的可读性
而对于C这样的语言,它需要面对的更多是硬件和系统的交互
对它来说更关键的是足够的底层,要尽量少的抽象
如果写业务逻辑,虽然Rust也能写,但我不会选择Rust
但如果跟硬件和系统打交道,我之后还真可能会选择Rust试试