通过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 ...
随机推荐
- nodeJs学习-02 fs模块(文件操作)
读文件: const fs = require('fs'); //读文件(异步) readFile(文件名,回调函数) fs.readFile('section03/testData/aaa.txt' ...
- iOS-CoreLocation:无论你在哪里,我都要找到你!
作者:@翁呀伟呀 授权本站转载 CoreLocation 1.定位 使用步骤: 创建CLLocationManager示例,并且需要强引用它 设置CLLocationManager的代理,监听并获取所 ...
- ListOfOpenSourcePrograms
ListOfOpenSourcePrograms Contents Desktop Applications Communication Engineering Educational Financi ...
- 性能改善后复杂SQL
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-/ ...
- 手写call,apply方法实现
call Function.prototype.myCall = function(){ var object = arguments[0]; var arr = []; for(var i = 1; ...
- 分布式TensorFlow集群local server使用详解
通过local server理解分布式TensorFlow集群的应用与实现. 简介 TensorFlow从0.8版本开始,支持分布式集群,并且自带了local server方便测试. Local ...
- Java反射机制(一):认识Class类
一. 认识Class类 1.1 正常我们再使用一个类时,大多情况是先获取类的对象,然后通过对象去操作类中的属性或方法. 那,大家有没有想过,如果我们已经有了一个类的对象,我能否通过该对象去获取到类的信 ...
- MYSQL设置远程账户登陆总结,mysql修改、找回密码、增加新用户,MySQL数据库的23个注意事项
1.5 设置及修改Mysql root用户密码1 设置密码方法mysqladmin -u root password '123456'mysqladmin -u root -p'123456' pas ...
- border写一个直角三角形
文章地址 https://www.cnblogs.com/sandraryan/ border的四条边是平分的.你可以放大试试 .box1 { width:;; border: 100px solid ...
- P1112 区间连续段
题目描述 给你一个长度为n的数组 \(a_1, a_2, \dots a_n\) . 一开始这n个元素都为0. 然后有m次操作,每次操作有两种操作类型: update x y a:将区间 \([x,y ...