思考题

Thinking 1.1

  • x86原生工具链和mips交叉编译工具链对比:

    • x86原生工具链:

      • 编译但未链接文件x86程序:

        thinking1-1

      • 链接后文件x86程序:

        thinking1-2

  • mips交叉编译工具链:

    • 编译但未链接mips程序:

    thinking1-3

    • 链接后mips程序:

    thinking1-4

  • objdump传入参数:

    • -d:—disassemble[=symbol],反汇编特定指令机器码的节;

    • -D:—disassemble-all,反汇编全部节代码;

    • -S:—source,代码段反汇编同时,将反汇编代码和源代码交替显示;

    • -g:—debugging,显示调试信息;

    • -l:—line-numbers,代码段反汇编同时,显示反汇编代码行数。

Thinking 1.2

  • 解析/target/mos

image-20240320222833054

  • readelf解析readelf文件和hello文件:可见有多项因素会影响文件是否会被自定义readelf解析,如是大端项还是小端项,如文件位数(32位或64位)

thinking2-1

thinking2-2

Thinking 1.3

在文件kernel.lds中,我们设置了.text.data.bss的位置(ELF文件中的各节位置),并且设置了函数ENTRY(_start)指定了程序入口(即内核入口),可以正确跳转到内核入口。

难点分析

本次实验难点主要在于对于ELF文件以及节段页表的理解。

  1. readelf理解,内部初始位置以及节位置的设定,对于内核完整的内存布局的理解。
  2. Elf32_Shdr地址与该节地址的不同(addr=(*shdr).shaddr)。
  3. 启动程序start.Ssp指针地址设置以及函数跳转。
  4. vprintfmt()函数中各段的意义,以及具体的编程(这段c程序理解应该是Lab1中最难的一点了)。
  5. ……

实验体会

Lab1主要让我们学习有关程序内核的问题(操作系统中程序的启动流程),了解一个c程序从编程到实现间的预处理、编译、链接过程,以及实现简单的printf()函数。整体而言,Lab1的难度应该也是比较大的,涉及到的知识点很多很新,对于小白来说还是比较不友好,也花费了我很长一段时间来完成。但是了解了函数底层的实现原理以及程序的启动问题,让我觉得收获满满,也觉得付出的努力都是值得的。希望以后Lab的学习也能再接再厉,力求彻底理解吧!