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

 

posted @ 2015-12-26 16:09  fatsheep9146  阅读(11307)  评论(3编辑  收藏  举报