• Lab 1:Part 2: exercise 4


    Lab 1:Part 2: exercise 4 - 6

    exercise 4

    阅读有关使用C进行指针编程的信息。后下载pointers.c的代码,运行它,并确保您了解所有打印值的来源。特别是,请确保您了解输出的第1和第6行中的指针地址来自何处,输出的2至4行中的所有值如何到达那里,以及为什么第5行中打印的值看起来被破坏了。

    exercise 5

    然后将boot / Makefrag 中的链接地址更改为错误的地址,运行make clean,使用make重新编译 lab,再次遍历引导加载程序的前几条指令,并确定第一条可能“中断”或执行错误操作的指令。

    我这里将链接地址改为 0x7000 ,在执行 lgdtw 处的加载地址变为了 0x7064 ,接着后面的运行就会报错。修改地址后,导致引导加载器的段描述符表 gdt 加载出错。

    exercise 6

    在 elf header 中,e_entry 字段保存这程序入口点的链接地址,可以使用 objdrum -f 查看入口地址。 总的来说, bootmian 先加载 elf 文件的前 4096 字节(elf header)进入内存,在根据 elf header 的字段从磁盘中将内核各部分加载到内存中,最后跳转到内核的入口处,将控制权交给内核。

    练习:

    重置机器(退出QEMU / GDB并重新启动它们)。在BIOS进入引导加载程序时,检查 0x00100000 处的8个内存字,然后在引导加载程序进入内核时再次检查。他们为什么不同?第二个断点有什么? (您实际上并不需要使用QEMU来回答这个问题。只需考虑一下即可。)

    使用 x/Nx addr 打印地址为 addr 处的 N 个字(字长 16bit)。

    分别在引导加载程序的开始 0x7c00 和 内核程序的开始 0x1000c 处设置断点。

    1. 进入引导加载程序时,0x00100000 处存储的内容:

    2. 进入内核程序时:

    该处的内容不一是因为 bootmian 将内核的 .text 段内容加载到了此处。

    .textload address (LMA) 为该地址。

  • 相关阅读:
    四则运算02
    第三周学习进度条
    《构建之法》阅读笔记1
    第二周学习进度条
    四则运算01
    第八周进度条
    每日站立会日07,08
    每日站立会议06
    每日站立会议05
    每日站立会议04
  • 原文地址:https://www.cnblogs.com/joe-w/p/12583201.html
Copyright © 2020-2023  润新知