通过9个Linux-0.11实验学习操作系统
简介
2019年秋,我自学了一下哈工大的操作系统课程,感觉其设计的教程和实验作为操作系统入门是个不错的选择(虽然是基于较老的Linux-0.11写的)。实验大致覆盖了操作系统中的核心概念,例如启动、中断、外设IO、上下文切换/系统调用,进程管理与调度,进程间通信,内存管理/地址转换,文件系统等。而且每个实验在教材中都有对应的说明,做起来很顺畅。我做完后整理了一下相关资源,希望能帮到一些自学的同学。
指导教材
该课程使用的教材是 李治军 和 刘宏伟 编著的《操作系统原理、实现与实践》(ISBN: 978-7-04-049245-3),你可以在 这里 获得。除了和课程对应的实验,这本书还在最后设计了4个大的项目,包含内核级线程,虚拟内存,GUI以及网络协议的实现。
另外,赵炯 编著的《Linux内核完全注释-内核版本0.11》也是一本不错的参考书,你可以在 这里 获取。
实验资源
你可以在 Hack-Linux-0.11 上获得开发环境需要的工具,以及每个实验的参考代码、示例效果和注意事项。该仓库的布局说明如下:
oslab.zip:原Linux 0.11的代码和在GNU/Linux下开发所需的工具,例如Bochs 2.3.7和GCC 3.4。
tmp/: 一些杂项,和主体实验没什么关系。
Lab 6.Ext. Print paging status/: 在完成实验6后,我设计了一个打印页地址转换的实验。
其他的八个目录与书上的八个实验相对应,每个目录包含的是相对于原Linux 0.11更改的文件,另外还有一份README.md,说明了实验的注意事项以及示例效果。
通过使用 rsync
和 cp
这类的工具,我们可以方便的修改原始的Linux 0.11代码,并运行修改后的内核。例如,在我的机器上,可以通过以下bash命令来运行Lab 6.Ext.对应的内核:
:~/tmp/oslab$ rsync -a ../Hack-Linux-0.11/Lab\ 6.Ext.\ Print\ paging\ status/linux-0.11/ ./linux-0.11/ :~/tmp/oslab$ sudo ./mount-hdc :~/tmp/oslab$ cd ./hdc/usr/include/ :~/tmp/oslab/hdc/usr/include$ sudo cp ../../../../Hack-Linux-0.11/Lab\ 6.Ext.\ Print\ paging\ status/hdc/usr/include/* . :~/tmp/oslab/hdc/usr/include$ cd ../../.. :~/tmp/oslab$ cd linux-0.11/ :~/tmp/oslab/linux-0.11$ make && ../run
环境搭建
本下载oslab.zip后,你可以参考 HIT-MANUAL 完成实验环境的搭建。要注意的是,在搭建过程中可能会遇到32位库缺失问题,可以通过指定安装对应的32位版本库或者multilib
解决,例如:
:~/tmp$ sudo apt install gcc-multilib linux-libc-dev:i386
另外,某些头文件或者库在不同的GNU/Linux发行版或者不同版本的系统中放置的位置可能不同,例如 /usr/include/asm
与 /usr/include/asm-generic
,可以做一下链接:
:~/tmp$ ln -s /usr/include/asm-generic /usr/include/asm
最后,当你不知道某个文件或文件夹对应的库时,可以使用 apt-file
这个工具进行查找,例如:
:~/tmp$ apt-file search /usr/include/asm gcc-multilib: /usr/include/asm linux-libc-dev: /usr/include/asm-generic/auxvec.h ...
P.S.
虽然这几个实验设计的都不错,但由于平台和代码年代久远,以及C本身的一些特性,在实验的过程中总会遇到一些历史遗留问题或者设计缺陷。我现在正试着基于RISC-V平台用Rust写一个教学型的操作系统,目前刚刚开始,如果你对此也有兴趣,就请联系我吧!