os-lab1

本文最后更新于 2024年9月6日 下午

1.思考题

1.1

  • ld是链接器工具,用于将编译后的目标文件链接成可执行文件或共享库。
  • readelf是一个用于查看ELF格式文件(包括可执行文件、共享库等)的工具。它可以显示ELF文件的各个段、符号表、重定位表等信息,帮助用户了解可执行文件的结构和内容。
  • mips-linux-gnu-前缀通常用于指明目标架构为MIPS架构的Linux系统。
  • objdump -DS hello命令用于对名为hello的可执行文件进行反汇编,并显示汇编代码和符号表信息。下面是每个参数的含义:
  1. objdump:用于显示目标文件信息的工具。
  2. -D:指定显示反汇编代码。该选项会将目标文件中的机器指令反汇编成汇编代码并显示。
  3. -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实验的源码。