教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 高等教育 >

ucore - LAB1实验报告

来源:网络收集 时间:2026-09-10
导读: LAB1实验报告 实验目的: 操作系统是一个软件,也需要通过某种机制加载并运行它。在这里我们将通过另外一个更加简单的软件-bootloader来完成这些工作。为此,我们需要完成一个能够切换到x86的保护模式并显示字符的bootloader,为启动操作系统ucore做准备。la

LAB1实验报告

实验目的:

操作系统是一个软件,也需要通过某种机制加载并运行它。在这里我们将通过另外一个更加简单的软件-bootloader来完成这些工作。为此,我们需要完成一个能够切换到x86的保护模式并显示字符的bootloader,为启动操作系统ucore做准备。lab1提供了一个非常小的bootloader和ucore OS,整个bootloader执行代码小于512个字节,这样才能放到硬盘的主引导扇区中。通过分析和实现这个bootloader和ucore OS,通过分析和实现这个bootloader和ucore OS,我们可以了解到: ? 基于分段机制的存储管理 ? 设备管理的基本概念

? PC启动bootloader的过程 ? bootloader的文件组成

? 编译运行bootloader的过程 ? 调试bootloader的方法 ? ucore OS的启动过程

? 在汇编级了解栈的结构和处理过程 ? 中断处理机制

? 通过串口/并口/CGA输出字符的方法 实验内容: 一.练习

练习1:理解通过make生成执行文件的过程。

1. ucore.img是如何一步一步生成的?(需要比较详细地解释Makefile中每一条相关命令和命令参数的含义,以及说明命令导致的结果)

答:Makefile按照如下步骤生成ucore.img(lab1/bin下的ucore.img):

①为每一个源文件(.c和.S文件)产生一个描述其依赖关系的makefile文件,以.d为后缀。即对于一个源文件“NAME.c”,对应的这个makefile文件为“NAME.d”。包括分别生成sign.c、bootmain.c、bootasm.S的makefile依赖文件sign.d、bootmain.d、bootasm.d,具体执行的命令如下: mkdir -p obj/sign/tools gcc -Itools/ -g -Wall -O2 -MM tools/sign.c -MT \obj/sign/tools/sign.d mkdir -p obj/boot gcc -Iboot/ -fno-builtin -Wall -ggdb -m32 -nostdinc -fno-stack-protector -Ilibs/ -Os -nostdinc -MM boot/bootmain.c -MT \ gcc -Iboot/ -fno-builtin -Wall -ggdb -m32 -nostdinc -fno-stack-protector -Ilibs/ -Os -nostdinc -MM boot/bootasm.S -MT \gcc重要的编译参数: -I

指定搜索系统头文件的目录,可以重复使用多个该选项指定多个目录 -Wall 显示所有的警告消息 -O2 优化(级别为2) -m32 指明目标代码32位 -Os 对生成的二进制代码进行尺寸上的优化 -ggdb 提供编译信息

-nostdinc 只为头文件寻找-I选项指定的目录

-fno-builtin 除非利用\进行引用,否则不识别所有内建函数 -fno-stack-protector 不检测缓存溢出

②编译源文件,只生成目标文件但不链接。包括由bootasm.S、bootmain.c、sign.c分别生成bootasm.o、bootmain.o、sign.o。具体执行的命令如下: gcc -Iboot/ -fno-builtin -Wall -ggdb -m32 -nostdinc -fno-stack-protector -Ilibs/ -Os -nostdinc -c boot/bootasm.S -o obj/boot/bootasm.o gcc -Iboot/ -fno-builtin -Wall -ggdb -m32 -nostdinc -fno-stack-protector -Ilibs/ -Os -nostdinc -c boot/bootmain.c -o obj/boot/bootmain.o gcc -Itools/ -g -Wall -O2 -c tools/sign.c -o obj/sign/tools/sign.o gcc重要的编译参数: -c 完成编译或汇编工作,但是不链接,以目标文件(.o)形式输出

③由目标文件sign.o生成可执行文件sign,生成sign工具(生成引导区内容) mkdir -p bin gcc -g -Wall -O2 obj/sign/tools/sign.o -o bin/sign

④链接bootasm.o、bootmain.o生成bootblock.o,设定程序入口为start,地址为0x7C00。具体执行的命令如下: ld -m elf_i386 -N -e start -Ttext 0x7C00 obj/boot/bootasm.o obj/boot/bootmain.o -o obj/bootblock.o ld链接参数: -e 设置程序入口位置 -Ttext 设置函数地址

-m elf_i386 设定为i386平台ELF执行文件格式

⑤将bootblock.o内容进行反汇编,写入文件bootblock.asm。具体执行的命令如下: objdump -S obj/bootblock.o > obj/bootblock.asm 命令参数含义:

-S 源代码中混合有反汇编

⑥将目标文件bootblock.out全部内容拷贝到bootblock.o中,并转换为raw二进制(raw binary)格式。具体执行的命令如下: objcopy -S -O binary obj/bootblock.o obj/bootblock.out 命令参数含义: -S 去除掉源文件的符号信息和重分配信息 -O binary 生成二进制(binary)格式的输出文件

⑦使用sign工具生成引导区内容装载bootblock.out,生成bin目录下的bootblock。具体执行的命令如下: bin/sign obj/bootblock.out bin/bootblock

⑧生成ucore.img。分两步:先使用空白字符(/dev/zero)初始化ucore.img,再以bootblock为输入,输出最终硬盘镜像ucore.img。具体执行的命令如下: dd if=/dev/zero of=bin/ucore.img count=10000 dd if=bin/bootblock of=bin/ucore.img conv=notrunc 命令参数含义: if=file 输入文件名,缺省为标准输入 of=file 输出文件名,缺省为标准输出

count=blocks 仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数

conv=conversion[,conversion...] 用指定的参数转换文件 conv=notrunc 不截短输出文件

2.一个被系统认为是符合规范的硬盘主引导扇区的特征是什么? 答:根据代码sign.c中的内容,一个被系统认为是符合规范的硬盘主引导扇区具有如下特征: (1)硬盘主引导扇区共512(200h)字节;

(2)硬盘主引导程序大小不超过510字节,且位于主引导扇区第0-509(0-1FDh)字节,若程序大小不足510字节,剩余空间补零;

(3)引导扇区有有效标志,位于第510-511(1FEh-1FFh)字节处,值为AA55h,即1FEh字节存0x55,1FFh字节存0xAA。

练习2:使用qemu执行并调试lab1中的软件。

1. 从CPU加电后执行的第一条指令开始,单步跟踪BIOS的执行。 答:通过改写Makefile文件 () debug: $(UCOREIMG) $(V)$(TERMINAL) -e \-serial null\ //qemu模拟 $(V)sleep 2 //停止2ms $(V)$(TERMINAL) -e \ //gdb调试

在调用qemu时增加-d in_asm -D q.log参数,便可以将运行的汇编指令保存在q.log中。 为防止qemu在gdb连接后立即开始执行,删除了tools/gdbinit中的\行。

2.在初始化位置 0x7c00设置实地址断点,测试断点正常。 答:将tools/gdbinit改为: file obj/bootblock.o target remote :1234 set architecture i8086 //设置为8086模式 b *0x7c00 //设置断点为0x7c00 continue x /2i $pc //反汇编形式输出两条指令 运行\便可得到

说明断点调试成功。

3.在调用qemu 时增加-d in_asm -D q.log 参数,便可以将运行的汇编指令保存在q.log 中。将执行的汇编代码与bootasm.S和bootblock.asm进行比较,看看两者是否一致。 答:在q.log中进入BIOS之后的跳转地址与实际应跳转地址不相符,汇编代码也 与bootasm.S 和 bootblock.asm不相同。 如图

q.log与bootasm.S 和 bootblock.asm并不相同,甚至完全不一样。

这是由于在gdb之中调试的原因,可以直接输入make debug,在生成的qemu虚拟 机之中进行调试可以看到在虚拟机中运行的汇编代码,之后再与bootasm.S 和 bootblock.asm 进行比较。

这样得出的前20条指令与bootasm.S 和 bootblock.asm中的指令完全一致。

练习3:分析bootloader 进入保护模式的过程。 答:如下: (1) .globl start start: .code16 # Assemble for 16-bit mode cli # Disable interru …… 此处隐藏:2884字,全部文档内容请下载后查看。喜欢就下载吧 ……

ucore - LAB1实验报告.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/604851.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)