通过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.对应的内核:
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实验学习操作系统的更多相关文章
- 【从头到脚品读 Linux 0.11 源码】第一回 最开始的两行代码
从这一篇开始,您就将跟着我一起进入这操作系统的梦幻之旅! 别担心,每一章的内容会非常的少,而且你也不要抱着很大的负担去学习,只需要像读小说一样,跟着我一章一章读下去就好. 话不多说,直奔主题.当你按下 ...
- Linux 0.11源码阅读笔记-文件管理
Linux 0.11源码阅读笔记-文件管理 文件系统 生磁盘 未安装文件系统的磁盘称之为生磁盘,生磁盘也可以作为文件读写,linux中一切皆文件. 磁盘分区 生磁盘可以被分区,分区中可以安装文件系统, ...
- Linux 0.11源码阅读笔记-总览
Linux 0.11源码阅读笔记-总览 阅读源码的目的 加深对Linux操作系统的了解,了解Linux操作系统基本架构,熟悉进程管理.内存管理等主要模块知识. 通过阅读教复杂的代码,锻炼自己复杂项目代 ...
- Linux 0.11下信号量的实现和应用
Linux 011下信号量的实现和应用 生产者-消费者问题 实现信号量 信号量的代码实现 关于sem_wait和sem_post sem_wait和sem_post函数的代码实现 信号量的完整代码 实 ...
- Linux 0.11中write实现
看了一下Linux 0.11版本号write的实现,首先它在标准头文件unistd.h中有定义 int write(int fildes, const char * buf, off_t count) ...
- Linux 0.11源码阅读笔记-总结
总结 Linux 0.11主要包含文件管理和进程管理两个部分.进程管理包括内存管理.进程管理.进程间通信模块.文件管理包含磁盘文件系统,打开文件内存数据.磁盘文件系统包括空闲磁盘块管理,文件数据块的管 ...
- Linux 0.11源码阅读笔记-中断过程
Linux 0.11源码阅读笔记-中断过程 是什么中断 中断发生时,计算机会停止当前运行的程序,转而执行中断处理程序,然后再返回原被中断的程序继续运行.中断包括硬件中断和软件中断,硬中断是由外设自动产 ...
- Linux 0.11源码阅读笔记-块设备驱动程序
块设备驱动程序 块设备驱动程序负责实现对块设备数据的读写功能.内核代码统一使用缓冲块间接和块设备(如磁盘)交换数据,缓冲区数据通过块设备驱动程序和块设备交换数据. 块设备的管理 块设备表 内核通过一张 ...
- 利用bochs调试Linux 0.11内核
引导程序调试软件bochs,跟配套的linux0.11内核img下载地址分别是: http://sourceforge.net/projects/bochs/http://www.oldlinux.o ...
随机推荐
- 【BootStrap】--具有增删改查功能的表格Demo
[BootStrap]--具有增删改查功能的表格Demo 目录(?)[+] 前言 版本一 样式 代码 版本二 样式 代码 版本三 样式 代码 总结 前言 bootstrap的表格样式,有类似EasyU ...
- MySQL5.7默认打开ONLY_FULL_GROUP_BY模式问题与解决方案
MySQL5.7后将sql_mode的ONLY_FULL_GROUP_BY模式默认设置为打开状态,这样一来,很多之前的sql语句可能会出现错误,错误信息如下: Error Code: 1055. Ex ...
- C# Find vs FirstOrDefault
本文告诉大家,在获得数组第一个元素时,使用哪个方法性能更高. 需要知道,两个方法都是 Linq 的方法,使用之前需要引用 Linq .对于 List 等都是继承可枚举Enumerable这时获取第一个 ...
- Android 申请权限示例
1.在Mainifest.xml中添加 <?xml version="1.0" encoding="utf-8"?> <manifest xm ...
- hdu 3272 Mission Impossible
Mission Impossible Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- Spark Steaming消费kafka数据条数变少问题
对于基于Receiver 形式,我们可以通过配置 spark.streaming.receiver.maxRate 参数来限制每个 receiver 每秒最大可以接收的记录的数据:对于 Direct ...
- maxCompute odps 行转列
select name ,REGEXP_REPLACE(str,"[\\[\"\\]]",'') from ( select trans_array(, ",& ...
- html5的开发
1.html5的开发组织者: (1)WHATWG:由Apple.Mozilla.Google.Opera等浏览器开发者组成,成立于2004年.WHATWG开发HTML和Web应用API,同时为各浏览器 ...
- Error: Cannot find module 'webpack/bin/config-yargs' 报错原因, webpack@4.X踩的坑~
1 .使用webpack@4.32.2时, 当我通过package.json的script去执行webpack-dev-server时, 报以下错误: Error: Cannot find modu ...
- Python--day72--Cookie和Session内容回顾
1. Cookie是什么 保存在浏览器端的键值对 为什么要有Cookie? 因为HTTP请求是无状态的 Cookie的原理? 服务端可以在返回响应的时候 做手脚 在浏览器上写入键值对(Cookie) ...