MIT6.828 lab1地址:http://pdos.csail.mit.edu/6.828/2014/labs/lab1/
第一个练习,主要是让我们熟悉汇编,嗯,没什么好说的。
Part 1: PC Bootstrap
首先,整个实验使用qemu这款模拟软件来,来对代码进行调试,相当于我们在qemu这个模拟的计算机平台上,运行自己的程序。可以再qemu这个软件上进行gdb的调试,比较方便。
首先看下整个内核在qemu上的模拟的结果:
整个内核现在能实现的就两个功能,一个kerninfo,显示内核的一些简单信息,还有个help,暂时什么都没有。这里先来看下kerninfo里面的东西,主要是内核的一些入口地址,数据,程序地址什么的。这里可以看到,虚拟内存和物理内存的映射就是简单的线性映射,比较直观。
接下来看一下系统的具体的启动过程是怎么样的:
这张图是整个系统的物理内存的分布。主要看一下地址在0x100000(1MB)以下的内存分布情况,系统启动的时候主要是在1M以下的地方活动。对于很多PC来说,1M一下的存储布局都是差不多的,这个主要是因为最开始的Intel的的8088一开始内存只有1M,所以后面的计算机为了向下兼容,在1M一下的内存布局都是这样的。
这里主要是看下BIOS,BIOS是Basic Input/Output System,主要的工作是做各种初始化,比如检查一下内存的大小,还有显卡等一些外设的初始化,然后会载入OS,运行内核。
接下来看一下BIOS的具体的引导步骤:
首先,打开两个终端,分别输入命令:make qemu-gdb和gdb
打开gdb,就可以看到下面的内容:
程序是从地址0xffff0开始的,而且一开始就来一个长跳转。开始地址是0xffff0的原因是,以前的PC因为只有1M的内存,采用的是实地址模式,为了在开机和重启的时候能够保证跳到BIOS里面,就把开始的地址设定为0xffff0,因为那个地址已经非常的接近1M地址的顶部,在那里不会有其他程序。
可以看到,在左边,有一个[f000:fff0],程序地址就是通过这个来计算的。这两个分别是寄存器cs和eip的值。