os-lab1
本文最后更新于 2024年9月6日 下午
1.思考题
1.1
- ld是链接器工具,用于将编译后的目标文件链接成可执行文件或共享库。
- readelf是一个用于查看ELF格式文件(包括可执行文件、共享库等)的工具。它可以显示ELF文件的各个段、符号表、重定位表等信息,帮助用户了解可执行文件的结构和内容。
- mips-linux-gnu-前缀通常用于指明目标架构为MIPS架构的Linux系统。
- objdump -DS hello命令用于对名为hello的可执行文件进行反汇编,并显示汇编代码和符号表信息。下面是每个参数的含义:
- objdump:用于显示目标文件信息的工具。
- -D:指定显示反汇编代码。该选项会将目标文件中的机器指令反汇编成汇编代码并显示。
- -S:指定同时显示源代码和反汇编代码。该选项会尝试将反汇编代码与源代码对应起来显示。
hello:要反汇编的目标文件的文件名。在这里是名为hello的可执行文件。
通过执行objdump -DS hello命令,可以查看hello可执行文件的反汇编代码和符号表信息,帮助理解程序的实现细节和结构。
1.2
通过 readelf -h命令,可以看到我们编写的readelf文件是ELF64,而hello文件是ELF32,我们编写的readelf文件只能够解析32位类型的文件,所以不能解析它本身。
1.3
因为上电是OS启动的第一个阶段,首先启动bootloader程序,在stage1阶段初始化硬件设备。此时对于MIPS处理器来说,MIPS体系结构上电时,启动入口的地址为0xBFC00000(或为某一个确定的地址)。
在stage2阶段,我们才将内核镜像加载到内存指定的位置,即内存布局图放置,我们可以从mips_init()跳转到正确的内核。
实验难点
1.1
难点在于理解elf.h文件中的结构体,以及理解ELF文件的结构。
1.2
根据内存示意图进行放置即可
1.3
- 于看懂printk代码所要实现的功能,理解参数和变量的含义。
- 注意是按照%[flags][width][.precision][length]specifier这样的顺序进行的
体会与感想
从lab1的实验,我们初步学到了os的启动过程。我们学会了如何把kernel放到内存正确的位置。还学习了ELF文件的格式。
在完成readelf练习的过程中,我感觉初次阅读ELF文件的源码有一定困难。
同时,对于指导书中的Makefile文件,我觉得阅读起来比较吃力,许多宏定义不熟悉,许多命令和参数也不认识。
在完成printk函数时,我卡了很久,在阅读各个文件源码后,才理解该函数的作用是实现printf的功能。同时对于提示中的flush the string ,即第二处需要补充的代码,我不能理解提示的要求,不知道out函数具体实现了什么功能。还有在完成print_num的时候,对于neg_flag的判断也卡了一下。
我认为需要稳固c语言和mips的基础,增强代码的阅读能力,才能更好的理解os实验的源码。
