MIT6.828-2018-Lab1

Lab1这一节并不需要写代码,需要了解相关概念和指令,为后续的Lab打基础

Lab1:启动PC

Part 1: PC Bootstrap

这一部分主要就是了解一下x86汇编语言和PC的引导程序,按照Lab上的命令输入时,遇到了如下错误:

error: 进行make qemu-gdb和make gdb时,小心两个端口不一样,会报错localhost:26000: 连接超时.,可能是make qemu-gdb监听的端口是25000,这个可以在make qemu-gdb之后看到,需要去你lab的文件下找gnumakefile文件,将25000更改为26000即可

+------------------+  <- 0xFFFFFFFF (4GB)
|      32-bit      |
|  memory mapped   |
|     devices      |
|                  |
/\/\/\/\/\/\/\/\/\/\

/\/\/\/\/\/\/\/\/\/\
|                  |
|      Unused      |
|                  |
+------------------+  <- depends on amount of RAM
|                  |
|                  |
| Extended Memory  |
|                  |
|                  |
+------------------+  <- 0x00100000 (1MB)
|     BIOS ROM     |
+------------------+  <- 0x000F0000 (960KB)
|  16-bit devices, |
|  expansion ROMs  |
+------------------+  <- 0x000C0000 (768KB)
|   VGA Display    |
+------------------+  <- 0x000A0000 (640KB)
|                  |
|    Low Memory    |
|                  |
+------------------+  <- 0x00000000

这个图还是蛮重要的,最早期的16-bit Intel 8086处理器仅支持1MB(0x00000000~0x000FFFFF)的物理寻址能力,在8086处理器系统中,ROM占据着最上面的64KB内存空间,根据ROM的特性,BIOS就直接写入里面
执行make gdb后,有如下输出:

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

8086处理器加电或者复位时会自动将CS设置为0xF000,IP设置为0xFFF0,意味着第一条指令会在物理内存0xFFFF0处开始执行,执行的命令是跳转,CS:0xF000,IP:0xE05B,即跳转到0xFE05B,BIOS的前半部分,进行一些初始化的工作

Part 2: The Boot Loader

对于PC而言,软盘和硬盘都可以被划分为一个个大小为512字节的扇区。一个扇区是一次磁盘操作的最小粒度。每一次读取或者写入操作都必须是一个或多个扇区。

第一个扇区称为引导扇区,因为这是引导加载程序代码所在的位置,当BIOS找到可引导的软盘或硬盘时,它将512字节的引导扇区加载到物理地址0x7c00到0x7dff的内存中(这里正好是512字节),然后使用jmp指令将CS:IP设置为0x0000:0x7C00
为什么是0x7C00,8088处理器的计算机当时搭配的操作系统是[86-DOS],这个操作系统需要的内存最少是32KB
8088芯片本身需要占用0x0000~0x03FF,用来保存各种中断向量的储存位置。所以,内存只剩下0x0400~0x7FFF可以使用。为了把尽量多的连续内存留给操作系统,Boot Loader就被放到了内存地址的尾部。由于Boot Loader所在的这个扇区是512字节,另外Boot Loader数据和栈需要预留512字节。所以,Boot Loader加载位置是0x7c00,而且因为操作系统加载完成后Boot Loader不需要再使用,这部分内存之后操作系统是可以重复利用的。

 0x7FFF - 512 - 512 + 1 = 0x7C00 

处理器在什么时候开始执行32位代码?究竟是什么导致从16位模式切换到32位模式?

[ 0:7c2d] => 0x7c2d: ljmp $0x8,$0x7c32 这条指令之后
也就是 boot.S 中的 ljmp $PROT_MODE_CSEG, $protcseg ,地址符号就变成 0x7c32 了

执行的引导加载程序的最后一条指令是什么,它刚加载的内核的第一条指令是什么?
内核的第一条指令在哪里?
引导加载程序如何决定从磁盘获取整个内核必须读取多少扇区?它在哪里找到这些信息?

你可能感兴趣的:(MIT6.828-2018-Lab1)