前言
最近正好在学习Rust,然后在rustcc上看到了相关的信息就想着来参加一下。记录一下整体的学习过程。
第一阶段总结
因为断断续续学习过rust相关的语法,而且以前学校上过C++的课程,所以对于一些概念上的东西理解还是比较容易上手,但是因为工作了好几年,平时的工作代码量不高。所以第一阶段做一些概念上的test还可以。到了第二阶段刚开始有点捉襟见肘。
第一阶段总结
学校的操作系统以理论偏多,而且当时确实没有特别好的实验指导,记得当时还花重金买了一本《操作系统真相还原》,但是由于一些原因没有做下去。这次正好补上。
环境为了方便,就直接选择了docker,但是docker有个问题就是gdb调试的时候每次都要打开一个窗口,要有一点docker和tmux的基础。
Chapter 1
第一章讲述了怎么写一个 Bare-metal 应用,涉及到了一些内存布局、汇编、链接器之类的知识,而且上学时候还是有好好学习的,所以压力不大,对于一些不懂的概念可以结合BlogOS,但是要注意一些细节。
Chapter 2
第二章,主要引入了特权级的概念,以前也知道这个,但是具体的是怎么实现的还真没有相关的了解。重点在于串起来整个应用的启动流程,先通过汇编指令在固定位置加载内核代码。内核代码中完成应用初始化后,最后再通过一个trap上下文来跳到应用态。整体因为不涉及地址空间所以还是比较简单。
Chapter 3 & Lab 1
第三章,引入了分时多任务,出现了任务切换的概念,核心在于任务切换是在两个 Trap 控制流间跳转,达到切换应用的目的。同时也引入了时钟中断,时钟中断主动在trap中处理切换。还有一个点就是用户态的时候,S的时钟中断是无法屏蔽的。
实验1,这个实验其实是个人感觉前三个实验最难的,当时想了好几天,一直想精确的统计应用启动的时间,甚至想过通过寄存器的值来区别应用是否被切换了,但是没有成功,最后通过和群里的同学交流后,知道了不需要很精确。就直接在 TCB 里面加启动时间字段,初始化为0,在切换的时候在加一个启动时间的判断,注意第一个应用的启动时间可以直接在first_task中设置。syscall个数通过数组计数即可。
Chapter 4 & Lab 2
第四章,引入了页表。但这个其实当时上学理解的比较透彻,所以还是比较容易的,内核只有一个内核应用空间,内核空间创建的时候就对整个剩余可用的其中几个空间做了一个恒等映射,设置完之后启动页表硬件设置,然后平滑迁移的过程以及跳板的设计是比较精妙的,还有就是初始化为0的静态/全局变量也默认在.bss段。
实验二,没有理解在指针指向的数据跨页的情况。个人理解即使数据跨页,变量在分配的时候虚拟地址是连续的,物理地址足够的情况下也应该是连续分配的,test没做相关的考虑。
mmap和unmap分配内存主要在于增加限制条件的判断,最开始没有注意启动位置要对齐,导致用例不过,其他的没有什么问题。
Chapter 5 & Lab 3
第五章,引入了进程,了解到了 “idle task”。任务切换每次都要到 idle 控制流然后又从idle控制流通过调度算法切换到新任务。
实验三 参照fork和exec的代码即可。
结语
参加本次训练营真的受益匪浅,把os的理论和实践结合起来真的很有意义。因为平时还要工作,已经超过了第二阶段上课时间一周才做完前三个实验,后面努力做完剩余两个实验。感谢本次训练营的老师,能提供这么优秀的课程和资源!!!