Lab 1 Exercise 5

  再一次追踪一下boot loader的一开始的几句指令,找到第一条满足如下条件的指令处:

  当我修改了boot loader的链接地址,这个指令就会出现错误。

  找到这样的指令后,把boot loader的链接地址修改一下,我们要在boot/Makefrag文件中修改它的链接地址,修改完成后运行  make clean, 然后通过make指令重新编译内核,再找到那条指令看看会发生什么。 最后别忘了改回来。

  

  答:

  这道题希望我们能够去修改boot loader的链接地址,在Lab 1中,作者引入了两个概念,一个是链接地址,一个是加载地址。链接地址可以理解为通过编译器链接器处理形成的可执行程序中指令的地址,即逻辑地址。加载地址则是可执行文件真正被装入内存后运行的地址,即物理地址。

  那么在boot loader中,由于在boot loader运行时还没有任何的分段处理机制,或分页处理机制,所以boot loader可执行程序中的链接地址就应该等于加载地址。在Lab中作者说,BIOS默认把boot loader加载到0x7C00内存地址处,所以就要求boot loader的链接地址也要在0x7C00处。boot loader地址的设定是在boot/Makefrag中完成的,所以根据题目的要求,我们需要改动这个文件的值。

  首先按照题目要求,在lab目录下输入make clean,清除掉之前编译出来的内核可执行文件,在清除之前你可以先把 obj/boot/boot.asm文件拷贝出来,之后可以用来比较。然后打开这个boot/Makefrag文件,我们会发现下列语句:

  

  其中的-Ttext 0x7C00,就是指定链接地址,我们可以把它修改为0x7E00,然后保存退出。

  然后在lab下输入make,重新编译内核,首先查看一下obj/boot/boot.asm,并且和之前的那个obj/boot/boot.asm文件做比较。下图是新编译出来的boot.asm:

  

  下图是修改之前的boot.asm

  

  可以看出,二者区别在于可执行文件中的链接地址不同了,原来是从0x7C00开始,现在则是从0x7E00开始。

  然后我们还是按照原来的方式,调试一下内核:

  由于BIOS会把boot loader程序默认装入到0x7c00处,所以我们还是再0x7C00处设置断点,并且运行到那里,结果发现如下:

  

  可见第一条执行的指令仍旧是正确的,所以我们接着往下一步步运行。

  接下来的几步仍旧是正常的,但是直到运行到一条指令:

  

  图中的0x7c1e处指令,

     lgdtw 0x7e64

  这条指令我们之前讲述过,是把指令后面的值所指定内存地址处后6个字节的值输入全局描述符表寄存器GDTR,但是当前这条指令读取的内存地址是0x7e64,我们在图中也展示了一下这个地址处后面6个单元存放的值,发现是全部是0。这肯定是不对的,正确的应该是在0x7c64处存放的值,即图中最下面一样的值。可见,问题出在这里,GDTR表的值读取不正确,这是实现从实模式到保护模式转换的非常重要的一步。

  我们可以继续运行,知道发现下面这句:

  

  正常来说,0x7c2d处的指令

      ljmp $0x08m $0x7e32

  应该跳转到的地址应该就是ljmp的下一条指令地址,即0x7c32,但是这里给的值是0x7e32,所以造成错误,此时下条指令变成了0xfe05b。自此程序走向了不归路~

  

MIT 6.828 JOS学习笔记9. Exercise 1.5的更多相关文章

  1. MIT 6.828 JOS学习笔记11 Exercise 1.8

    Exercise 1.8       我们丢弃了一小部分代码---即当我们在printf中指定输出"%o"格式的字符串,即八进制格式的代码.尝试去完成这部分程序. 解答: 在这个练 ...

  2. MIT 6.828 JOS学习笔记12 Exercise 1.9

    Lab 1中Exercise 9的解答报告 Exercise 1.9: 判断一下操作系统内核是从哪条指令开始初始化它的堆栈空间的,以及这个堆栈坐落在内存的哪个地方?内核是如何给它的堆栈保留一块内存空间 ...

  3. MIT 6.828 JOS学习笔记13 Exercise 1.10

    Lab 1 Exercise 10 为了能够更好的了解在x86上的C程序调用过程的细节,我们首先找到在obj/kern/kern.asm中test_backtrace子程序的地址, 设置断点,并且探讨 ...

  4. MIT 6.828 JOS学习笔记8. Exercise 1.4

    Lab 1 Exercise 4 阅读关于C语言的指针部分的知识.最好的参考书自然是"The C Programming Language". 阅读5.1到5.5节.然后下载poi ...

  5. MIT 6.828 JOS学习笔记5. Exercise 1.3

    Lab 1 Exercise 3 设置一个断点在地址0x7c00处,这是boot sector被加载的位置.然后让程序继续运行直到这个断点.跟踪/boot/boot.S文件的每一条指令,同时使用boo ...

  6. MIT 6.828 JOS学习笔记3. Exercise 1.2

    这篇博文是对Lab 1中的Exercise 2的解答~ Lab 1 Exercise 2: 使用GDB的'si'命令,去追踪ROM BIOS几条指令,并且试图去猜测,它是在做什么.但是不需要把每个细节 ...

  7. MIT 6.828 JOS学习笔记2. Lab 1 Part 1.2: PC bootstrap

    Lab 1 Part 1: PC bootstrap 我们继续~ PC机的物理地址空间 这一节我们将深入的探究到底PC是如何启动的.首先我们看一下通常一个PC的物理地址空间是如何布局的:        ...

  8. MIT 6.828 JOS学习笔记0. 写在前面的话

    0. 简介 操作系统是计算机科学中十分重要的一门基础学科,是一名计算机专业毕业生必须要具备的基础知识.但是在学习这门课时,如果仅仅把目光停留在课本上一些关于操作系统概念上的叙述,并不能对操作系统有着深 ...

  9. MIT 6.828 JOS学习笔记7. Lab 1 Part 2.2: The Boot Loader

    Lab 1 Part 2 The Boot Loader Loading the Kernel 我们现在可以进一步的讨论一下boot loader中的C语言的部分,即boot/main.c.但是在我们 ...

随机推荐

  1. python变量

    1. 系统变量 (1) '__doc__' 文件注释,在py中代码最上方""" """里面一般写注释,系统会把文件注释自动存放在'__doc ...

  2. <<< Oracle序列的创建、修改、删除基本操作

    序列是一个命名的顺序编号生成器,可以被多个用户共享,类似sqlserver中的identity create sequence 序列名; //直接创建一个序列 CREATE SEQUENCE 序列名; ...

  3. Java开发的基础条件:

    ------------Java开发的基础条件:Java相关的基础+对编程的自己的理解+调试代码+自己的坚持 一定要谦逊,不人云亦云,不去妄言某一门语言或技术好或坏!不是哪门技术有问题,而是(不会用才 ...

  4. Migrating an Existing Website from SQL Membership to ASP.NET Identity

    Migrating an Existing Website from SQL Membership to ASP.NET Identity public class User : IdentityUs ...

  5. vim 支持C++11 lambda表达式

    http://www.vim.org/scripts/script.php?script_id=3797 Tar contains just the required .vim files, so u ...

  6. 基于dom的xss漏洞原理

    原文:http://www.anying.org/thread-36-1-1.html转载必须注明原文地址最近看到网络上很多人都在说XSS我就借着暗影这个平台发表下自己对这一块的一些认识.其实对于XS ...

  7. .net 开源工作流比较及应用

    送上比较内容图: 鉴于这个表的内容,与公司技术与需求的结合,我们选择啦RoadFlow工作流引擎. 下面踏上RoadFlow的征程. RoadFlow的下载.部署.及使用 官方网址:http://cq ...

  8. JavaScript 冒泡排序和选择排序

    var array = [1,2,3,4,5]; // ---> 服务 //效率 ---> 针对一个有序的数组 效率最高 //标志 true false for(var j = 0; j ...

  9. Ural 1057 Amount of Degrees

    Description 问[L,R]中有多少能表示k个b次幂之和. Sol 数位DP. 当2进制时. 建出一个二叉树, \(f[i][j]\) 表示长度为 \(i\) 有 \(j\) 个1的个数. 递 ...

  10. Web前端学习笔记:Bootstrap框架

    很久之前就有很多人给我推荐twitter的Bootstrap框架,但是直到前几天我才真正学习了下Bootstrap,的确是相当棒的框架,至少从视觉体验上超越了很多以前碰到了前端UI框架.今天我要聊聊B ...