【OS】BUAA-OS-Lab1-实验报告
OS Lab1实验报告
思考题
Thinking 1.1
在阅读 附录中的编译链接详解 以及本章内容后,尝试分别使用实验环境中 的原生 x86 工具链(gcc、ld、readelf、objdump 等)和 MIPS 交叉编译工具链(带有 mips-linux-gnu- 前缀,如 mips-linux-gnu-gcc、mips-linux-gnu-ld),重复其中的编 译和解析过程,观察相应的结果,并解释其中向objdump传入的参数的含义。
答:
- 使用原生x86工具链后结果如下:
使用MIPS交叉编译工具链后结果如下:
可以看到反汇编后得到了MIPS汇编指令,其不同除了汇编指令不同外,还体现在寄存器、调用约定等方面,而当前跳板机的原生架构为x86,这就说明交叉编译工具链的作用为在某一架构中生成另一种架构的代码。这对于系统架构迁移会有极大的便利。 - objdump中传入的参数如下:
-d
/--disassemble
:反汇编包含指令的节(section)-D
/--disassemble-all
:反汇编所有节(section)-S
/--source
:混合显示源代码和汇编代码(需要编译时使用-g
选项)-h
/--section-headers
:显示节头部信息-x
/--all-headers
:显示所有头信息-t
/--syms
:显示符号表
Thinking 1.2
思考下述问题:
• 尝试使用我们编写的readelf程序,解析之前在target目录下生成的内核ELF文 件。
• 也许你会发现我们编写的readelf程序是不能解析readelf 文件本身的,而我们刚 才介绍的系统工具readelf 则可以解析,这是为什么呢?(提示:尝试使用readelf-h,并阅读tools/readelf 目录下的 Makefile,观察 readelf 与 hello 的不同)
答:使用自己的readelf程序,解析结果如下:
使用系统自带的readelf工具解析hello和readelf,结果如下:
可以看到hello的类别为ELF32,readelf的类别为ELF64,这与Makefile中的内容有关:
1 |
|
其中-m32
说明生成的为32位代码,而检查自己编写的readelf.c可以看到
1 |
|
这里仅可以获得32位的ELF文件,这就可以说明为什么自己编写的readelf只能解析32位文件(hello),而无法解析64位文件(readelf)。
Thinking1.3
在理论课上我们了解到,MIPS体系结构上电时,启动入口地址为0xBFC00000 (其实启动入口地址是根据具体型号而定的,由硬件逻辑确定,也有可能不是这个地址,但 一定是一个确定的地址),但实验操作系统的内核入口并没有放在上电启动地址,而是按照 内存布局图放置。思考为什么这样放置内核还能保证内核入口被正确跳转到? (提示:思考实验中启动过程的两阶段分别由谁执行。)
答:硬件上电时,首先进行stage1,由非易失存储器中的bootloader程序对硬件进行初始化,并为加载操作系统的stage2准备好了RAM并载入其中,然后设置堆栈并将CPU指令寄存器的内容设置为内核入口函数的地址。
这就解释了为什么上电地址不是内核入口,内核入口的进入是由stage1提供的接口进入的。
难点分析
我觉得此次实验难点是ELF内容和结构的理解。对于节和段这两种组织方式和其查找是操作上的一个难点。在理解上,虽然在阅读指导书的过程中感到晦涩难懂,但是阅读完后再从头宏观来看,就能理解内核的加载和运作机制,理解操作系统的启动,感到通透。prinf方面根据指导书学习不难理解。
心得体会
通过这一次实验内容的学习和练习,我觉得指导书的阅读要有一个宏观的眼光,即阅读完后将其综合起来以一个整体的视角来理解。练习的过程中一定要注意细节,是字符串而不是字符这种类似的错误千万不要再犯了
原创性说明
本报告为本人原创