Hit_os_lab1
Contents
hit os lab1
1.实验内容
此次实验的基本内容是:
- 阅读《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 内核,保持上述信息显示在屏幕上即可。
在实验报告中回答如下问题:
- 有时,继承传统意味着别手蹩脚。x86 计算机为了向下兼容,导致启动过程比较复杂。请找出 x86 计算机启动过程中,被硬件强制,软件必须遵守的两个“多此一举”的步骤(多找几个也无妨),说说它们为什么多此一举,并设计更简洁的替代方案。
2.实验开始
1.改写bootsect.s
使用到int 0x10中断进行屏幕打印,出入参数:
寄存器 | 参数 |
---|---|
AL | 显示模式 |
BH | 视频页 |
BL | 属性值(如果AL=0x00或0x01 |
CX | 字符串的长度 |
DH,DL | 屏幕上显示起始位置的行、列值 |
ES:BP | 字符串的段:偏移地址 |
在屏幕上打印的源码:
|
|
|
|
我们将源码修改并只保留核心部分
|
|
我们相对于源码进行修改的部分:
|
|
打印成功
2.改写setup.s
由于我们是重新开始写的bootsect.s,所以我们需要在新的bootsect.s中添加启动setup的代码
添加后的bootsect.s,成功加载setup
|
|
新的setup.s,成功打印"Now we are in SETUP"
|
|
获取硬件参数,并打印到屏幕,这部分代码比较复杂,直接看实验给出的答案吧:
|
|
5.多此一举的操作
- bootsect代码先加载到0x7c00 ,然后又复制到0x90000处
- system 代码先加载到0x10000,然后又复制到内存的最开始0处