lab1的Exercise 2就是让我们熟悉gdb的si操作,并知道BIOS的几条指令在做什么就够了,所以我们也会尽可能的去分析每一行代码。

首先进入到6.8282/lab这个目录下,输入指令make qemu-gdb,之后新打开一个terminal,在lab目录下输入gdb。就进入到gdb了

[f000:fff0]    0xffff0:	ljmp   $0xf000,$0xe05b

这第一条指令呢,是一条跳转指令,跳转到0xfe05b地址处。学过微机原理或者计算机组成就知道0xfe05b=0xf000<<4+0xe05b。简单一点说就是把段寄存器中的值左移4位,形成20位段基址,然后和16位段内偏移相加就得到了真实地址。

这里要说明一下实模式和保护模式。

当PC启动的时候,CPU会运行在实模式下,而当进入操作系统内核后,将会运行在保护模式下

实模式是早期CPU的工作模式,由于它们只有20根地址线,所以它们只能访问1MB的内存空间。但是由于CPU在不断的发展,之后的80286/80386已经具备32位地址总线,能够访问4GB内存空间。保护模式就是为了能够很好的管理这么大的内存空间而被研发出来的。所以现代处理器都是工作在保护模式下的。但是为了实现向后兼容,所以现代的CPU都是在启动时运行于实模式,启动完成后运行于保护模式。

刚我们运行的BIOS就是PC刚启动时运行的软件,所以它必然工作在实模式。

保护模式和启动模式的原理可以见这篇文章:

http://blog.csdn.net/zdwzzu2006/article/details/4030948

运行si后,继续看下一行代码

[f000:e05b]    0xfe05b:	cmpl   $0x0,%cs:0x71e8

这一行把0x0这个立即数和$cs:0x6ac8所代表的内存地址处的值比较,不过理由不是很懂。

[f000:e062]    0xfe062:	jne    0xfd31d

如果ZF为0的时候跳转,即上一条指令cmpl的结果不为0时跳转,或者说是$cs:0x6ac8地址处的值不是0x0时跳转。

[f000:e066]    0xfe066:	xor    %dx,%dx

将dx清零

[f000:e068]    0xfe068:	mov    %dx,%ss
[f000:e06a] 0xfe06a: mov $0x7000,%esp
[f000:e070] 0xfe070: mov $0xf36c3,%edx
[f000:e076] 0xfe076: jmp 0xfd19d

这几行不是很懂。。

[f000:d19d]    0xfd19d:	cli

cli为关闭中断指令。这个关中断指令用于关闭那些可以优先级不是很高的中断。

[f000:d19e]    0xfd19e:	cld

设置方向标识位为0

[f000:d19f] 0xfd19f: mov %eax,%ecx

[f000:d1a2] 0xfd1a2: mov $0x8f,%eax

[f000:d1a8] 0xfd1a8: out %al,$0x70

[f000:d1aa] 0xfd1aa: in $0x71,%al

[f000:d1ac] 0xfd1ac: in $0x92,%al

[f000:d1ae] 0xfd1ae: or $0x2,%al

[f000:d1b0] 0xfd1b0: out %al,$0x92

[f000:d1b2] 0xfd1b2: mov %ecx,%eax

[f000:d1b5] 0xfd1b5: lidtw %cs:0x71d8

[f000:d1bb] 0xfd1bb: lgdtw %cs:0x7194

[f000:d1c1] 0xfd1c1: mov %cr0,%ecx

[f000:d1c4] 0xfd1c4: and $0x1fffffff,%ecx

[f000:d1cb] 0xfd1cb: or $0x1,%ecx

[f000:d1cf] 0xfd1cf: mov %ecx,%cr0

[f000:d1d2] 0xfd1d2: ljmpl $0x8,$0xfd1da

JOS lab1 part2 分析的更多相关文章

  1. MIT 操作系统实验 MIT JOS lab1

    JOS lab1 首先向MIT还有K&R致敬! 没有非常好的开源环境我不可能拿到这么好的东西. 向每个与我一起交流讨论的programmer致谢!没有道友一起死磕.我也可能会中途放弃. 跟丫死 ...

  2. MIT 操作系统实验 MIT JOS lab2

    MIT JOS lab2 首先把内存分布理清楚,由/boot/main.c可知这里把kernel的img的ELF header读入到物理地址0x10000处 这里能够回想JOS lab1的一个小问.当 ...

  3. 一个bat病毒分析(part1)

    之前没学过bat,这里借分析顺便学一波,分析过程可能有点啰嗦 这里的@echo off关闭回显,病毒一般都是隐秘的执行的,然后setlocal enabledelayedexpansion是设置本地变 ...

  4. [buaa-SE-2017]个人作业-week3

    个人作业-week3:案例分析 分析产品:Bing词典 Part1:调研&评测 1.软件评测和Bug汇报 这次我选择Bing词典的原因是在于,首先我使用过的词典软件较多,平台涵盖PC端.网站. ...

  5. ucore操作系统学习笔记(一) ucore lab1系统启动流程分析

    一.ucore操作系统介绍 操作系统作为一个基础系统软件,对下控制硬件(cpu.内存.磁盘网卡等外设),屏蔽了底层复杂多样的硬件差异:对上则提供封装良好的应用程序接口,简化应用程序开发者的使用难度.站 ...

  6. Net6 Configuration & Options 源码分析 Part2 Options

    Net6 Configuration & Options 源码分析 Part2 Options 第二部分主要记录Options 模型 OptionsConfigurationServiceCo ...

  7. 反病毒攻防研究第006篇:简单木马分析与防范part2

    一.前言 一般来说,木马是既有客户端也有服务器端的.上次讨论的不过是一种特殊情况,毕竟不是人人都懂得DOS命令,因此现在木马的客户端也都是做成非常直观的界面形式,方便操作.本篇文章会从客户端与服务器端 ...

  8. Lab1:练习四——分析bootloader加载ELF格式的OS的过程

    练习四:分析bootloader加载ELF格式的OS的过程. 1.题目要求 通过阅读bootmain.c,了解bootloader如何加载ELF文件.通过分析源代码和通过qemu来运行并调试bootl ...

  9. Net6 DI源码分析Part2 Engine,ServiceProvider

    ServiceProvider ServiceProvider是对IServiceProvider实现,它有一个internal的访问修饰符描述的构造,并需要两个参数IServiceCollectio ...

随机推荐

  1. java枚举学习enum

    java 1.5以后才出现enum的关键字 所有的enum类都继承自Enum类,所以enum类无法再继承其他的类,可以实现接口,枚举类出了不能被继承其余的与普通类的特性一致, 枚举类的构造函数只能自己 ...

  2. 用遗传算法解决TSP问题

    浅谈遗传算法:https://www.cnblogs.com/AKMer/p/9479890.html Description \(小m\)在踏上寻找\(小o\)的路程之后不小心碰到了大魔王\(fat ...

  3. org.springframework.web.client.HttpClientErrorException: 400 null

    异常代码: org.springframework.web.client.HttpClientErrorException: 400 null 已解决. 百度了一下400代表无法解析请求. 说明请求是 ...

  4. 解决mysql 客户端连接问题

        问题:在linux 上安装了mysql服务端,使用客户端连接时报错信息为:ERROR 1045 (28000): Access denied for user 'root'@'localhos ...

  5. POJ 1664 放苹果(递归或DP)

    一.Description 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. Input 第一行是测试数据的数目t ...

  6. MySQL on Azure高可用性设计 DRBD - Corosync - Pacemaker - CRM (二)

    在上一篇文章中描述了MySQL HA on Azured 设计思路,本篇文章中将描述具体的部署,每个组件的安装和配置. 整体的设计架构如下: 下面将是所有组件的安装配置过程,所有的虚拟机是CentOS ...

  7. 一:安装Scala

    Scala是一种类似Java的纯面向对象的函数式编程语言,由于函数具有明确的确定输入对确定输出的关系,所以适合推理和计算,一切函数都可以看成一系列的计算组成,另外由于Scala函数是没有副作用和透明的 ...

  8. 游戏中的 2D 可见性

    转自:http://www.gameres.com/469173.html 拖动圆点转一圈,看看玩家都能看到些什么: 这个算法也能计算出给定光源所照亮的区域.对每条光线,我们可以构建出被照亮区域的光线 ...

  9. 七 内置锁 wait notify notifyall; 显示锁 ReentrantLock

    Object中对内置锁进行操作的一些方法: Java内置锁通过synchronized关键字使用,使用其修饰方法或者代码块,就能保证方法或者代码块以同步方式执行. 内置锁使用起来非常方便,不需要显式的 ...

  10. 8.ireport 取消自动分页,detail不分页

    转自:http://www.blogjava.net/vjame/archive/2013/10/12/404908.html 报表文件属性页面 lgnore pagination 勾选上,就可以取消 ...