# qianpinyi的心得体会

#### 缘起

​		其实在知道这个比赛之前，我就对操作系统这类底层软件很感兴趣，希望能写出一个自己的操作系统，不过当时基本上还只是空谈，距离动手实践还远。大二开学的时候，我向学校的皮德常老师(当时教我们的C++语言课程) 提到了我对操作系统感兴趣，并希望写操作系统的想法，得到了他的肯定，建立了写操作系统的想法和信心。由于我们学校的课程安排，我们的操作系统课程在大三下才教学(即写该文档的时间点，朱小军老师是我们现在的操作系统课程老师)，我因此在大二下的时候提前旁听刘亮老师的课程。此外，大二下教我们计组的冯爱民老师中途提到龙芯杯，同时也提到了这个操作系统的比赛，不过由于当时了解到已经比较晚了，毫无准备，因此决定参加第二年的比赛（不过现在看来，我们队伍也是拖到了今年比赛报名快截止了才开始写的，果然DDL才是动力啊😂）。



#### 启动前

​		其实也不完全是因为拖拉才开始写得比较晚，我们主要是最一开始不知道该怎么开始，没有比较好的指引和方向，在寒假的时候基本上没能推进什么，只是看些操作系统的理论书籍，当时对操作系统的理解还都只是纸上谈兵。无论是Qemu还是汇编语言，我们都不太了解。就我现在的感受来看，对于工具的使用教程这一块网上还是太少了点，比如qemu怎么安装和使用，需要什么工具链，怎么安装，整体的开发流程和思路是怎样的。在比赛结束后，我希望也能像rCore、uCore那样为初学者们提供学习的教程。



#### 开始开发

​		我们的指导老师先后给出的他们的经验，我们结合了自己的情况进行实践，渐渐地启动了起来。当时是看了一个教Riscv用OpenSBI实现裸机Hello world的博客，我们才真正算是启动起来了。启动起来之后，从那之后一个月多一点时间，我们越来越全身心投入到我们的操作系统的开发中。一步一步地，我们突破的启动、物理内存管理、进程管理... 各个模块。看着自己的操作系统渐渐成型，非常具有成就感，也对原先学的理论知识有了更深刻和具体的理解。

​		在开发过程中，我们遇到了多次瓶颈与困难，但我们现在都一一克服了，这确实是我收获相对很大的一段时间。也是对我编程能力的考验和磨练。原先我认为自己的抽象能力还可以，对大项目的把握能力还可以，不过现在看来还是需要进一步提升的，很多地方设计的时候总感觉设计的不是很好，主要是缺乏经验和全局性、前瞻性的认识。这次项目也是一次试手，只有实际写过才能知道到底需要些什么。



#### 赶DDL的感受

​		原先比赛的截止日期是5月底，当时月底最后几天的时候我真的是非常的慌，因为我觉得时间太紧了，而且还有bug调不出来（虽然这几天也是）。还好组委会延期了5天，我们才能勉强完成初赛的内容。其中一些设计、结构、以及系统调用的对接并未经过充足的考虑，可能存在一定的缺陷，一部分系统调用，由于我们设计思路和Linux的差异，也暂时无法实现完整的功能。一部分功能也是为了调试或测试加的，还没有清理干净。包括这些文档，我们也是在最后倒数第二天晚上才开始撰写，难免对各个方面可能又遗漏或说明不够清楚的，还请大家见谅了（后续应该会补上）。



#### 文档编写的感受

​		就我个人而言，我是不太喜欢写文档和注释的，我之前写过一个GUI库 [PAL_GUI](https://github.com/qianpinyi/PAL_GUI) ，这是我第一个写的大型项目(个人认为)。这个我高中就开始写了，不过到现在都没有文档，导致一直安利不出去，而且我喜欢把所有东西都写在一个文件里(类似于hpp那样使用)，导致很多人不理解，就更无人问津了/(ㄒoㄒ)/~~。

​		不过这次写操作系统，我认为是一个更复杂的项目了，而且是和队友合作实现的，比赛官方也提出了文档要求，其他学习的同学也会需要，因此这次我打算好好写文档。其实写文档也还是挺开心的，只是之前懒，觉得有时间写文档不如多写几行代码🤣。而且我个人认为我的变量命名本身也可以起到一定的文档作用啊😅。

​		虽然我们是最后两天才写文档的，但是此前我们通过Onenote合作时已经做了很多记录了，因此这些部分可以直接用记的笔记。



#### 工具使用方面的感受

​		上面也提到了，开发操作系统中非常重要的一个方面就是工具，我们早期无法启动就是因为不知道用什么工具，怎么用工具。我们最初是在虚拟机上安装工具链的，使用起来还是不够顺手的，后来我们尝试了将工具链安装在WSL1上，解决了一部分问题后，发现这是真的香，因为我可以在自己熟悉的平台上用熟悉的IDE（指devcpp）进行开发，效率简直是拉满。可能有人会好奇为什么偏要用devcpp，这也是很多同学提过的问题，其实我只是单纯因为打算法比赛太久导致形成了习惯，换IDE会大大降低效率罢了。

​		另一方面，选择的程序语言作为最重要的工具之一，我们采用了C++，原因主要是我们对C++最为熟悉，避免在语言上耗费太多精力。并且，使用C++进行开发也有若干的好处（虽然Linus不这么觉得🤐），例如在操作系统当中，存在着非常多的要面向对象的场景，而C++提供了类，从语言层面进行了支持，继承、成员函数、运算符重载等也为我们的开发提供了大量的便利。并且函数重载也允许我们为一些操作提供默认参数，或提供不一样的形式，有利于简化代码，弄清结构。此外，模板更是一个非常强大的利器，我们可以利用它实现很多基础设施，写出更为通用的代码，并将大量开销解决在编译阶段，从而提高系统效率。包括常量表达式、using别名、命名空间等都为我们写出更好的代码提供了有效的帮助。并且C++和C能非常好地对接，在移植驱动等情况下也能很好地工作。（当然也有缺点，就是对程序员要求高了，需要他们足够了解这门语言，当然我现在也还只是懂点皮毛😶）



-------------

By：qianpinyi

2022.06.04