文章目录
前言
此文为哈工大李治军老师所教授操作系统课程的配套实验中的实验一 —— 操作系统的引导 的记录。
在学完李志军老师所教授课程后,决定通过实验加深对OS的进一步理解。
所需要说明的是,linux-0.11是linux最早的版本。当前的linux和其相比,早已天差地别。
同时,硬件也发生了较大的变化。(0.11还考虑软盘 floppy disk)
因此,在现在的环境下学习linux0.11,其意义更多的在于扫除操作系统的神秘感。
那为什么不选择更现代的操作系统来进行实验呢?
因为操作系统是真正的复杂系统。太过于庞大,太过于复杂,容易在细节中迷失对操作系统整体的把握。
(太难了, 代码看不懂)
linux0.11相较于其他OS,已算小型,但代码量也不小。学起来也不算容易。
同时,其较好地实现了操作系统的几个视图(进程,内存,文件),可供初学者仔细研究。
(多看看进程调度函数)
实验环境
该实验可在蓝桥云课对应实验课中进行实验。
但是很麻烦,不保存之前结果,还吃网络,操作的很烦。
于是,我就在我的虚拟机上配置了相关环境。
环境配置可参考该博文。
(记得关注自己的实验文件夹,我曾以为自己没出最后的oslab,还自己一个一个解压,配置环境变量,最后发现别人的脚本早做好了)
另外,建议做一个共享文件夹,用git去管理源码。能省不少麻烦。
软件环境:Bochs + Ubuntu14.04 + gcc3.4 + vim
模拟硬件环境:IA-32 X86架构
汇编语言:as86语法
实验内容
说明:
原实验内容如下:
此次实验的基本内容是:
阅读《Linux内核完全注释》的第6章,对计算机和Linux 0.11的引导过程进行初步的了解;
按照下面的要求改写0.11的引导程序bootsect.s
有兴趣同学可以做做进入保护模式前的设置程序setup.s。
改写bootsect.s主要完成如下功能:
bootsect.s能在屏幕上打印一段提示信息“XXX is booting…”,其中XXX是你给自己的操作系统起的名字,例如LZJos、Sunix等(可以上论坛上秀秀谁的OS名字最帅,也可以显示一个特色logo,以表示自己操作系统的与众不同。)
改写setup.s主要完成如下功能:
bootsect.s能完成setup.s的载入,并跳转到setup.s开始地址执行。而setup.s向屏幕输出一行"Now we are in SETUP"。
setup.s能获取至少一个基本的硬件参数(如内存参数、显卡参数、硬盘参数等),将其存放在内存的特定地址,并输出到屏幕上。
setup.s不再加载Linux内核,保持上述信息显示在屏幕上即可。
如果直接按照它的来,则每次不再编译全部的OS,只是编译一小部分。
这样的话,就不能直接用它给的命令快速完成,而且无法看到这么修改是否会对OS整体产生影响。(输出能产生什么影响呢)
又因为我懒(不想写硬件读写,太折磨了),所以我直接在linux-0.11源代码的基础上做出了要求实现的功能。
需要知道的基础知识
由于当前仍然处于操作系统的引导时期,因此并不存在操作系统所提供给你的系统调用。
可以用的,只有BIOS的中断。
在实验中会用到的是int 0x10
具体的解释可见

本文是哈工大李治军老师操作系统课程实验一的记录。介绍在虚拟机上配置Bochs、Ubuntu14.04等环境,改写Linux 0.11引导程序bootsect.s和setup.s,实现屏幕输出提示信息、获取并显示硬件参数等功能,还提及实验中需注意的汇编知识和细节。
最低0.47元/天 解锁文章
3876

被折叠的 条评论
为什么被折叠?



