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


    Lab 1 Part 1: PC bootstrap

      我们继续~

    PC机的物理地址空间

      这一节我们将深入的探究到底PC是如何启动的。首先我们看一下通常一个PC的物理地址空间是如何布局的:

                                  

      这张图仅仅展示了内存空间的一部分。

      第一代PC处理器是16位字长的Intel 8088处理器,这类处理器只能访问1MB的地址空间,即0x00000000~0x000FFFFF。但是这1MB也不是用户都能利用到的,只有低640KB(0x00000000~0x000A0000)的地址空间是用户程序可以使用的。如图所示。

      而剩下的384KB的高地址空间则被保留用作其他的目的,比如(0x000A0000~0x000C0000)被用作屏幕显示内容缓冲区,其他的则被非易失性存储器(ROM)所使用,里面会存放一些固件,其中最重要的一部分就是BIOS,占据了0x000F0000~0x00100000的地址空间。BIOS负责进行一些基本的系统初始化任务,比如开启显卡,检测该系统的内存大小等等工作。在初始化完成后,BIOS就会从某个合适的地方加载操作系统。

      虽然Intel处理器突破了1MB内存空间,在80286和80386上已经实现了16MB,4GB的地址空间,但是PC的架构必须仍旧把原来的1MB的地址空间的结构保留下来,这样才能实现向后兼容性。所以现代计算机的地址 0x000A0000~0x00100000区间是一个空洞,不会被使用。因此这个空洞就把地址空间划分成了两个部分,第一部分就是从0x00000000~0x000A0000,叫做传统内存。剩下的不包括空洞的其他部分叫做扩展内存。而对于这种32位字长处理器通常把BIOS存放到整个存储空间的顶端处。

      由于xv6操作系统设计的一些限制,它只利用256MB的物理地址空间,即它假设用户的主机只有256MB的内存。

    The ROM BIOS

      现在我们就开始利用Qemu和gdb去探索PC机的启动过程。首先看一下如何利用这两个软件来实现对操作系统的debug。

      1. 首先打开一个terminal并且来到lab目录下,输入命令

              make qemu-gdb

        此时,屏幕上会打印下列信息:

        

      2. 我们再新建一个terminal,还是来到lab目录下,输入gdb指令,此时屏幕输出信息:

        

      这样其实就已经可以开始调试了!

      这里面我们要看最下面5行

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

      这条指令就是整个PC启动后,执行BIOS的第一条指令。
      
      Exercise 2: 使用GDB的'si'命令,去追踪ROM BIOS几条指令,并且试图去猜测,它是在做什么。但是不需要把每个细节都弄清楚。
      
      关于Exercise 2的分析,可以看我的这篇博文: MIT 6.828 JOS学习笔记3. Exercise 1.2 http://www.cnblogs.com/fatsheep9146/p/5078179.html
     
        综上,我们可以看到BIOS的操作就是在控制,初始化,检测各种底层的设备,比如时钟,GDTR寄存器。以及设置中断向量表。这都和Lab 1 Part 1.2最后两段说的一样。但是作为PC启动后运行的第一段程序,它最重要的功能是把操作系统从磁盘中导入内存,然后再把控制权转交给操作系统。所 以BIOS在运行的最后会去检测可以从当前系统的哪个设备中找到操作系统,通常来说是我们的磁盘。也有可能是U盘等等。当BIOS确定了,操作系统位于磁 盘中,那么它就会把这个磁盘的第一个扇区,通常把它叫做启动区(boot sector)先加载到内存中,这个启动区中包括一个非常重要的程序--boot loader,它会负责完成整个操作系统从磁盘导入内存的工作,以及一些其他的非常重要的配置工作。最后操作系统才会开始运行。
     
      可见PC启动后的运行顺序为 BIOS --> boot loader --> 操作系统内核

      以上就是Lab 1 Part 1部分的全部内容,有问题或纠正错误的同学,欢迎发送到

        zzqwf12345@163.com

  • 相关阅读:
    mockm remote 不能正常使用的解决方案
    uviewui 的 bug 当 url 的 query 参数中有 http://127.0.0.1/ 并且省略请求前缀的时候, 就会导致请求无法发送出去
    检查 nodmeon 是否可以修改文件后重启应用
    mocha 如何延迟指定时间后再运行所有用例
    使用 babel 编译 js 为 es5 支持 ie
    git 摘取提交
    Makefile学习笔记
    使用 Service Worker 缓解网站 DDOS 攻击
    如何热更新长缓存的 HTTP 资源
    网站图片无缝兼容 WebP/AVIF
  • 原文地址:https://www.cnblogs.com/fatsheep9146/p/5078102.html
Copyright © 2020-2023  润新知