这篇blog主要是承接上文,看看setup模块都做了哪些事情,同时涉及到一些System模块的内容。
Setup
这个模块主要的工作都是初始化相关的。
获取硬件参数
OS要管理硬件,如内存、显示器等。以内存为例,要管理内存,就需要知道内存到底有多少。在setup模块中,OS会获取扩展内存大小。
8086有20根地址线。所以1M以外的内存都叫扩展内存。
移动System模块
将System模块,也就是操作系统核心内容,移动到0地址处。
这也可以理解为什么cpu设计者不让bios结束时把引导扇区读到0地址,因为那样会影响实际的OS。像bootsect、setup都是用完就用处不大的模块,不该让他们在0地址处。
进入保护模式
上面提到,实模式内存不够用,要进入保护模式,进入保护模式的方法是修改cr0寄存器。
保护模式的寻址规则与实模式不一样。
如图,GDT表就是一个数组,我们的cs相当于数组下标,ip是段内偏移。
(IDT是中断描述符表,道理完全类似,所以放在一起说了)
而GDT表一开始是不存在的,谁来初始化GDT表呢?答案是setup模块。
setup模块会初始