简介

2019年秋,我自学了一下哈工大的操作系统课程,感觉其设计的教程和实验作为操作系统入门是个不错的选择(虽然是基于较老的Linux-0.11写的)。实验大致覆盖了操作系统中的核心概念,例如启动、中断、外设IO、上下文切换/系统调用,进程管理与调度,进程间通信,内存管理/地址转换,文件系统等。而且每个实验在教材中都有对应的说明,做起来很顺畅。我做完后整理了一下相关资源,希望能帮到一些自学的同学。

指导教材

该课程使用的教材是 李治军 和 刘宏伟 编著的《操作系统原理、实现与实践》(ISBN: 978-7-04-049245-3),你可以在 这里 获得。除了和课程对应的实验,这本书还在最后设计了4个大的项目,包含内核级线程,虚拟内存,GUI以及网络协议的实现。

另外,赵炯 编著的《Linux内核完全注释-内核版本0.11》也是一本不错的参考书,你可以在 这里 获取。

实验资源

你可以在 Hack-Linux-0.11 上获得开发环境需要的工具,以及每个实验的参考代码、示例效果和注意事项。该仓库的布局说明如下:

  1. oslab.zip:原Linux 0.11的代码和在GNU/Linux下开发所需的工具,例如Bochs 2.3.7和GCC 3.4。

  2. tmp/: 一些杂项,和主体实验没什么关系。

  3. Lab 6.Ext. Print paging status/: 在完成实验6后,我设计了一个打印页地址转换的实验。

  4. 其他的八个目录与书上的八个实验相对应,每个目录包含的是相对于原Linux 0.11更改的文件,另外还有一份README.md,说明了实验的注意事项以及示例效果。

通过使用 rsynccp 这类的工具,我们可以方便的修改原始的Linux 0.11代码,并运行修改后的内核。例如,在我的机器上,可以通过以下bash命令来运行Lab 6.Ext.对应的内核:

qiuhaoli@VM:~/tmp/oslab$ rsync -a ../Hack-Linux-0.11/Lab\ 6.Ext.\ Print\ paging\ status/linux-0.11/ ./linux-0.11/

qiuhaoli@VM:~/tmp/oslab$ sudo ./mount-hdc 

qiuhaoli@VM:~/tmp/oslab$ cd ./hdc/usr/include/

qiuhaoli@VM:~/tmp/oslab/hdc/usr/include$ sudo cp ../../../../Hack-Linux-0.11/Lab\ 6.Ext.\ Print\ paging\ status/hdc/usr/include/* .

qiuhaoli@VM:~/tmp/oslab/hdc/usr/include$ cd ../../..

qiuhaoli@VM:~/tmp/oslab$ cd linux-0.11/

qiuhaoli@VM:~/tmp/oslab/linux-0.11$ make && ../run

环境搭建

本下载oslab.zip后,你可以参考 HIT-MANUAL 完成实验环境的搭建。要注意的是,在搭建过程中可能会遇到32位库缺失问题,可以通过指定安装对应的32位版本库或者multilib 解决,例如:

qiuhaoli@VM:~/tmp$ sudo apt install  gcc-multilib linux-libc-dev:i386

另外,某些头文件或者库在不同的GNU/Linux发行版或者不同版本的系统中放置的位置可能不同,例如 /usr/include/asm/usr/include/asm-generic ,可以做一下链接:

qiuhaoli@VM:~/tmp$ ln -s /usr/include/asm-generic /usr/include/asm

最后,当你不知道某个文件或文件夹对应的库时,可以使用 apt-file 这个工具进行查找,例如:

qiuhaoli@VM:~/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写一个教学型的操作系统,目前刚刚开始,如果你对此也有兴趣,就请联系我吧!

通过9个Linux-0.11实验学习操作系统的更多相关文章

  1. 【从头到脚品读 Linux 0.11 源码】第一回 最开始的两行代码

    从这一篇开始,您就将跟着我一起进入这操作系统的梦幻之旅! 别担心,每一章的内容会非常的少,而且你也不要抱着很大的负担去学习,只需要像读小说一样,跟着我一章一章读下去就好. 话不多说,直奔主题.当你按下 ...

  2. Linux 0.11源码阅读笔记-文件管理

    Linux 0.11源码阅读笔记-文件管理 文件系统 生磁盘 未安装文件系统的磁盘称之为生磁盘,生磁盘也可以作为文件读写,linux中一切皆文件. 磁盘分区 生磁盘可以被分区,分区中可以安装文件系统, ...

  3. Linux 0.11源码阅读笔记-总览

    Linux 0.11源码阅读笔记-总览 阅读源码的目的 加深对Linux操作系统的了解,了解Linux操作系统基本架构,熟悉进程管理.内存管理等主要模块知识. 通过阅读教复杂的代码,锻炼自己复杂项目代 ...

  4. Linux 0.11下信号量的实现和应用

    Linux 011下信号量的实现和应用 生产者-消费者问题 实现信号量 信号量的代码实现 关于sem_wait和sem_post sem_wait和sem_post函数的代码实现 信号量的完整代码 实 ...

  5. Linux 0.11中write实现

    看了一下Linux 0.11版本号write的实现,首先它在标准头文件unistd.h中有定义 int write(int fildes, const char * buf, off_t count) ...

  6. Linux 0.11源码阅读笔记-总结

    总结 Linux 0.11主要包含文件管理和进程管理两个部分.进程管理包括内存管理.进程管理.进程间通信模块.文件管理包含磁盘文件系统,打开文件内存数据.磁盘文件系统包括空闲磁盘块管理,文件数据块的管 ...

  7. Linux 0.11源码阅读笔记-中断过程

    Linux 0.11源码阅读笔记-中断过程 是什么中断 中断发生时,计算机会停止当前运行的程序,转而执行中断处理程序,然后再返回原被中断的程序继续运行.中断包括硬件中断和软件中断,硬中断是由外设自动产 ...

  8. Linux 0.11源码阅读笔记-块设备驱动程序

    块设备驱动程序 块设备驱动程序负责实现对块设备数据的读写功能.内核代码统一使用缓冲块间接和块设备(如磁盘)交换数据,缓冲区数据通过块设备驱动程序和块设备交换数据. 块设备的管理 块设备表 内核通过一张 ...

  9. 利用bochs调试Linux 0.11内核

    引导程序调试软件bochs,跟配套的linux0.11内核img下载地址分别是: http://sourceforge.net/projects/bochs/http://www.oldlinux.o ...

随机推荐

  1. Maven command

    mvn eclispe:clean mvn eclispe:eclispe mvn clean package mvn clean package -Dmaven.test.skip=true mvn ...

  2. java对象转化为json字符串并传到前台

    package cc.util; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import ...

  3. 防止chrome主页被篡改并设置为默认打开无痕浏览方式

    1. 找到chrome的快捷方式, 右击打开属性 2. 将目标框内容改为以下内容chrome.exe的目录位置 // ----- 引号中的内容为"PATH\Chrome\Applicatio ...

  4. win10 uwp 使用动画修改 Grid column 的宽度

    今天 wurstmitbrot 问如何通过动画修改 Grid 的 column ,虽然 column 是一个依赖属性,可以绑定,但是做出动画还是比较难的. 本文告诉大家如何对 Grid 做动画. 首先 ...

  5. PyODPS DataFrame 的代码在哪里跑

    在使用 PyODPS DataFrame 编写数据应用时,尽管编写的是同一个脚本文件,但其中的代码会在不同位置执行,这可能导致一些无法预期的问题,本文介绍当出现相关问题时,如何确定代码在何处执行,以及 ...

  6. @雅礼集训01/06 - T3@ math

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给出 n, m, x,你需要求出下列式子的值: \[\sum_{ ...

  7. shell awk杂项

    awk '{ ;++i<=NF;){ a[i]=a[i]?a[i]",'\''"$i"'\''":"'\''"$i"'\'' ...

  8. 杭电多校第二场1012 L - Longest Subarray ce 线段树

    这题是真的秀...我服了...线段树用好了,感觉什么都可以写... 题目大意:给你一个串,问满足以下条件的子串中最长的是多长:对于每个数字,要么在这个子串没出现过,要么出现次数超过k次. 我们对于每一 ...

  9. gradle在build的时候找不到某个jar包的解决办法

    前几天公司来新人, 我给他装项目环境的时候遇到一个问题, 在执行gradle build时遇到一系列的错误, 我一个个分析并解决了, 特此记录, 以供他人参考. 一, 首先遇到了找不到spring-b ...

  10. python中break和continue的区别

    python中break和continue的区别   break和continue 1.break 意思为结束循环   例: i = 0 while i<10:     i+=1     if ...