Lab1实验报告
思考题
Thinking 1.1
x86原生工具链和mips交叉编译工具链对比:
x86原生工具链:
编译但未链接文件x86程序:
链接后文件x86程序:
mips交叉编译工具链:
- 编译但未链接mips程序:
- 链接后mips程序:
objdump传入参数:
-d
:—disassemble[=symbol],反汇编特定指令机器码的节;-D
:—disassemble-all,反汇编全部节代码;-S
:—source,代码段反汇编同时,将反汇编代码和源代码交替显示;-g
:—debugging,显示调试信息;-l
:—line-numbers,代码段反汇编同时,显示反汇编代码行数。
Thinking 1.2
- 解析
/target/mos
:
readelf
解析readelf
文件和hello
文件:可见有多项因素会影响文件是否会被自定义readelf
解析,如是大端项还是小端项,如文件位数(32位或64位)
Thinking 1.3
在文件kernel.lds
中,我们设置了.text
,.data
,.bss
的位置(ELF文件中的各节位置),并且设置了函数ENTRY(_start)
指定了程序入口(即内核入口),可以正确跳转到内核入口。
难点分析
本次实验难点主要在于对于ELF文件以及节段页表的理解。
readelf
理解,内部初始位置以及节位置的设定,对于内核完整的内存布局的理解。Elf32_Shdr
地址与该节地址的不同(addr=(*shdr).shaddr
)。- 启动程序
start.S
中sp指针
地址设置以及函数跳转。 vprintfmt()
函数中各段的意义,以及具体的编程(这段c程序理解应该是Lab1中最难的一点了)。- ……
实验体会
Lab1主要让我们学习有关程序内核的问题(操作系统中程序的启动流程),了解一个c程序从编程到实现间的预处理、编译、链接过程,以及实现简单的printf()
函数。整体而言,Lab1的难度应该也是比较大的,涉及到的知识点很多很新,对于小白来说还是比较不友好,也花费了我很长一段时间来完成。但是了解了函数底层的实现原理以及程序的启动问题,让我觉得收获满满,也觉得付出的努力都是值得的。希望以后Lab的学习也能再接再厉,力求彻底理解吧!
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 ENIGMA!