第1节先看一下bootloader的加载执行,bootloader用来加载操作系统内核,我们的操作系统运行在(i386)x86-32位CPU上面。
因为i386运行的时候,也是先运行在8086模式,然后才切换到i386模式去运行,所以我们对8086跟i386的寄存器,寻址的方式,以及分段机制要有一定的了解,8086是16位的CPU,它有8个16位的通用寄存器,4个16位的段寄存器,受当时工业的限制,它的数据线只能做到16位,但是地址线可以做到20位,这样它寻址的范围就是2的20次方1M,
但是指令在访问地址的时候,通常是把地址放在寄存器里面的,那么这时候一个16位的寄存器,就无法放一个20位的地址,所以8086它的寻址方式是结合着段寄存器来操作,它把段寄存器里面存储的16位的地址左移4位,得到一个20位的基地址,再加上一个偏移地址就可以获取到实际的一个20位的物理地址,
后来的i386就是32位的CPU,它的寄存器数据线跟地址线都是32位的,那么这时候一个寄存器里面,就可以存放一个32位地址,这时候其实就不需要段寄存器了,但是i386为了跟8086进行兼容,它依然保留了段寄存器,并且使用段寄存器来实现保护机制,这时候段寄存器里面存放的是段选择子,根据段选择子跟偏移地址来获取到实际的物理地址,我们一会会看,
i386又称为保护模式,它使用的是虚拟地址,通过虚拟地址来实现一些保护的机制,而8086又称为实模式它使用的是物理地址,使用物理地址的话就无法实现保护的机制,比如在物理地址里面,代码段跟数据段都是一样的都可以读写,这样我们就无法对代码进行保护,而使用虚拟地址的话,我们就可以针对代码段跟数据段设置不同的权限,只有权限满足的话,我们才把这个虚拟地址转换成它实际的物理地址,
在i386中可以使用分段机制来实现保护跟虚拟地址,在分段机制中,每一个进程会有一个自己的虚拟地址空间,虚拟地址空间的大