清华操作系统ucore_lab1

操作系统实验报告

练习一

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

首先我们在Makefile文档中找到ucore.img文件生成的代码段:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DHSL6Ce1-1639279618160)(E:/Typore%E5%9B%BE%E7%89%87/image-20211116160117324.png)]

我们对该代码进行逐行分析:
dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。

if=文件名:输入文件名,缺省为标准输入。即指定源文件。< if=input file >
of=文件名:输出文件名,缺省为标准输出。即指定目的文件。< of=output file >
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。 conv=conversion:用指定的参数转换文件。 conv=notrunc:不截短输出文件.

上述代码实现了先创建一个大小为10000字节的内存块儿,然后再将bootblock和kernel拷贝过去。

然后我们在终端中执行make V=查看命令执行情况:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5MyOPlwr-1639279618162)(E:/Typore%E5%9B%BE%E7%89%87/image-20211116161226734.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E4e8TTlW-1639279618162)(E:/Typore%E5%9B%BE%E7%89%87/image-20211116161241558.png)]

这里用到的一些指令:

cc来自于Unix的c语言编译器,是 c compiler 的缩写;这里cc指向gcc,因此在Linux下cc等价于gcc。

makefile中,命令行第一个字符为加号+,则执行命令时不受到make的-n -t -q三个参数的影响。

gcc -c a.c 编译成目标文件a.o
gcc a.c 生成执行文件a.exe
gcc -o a -c a.c 编译成目标文件a
gcc -o a a.c 生成执行文件a.exe
在a.c中引用test.c中的一个函数后:
gcc -c test.c 编译成目标文件test.o
gcc -c a.c 编译成目标文件a.o
gcc -o a test.o a.o 生成执行文件a.exe
gcc -o a test.o a.c 生成执行文件a.exe
gcc -o a test.c a.c 生成执行文件a.exe

-fno-builtin:允许定义函数的时候和C语言的内建函数重名。

-Wall:该选项能发现程序中一系列的常见错误警告。虽然GCC提供了非常丰富的警告,但前提是你已经启用了它们,否则它不会报告这些检测到的警告。

-ggdb:-ggdb产生的debug信息更倾向于给GDB使用的。如果用的GDB调试器,那么使用-ggdb选项,如果是其他调试器,则使用-g。

-m32:-m32 生成32位机器的汇编代码;-m64则生成64位机器汇编代码。

-I(大写i):指定头文件路径(相对路径或绝对路径,建议相对路径)。gcc/g++ 会先在当前目录查找你所制定的头文件,如果没有找到,他回到默认的头文件目录找,如果使用 -I 制定了目录,他会先在你所制定的目录查找, 然后再按常规的顺序去找。

-gstabs:-gstabs,以stabs格式声称调试信息,但是不包括gdb调试信息;-gstabs+,以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息。

-nostdinc:不在标准系统文件夹寻找头文件,只在 -I 等参数指定的文件夹中搜索头文件。

-fno-stack-protector:禁用堆栈保护机制。

ld:ld 命令是二进制工具集 GNU Binutils 的一员,是 GNU 链接器,用于将目标文件与库链接为可执行文件或库文件。在上面的ld命令的作用就是分别生成了kernel和bootblock文件。

-m elf_i386:指定模拟仿真链接器为 elf_i386;-nostdlib:只搜索命令行上显式指定的库目录,在链接器脚本中指定的库目录(包括在命令行中指定的链接器脚本)将被忽略;-T tools/kernel.ld:指定链接器的脚本为 tools 目录下的 kernel.ld 文件;-o bin/kernel obj/kern/init/init.o:将转化好的可执行文件放到 bin/ 目录下,并命名为 kernel,链接的文件为 obj/kern/init/ 目录中的 init.o。

二、一个被系统认为是符合规范的硬盘主引导扇区的特征是什么?

查看lab1/tools/sign.c源代码:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8eFxATuI-1639279618162)(E:/Typore%E5%9B%BE%E7%89%87/image-20211116162003592.png)]

由31,32行代码看出、符合规范的硬盘主引导扇区的大小为512个字节,且最后两个字节为0x55、0xAA。

练习二

1、从CPU加电后执行的第一条指令开始,单步跟踪BIOS的执行。

查看lab1/tools/gdbinit内容如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FpcsxxV4-1639279618163)(E:/Typore%E5%9B%BE%E7%89%87/image-20211116164106345.png)]

将其进行修改:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PyQCodNH-1639279618163)(E:/Typore%E5%9B%BE%E7%89%87/image-20211116164300649.png)]

意思是与qemu建立连接,然后我们在lab1目录下进行调试:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1N9I2hUV-1639279618164)(E:/Typore%E5%9B%BE%E7%89%87/image-20211116164515772.png)]

si单步执行,x/2i $pc可以查看BIOS的代码

2 、在初始化位置0x7c00设置实地址断点,测试断点正常。

对gdbinit文件进行修

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值