OS_3
setup.s模块:完成OS启动前的设置,为操作系统管理硬件做准备。
例如:
读内存大小并保存起来,操作系统要管理内存得知道他多大。
获取光标的位置,显卡参数,根设备号等信息后,操作系统会形成很多数据结构来管理这些设备,来形成表来管理内存,这时候就是操作系统开始接管硬件。
后面会将操作系统移动到0地址。如果操作系统很长,用的地址超过了0x7c00,即bootset的地址向上移动。操作系统以上的的地址就用来放应用程序
所以开机的过程就是 读取操作系统,初始化操作系统。
setup最后会进入保护模式,jmpi 0,8.。把0赋给IP,把8赋给CS,那么CS<<4+IP是80,但这是错的。应该跳到0地址处。所以这时候寻址方式改变了,即从16位机切换到32位机,切换到32位的寻址模式。
16位和32位的区别是,cpu的解释程序不一样。32位要走另一条电路来实现。切换的方法是通过一条指令 mov cr0 ,ax。cr0是一个寄存器,最低位PE为1启动保护模式,为0就是是实模式,这也让CPU走另一条电路。
保护模式下的地址翻译,即gdt的作用,gdt用硬件来做速度快。保护模式下根据CS查表+ip,CS放的是查表的下标,CS被称为选择子,从表中选出基址,表里的内容是物理内存地址。setup会初始化表。
保护模式下中断处理函数入口,即idt的作用,IDT表内的是中断处理函数入口。
setup建立表是为了跳入head.s的代码,head.s是system的第一个文件,且head.s还会再次初始化表。