OSlab1实验报告

211300044 吴羽珩 2559280859@qq.com

实验进度:

我完成了所有内容

实验结果

1.3

实验修改的代码位置(lab1.3)

  1. start.s: 启动A20总线; cr0最低位置0; 初始化DS ES FS GS SS,初始化栈顶指针ESP; 填写GDT; 在1.2的基础上更改,display,nextchar,loop不再需要,直接jump bootMain即可。

  2. boot.c: 修改bootMain函数,利用readSect函数将第一块磁盘读出,读到地址为0x8c00的内存中

    因为在app文件夹中的makefile文件指出了入口地址0x8c00

    1
    ld -m elf_i386 -e start -Ttext 0x8c00 app.o -o app.elfs

    然后使用内联汇编跳转到入口地址。

  3. app.s: 注意到讲义中屏幕中字符串的颜色为粉色,故将displayStr函数中的最后一行改为

1
movb $0x0d, %ah

以实现颜色的改变。

思考题:

Ex1:你弄清楚本小结标题中各种名词的含义和他们间的关系了吗?请在实验报告中阐述。

CPU、内存、BIOS、磁盘、主引导扇区、加载程序、 操作系统

答:CPU 是中央处理器,是计算机的核心组成部分,可以运行机器指令并得到计算结果;内存是一种存储器,用于暂存 CPU 中的运算数据和与外部储存设备进行数据交换;BIOS 是用于计算机加电启动后的初始阶段进行初始化的固件;磁盘是外部存储设备,掉电后数据不会丢失;主引导扇区是磁盘上特定扇区的名称, 又称主引导记录,用于加载并转让处理器控制权给操作系统;操作系统是管理计算机硬件和软件资源的一段程序

Ex2:中断向量表是什么?你还记得吗?请查阅相关资料,并在报告上说明。

:是指中断服务程序入口地址的偏移量与段基值一个中断向量占据4字节空间。中断向量表是8086系统内存中最低端1K字节空间,它的作用就是按照中断类型号从小到大的顺序存储对应的中断向量,总共存储256个中断向量。在中断响应过程中,CPU通过从接口电路获取的中断类型号(中断向量号)计算对应中断向量在表中的位置,并从中断向量表中获取中断向量,将程序流程转向中断服务程序的入口地址。

Ex3:为什么段的⼤⼩最⼤为64KB,请在报告上说明原因

:8086为16位cpu,其表示范围是 0x0000~0x0FFFF,总共有2^16(2的16次方)=64KB个不同的取值,一个内存单元使用1个偏移地址,故一个段的大小是64KB

Ex4: genboot.pl其实是⼀个脚本程序,虽然我们没学过这种脚本语⾔,但可以⼤概看出来,它先打开 mbr.bin,然后检查⽂件是否⼤于 510字节等等。请观察genboot.pl,说明它在检查⽂件是否⼤于510字节之后做了什么,并解释它为什么这么做。在实验报告中简述⼀下。

若大于,则exit退出,若小于,则输出当前boot block的大小,继续打开之后的文件直到达到512字节。

Ex5: 请简述电脑从加电开始,到OS开始执⾏为⽌,计算机是如何运行的。简略描述即可

cpu在加电之后首先会初始化寄存器,主要是CF寄存器和EIP寄存器,因为他们合起来组成了第一条指令的线性地址。cpu第一条指令从内存中的ROM中取出,这条指令会跳转到BIOS固件进行开机自检,然后BIOS将磁盘的主引导扇区(MBR)加载到0x7c00,并跳转到0x7c00的内存位置,执行加载程序(bootloader),将操作系统的代码和数据从磁盘加载到内存中并跳转到操作系统的起始地址。

遇到的问题和一些想法:

1.

在实验过程中,发现内存不够,于是更改虚拟机内存设置,从10G更改为20G,重新打开虚拟机,发现文件系统损坏,于是重新导入,上网查阅资料,得知不止需要更改虚拟机的设置,还要在linux系统下更改分区大小,使用gparted

VMware虚拟机扩展磁盘容量_晨海1024的博客-CSDN博客

2.

gdt视频段描述符的填写方式不太清楚(未找到资料)

3.

movb $0x0a, %ah 黑色背景绿色字体

movb $0x0b, %ah 黑色背景蓝色字体

movb $0x0c, %ah 黑色背景红色字体

movb $0x0d, %ah 黑色背景粉色字体

可以输出其他背景色 比如 movb $0xac, %ah 则会有以下效果