操作系统实验报告
练习一
一、操作系统镜像文件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文件进行修