清华编译原理实验实验报告 下载本文

内容发布更新时间 : 2024/11/16 4:14:18星期一 下面是文章的全部内容请认真阅读。

操作系统实验报告

1120141889 王浩天 07111405

实验一

练习1

(一)

1.生成bin/kernel 2.生成bin/bootblock 3.生成bin/sign

4.生成ucore.img 1、首先把C的源代码进行编译成为.o文件,也就是目标文件(红色方框内) 2、 ld命令将这些目标文件转变成可执行文件,比如此处的bootblock.out(绿色方框内)

5.3、dd命令把bootloder放到ucore.img count的虚拟硬盘之中 6.4、还生成了两个软件,一个是Bootloader,另一个是kernel。

(二)一个被系统认为是符合规范的硬盘主引导扇区的特征:

在/lab1/tools/sign.c中我们可以了解到,规范的硬盘引导扇区的大小为512字节,硬盘结束标志位55AA.

练习2

1.从 CPU加电后执行的第一条指令开始,单步跟踪 BIOS 的执行改写Makefile文件 向Makefile中增加以下代码,并运行操作系统make qe-mu,将操作系统加电后运行的汇编指令输出到bin/q.log文件中.操作系统第一条指令为0xfffffff0: ljmp $0xf000,$0xe05b是一条跳转指令. #makefile

2.debug: \\((UCOREIMG)

3. $(V)\\)(TERMINAL) -e “\\((QEMU) -S -s -d in_asm -D $(BINDIR)/q.log -parallel stdio -hda $< -serial null\ 4. $(V)sleep 2

5. $(V)\\)(TERMINAL) -e ”gdb -q -tui -x tools/gdbinit\ 6.

此时的gdbinit文件为 set architecture i8086 7.target remote :1234 8.define hook-stop 9.x/i $pc 10.end 11. 12.

13.在初始化位置0x7c00 设置实地址断点,测试断点正常。在tools/gdbinit更新为 b *0x7c00即为设置断点,执行make debug命令后操作系统在断点命令处停止,执行c后继续运行 file obj/bootblock.o 14.target remote :1234 15.set architecture i8086 16.b *0x7c00 17.continue 18.x /10i $pc 19.

20.将执行的汇编代码与bootasm.S 和 bootblock.asm 进行比较,看看二者是否一致。

练习3

1. bootbloader首先屏蔽所有中断

2. 之后将段寄存器清零, 3. 打开A20地址线, 4. 加载GDT的基地址, 5. 切换到保护模式,

6. 跳转到32位代码. 在32位代码中, bootloader重新设置保护模式下的段寄存器, 然后设置栈顶指针, 之后跳转到C代码。 1、为何开启A20,以及如何开启A20?

当 A20 地址线控制禁止时,则程序就像在 8086 中运行,1MB 以上的地是不可访问的。 在保护模式下 A20 地址线控制是要打开的。为了使能所有地址位的寻址能力,必须向键盘控 制器 8042 发送一个命令。键盘控制器 8042 将会将它的的某个输出引脚的输出置高电平,作 为 A20 地址线控制的输入。一旦设置成功之后,内存将不会再被绕回(memory wrapping),这 样我们就可以寻址 intel 80286 CPU 支持的 16M 内存空间,或者是寻址 intel 80386 以上级别 CPU 支持的所有 4G 内存空间了。

2、如何初始化GDT表?

复习一下cr0寄存器,它的第0位为保护模式位PE:设置 PE 将让处理器工作在保护模式下。复位PE将返回到实模式工作。此外,gdtdesc指出了全局描述符表在符号gdt处,如下 3、如何使能进入保护模式?

通过长跳转指令 ljmp $PROT_MODE_CSEG, $protcseg 进入了保护模式。 进入保护模式之后还有一个步骤:把所有的数据段寄存器指向上面的GDT描述符表中的数据段(0x10)。

练习4: 分析bootloader加载ELF格式的OS的过程

读一个扇区的流程可参看bootmain.c 中的 readsect 函数实现。大致如下: 1. 读 I/O 地址 0x1f7,等待磁盘准备好;

2. 写 I/O 地址 0x1f20x1f5,0x1f7,发出读取第 offset 个扇区处的磁盘数据的命令; 3. 读 I/O 地址 0x1f7,等待磁盘准备好;

4. 连续读 I/O 地址 0x1f0,把磁盘扇区数据读到指定内存。