BUAA OS 实验 lab1笔记

1 minute read

Lab1 实验报告

一、思考问题

Thinking 1.1

Thinking 1.1 请阅读附录中的编译链接详解,尝试分别使用实验环境中的原生 x86 工具 链(gcc、ld、readelf、objdump 等)和 MIPS 交叉编译工具链(带有 mips-linux-gnu前缀),重复其中的编译和解析过程,观察相应的结果,并解释其中向 objdump 传入的参 数的含义。

readelf读取目标文件相关信息。

image-20230309162327025

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不能解析本身原因:

image-20230309204420543

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函数。

需要注意下方的函数解释,注意函数参数,同时也要注意末尾字符处理。需要强测数据进一步检验,才可以保证正确性。

三、个人实验体会

​ 本节主要内容是内核初始化,其中比较难点在于对整体框架结构,链接编译的过程,内存基本结构的理解。

​ 在做实验时,对整体框架理解的不够清楚,因此进度较慢。完成课下后,仍需要进一步深入阅读,理解底层框架与原理。学习了操作系统初始化相关的基本概念。通过实验书的指导,补全完成任务,加深了对操作系统底层原理的理解。

Afdafczl

Afdafczl

BUAA, School of Software, Sophomore 这是一个属于Afdaf的,基于Github Page搭建的个人博客,用于记录与查看个人学习笔记。 可点击左侧导航栏查看详情

Comments

  Write a comment ...