Lab1 实验报告
一、思考问题
Thinking 1.1
Thinking 1.1 请阅读附录中的编译链接详解,尝试分别使用实验环境中的原生 x86 工具 链(gcc、ld、readelf、objdump 等)和 MIPS 交叉编译工具链(带有 mips-linux-gnu前缀),重复其中的编译和解析过程,观察相应的结果,并解释其中向 objdump 传入的参 数的含义。
readelf读取目标文件相关信息。
x86下解析结果(main函数)
hello1.o: 文件格式 elf64-x86-64Disassembly of section .text:0000000000000000 <main>: 0: f3 0f 1e fa endbr64 4: 55 push %rbp 5: 48 89 e5 mov %rsp,%rbp 8: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # f <main+0xf> f: 48 89 c7 mov %rax,%rdi 12: e8 00 00 00 00 call 17 <main+0x17> 17: b8 00 00 00 00 mov $0x0,%eax 1c: 5d pop %rbp 1d: c3 ret
mips环境下解析结果
hello2.o: 文件格式 elf32-tradbigmipsDisassembly of section .text:00000000 <main>:... read more
BUAA OS 实验 lab1笔记
Lab1 实验报告
一、思考问题
Thinking 1.1
Thinking 1.1 请阅读附录中的编译链接详解,尝试分别使用实验环境中的原生 x86 工具 链(gcc、ld、readelf、objdump 等)和 MIPS 交叉编译工具链(带有 mips-linux-gnu前缀),重复其中的编译和解析过程,观察相应的结果,并解释其中向 objdump 传入的参 数的含义。
readelf读取目标文件相关信息。
x86下解析结果(main函数)
hello1.o: 文件格式 elf64-x86-64
Disassembly of section .text:
0000000000000000 <main>:
0: f3 0f 1e fa endbr64
4: 55 push %rbp
5: 48 89 e5 mov %rsp,%rbp
8: 48 8d 05 00 00 00 00 lea 0x0(%rip),%rax # f <main+0xf>
f: 48 89 c7 mov %rax,%rdi
12: e8 00 00 00 00 call 17 <main+0x17>
17: b8 00 00 00 00 mov $0x0,%eax
1c: 5d pop %rbp
1d: c3 ret
mips环境下解析结果
hello2.o: 文件格式 elf32-tradbigmips
Disassembly of section .text:
00000000 <main>:
0: 27bdffe0 addiu sp,sp,-32
4: afbf001c sw ra,28(sp)
8: afbe0018 sw s8,24(sp)
c: 03a0f025 move s8,sp
10: 3c1c0000 lui gp,0x0
14: 279c0000 addiu gp,gp,0
18: afbc0010 sw gp,16(sp)
1c: 3c020000 lui v0,0x0
20: 24440000 addiu a0,v0,0
24: 8f820000 lw v0,0(gp)
28: 0040c825 move t9,v0
2c: 0320f809 jalr t9
30: 00000000 nop
34: 8fdc0010 lw gp,16(s8)
38: 00001025 move v0,zero
3c: 03c0e825 move sp,s8
40: 8fbf001c lw ra,28(sp)
44: 8fbe0018 lw s8,24(sp)
48: 27bd0020 addiu sp,sp,32
4c: 03e00008 jr ra
50: 00000000 nop
objdump函数中
-D, --disassemble-all Display assembler contents of all sections
--disassemble=<sym> Display assembler contents from <sym>
-S, --source Intermix source code with disassembly
--source-comment[=<txt>] Prefix lines of source code with <txt>
-D 代表展示全部section的反编译内容
-S 表示源码和反汇编代码一同展示
Thinking 1.2
mos解析结果:
0:0x0
1:0x80010000
2:0x800124d0
3:0x800124e8
4:0x80012500
5:0x0
6:0x0
7:0x0
8:0x0
9:0x0
10:0x0
11:0x0
12:0x0
13:0x0
14:0x0
15:0x0
16:0x0
17:0x0
readelf不能解析本身原因:
readelf和hello文件ABI不同,类型不同,系统架构不同
%.o: %.c
$(CC) -c $<
.PHONY: clean
readelf: main.o readelf.o
$(CC) $^ -o $@
hello: hello.c
$(CC) $^ -o $@ -m32 -static -g
clean:
rm -f *.o readelf hello
(makefile中内容)
可以观察到hello编译链接中,含有-static选项,选择了静态链接,加载静态库的全部内容生成可执行文件。
也含有-g选项,可以生成提供于gdb调试的可执行文件,会关闭一切优化机制,使得程序完全按照原来的c语言代码进行。
由于如上差异,readelf不能解析自身文件。
Thinking 1.3
启动需要初始化硬件设备,在ROM中由bootloader执行,第二阶段在RAM中。初始化该阶段硬件设备,读取并载入内核,执行引导程序。而引导程序的入口地址不一定为内核入口地址。引导器可以保证内核入口被正确跳转。
二、实验难点
exercise1 完成readelf
理解section,section header,section header table等概念之间的区别。认识到section header的大小以及其相关属性。进一步也就能掌握遍历section header的方法。
exercise 2 填写kernel.lds中空缺的部分
正确认识section的地址关系。
exercise 3 完成 init/start.S
mips指令不够熟悉,sp地址设置出现错误。需要正确认识到内存模型
exercise 4 完成vprintfmt()函数
细节比较多,但思路较为清晰。需要处理fmt模式串,模拟实现类printf函数。
需要注意下方的函数解释,注意函数参数,同时也要注意末尾字符处理。需要强测数据进一步检验,才可以保证正确性。
三、个人实验体会
本节主要内容是内核初始化,其中比较难点在于对整体框架结构,链接编译的过程,内存基本结构的理解。
在做实验时,对整体框架理解的不够清楚,因此进度较慢。完成课下后,仍需要进一步深入阅读,理解底层框架与原理。学习了操作系统初始化相关的基本概念。通过实验书的指导,补全完成任务,加深了对操作系统底层原理的理解。
Comments