先回顾下上节课内容。上电后,计算机首先将操作系统从磁盘中载入到内存里,由引导程序bootsect.s完成。bootsect.s将操作系统的代码分段读入,首先读setup,打出logo,
把操作系统中的system部分也读进来,bootsect完成使命,接下来交给setup执行。
操作系统通过setup对计算机的硬件建立认知,对其进行管理。
int 0x15:15号中断,获取物理内存的大小。
mov [2],ax:扩展内存。
接下来的程序把操作系统从90000处移到了0处,以后内存从0处开始为操作系统,之上为应用程序。这也解释了为什么上节课中要对setup进行向上移动。
setup退出之前,进入保护模式。
jmpi 0,8 跳到80处,会发生错误,正确应该跳到0处,所以,寻址方式应该发生改变。原因是,对于16位机,只能寻址1M的内存空间,
要想扩大寻址空间,改为32位寻址方式,也叫保护模式。两种方式的本质区别在于,cpu对程序的解释不同。通过两条红色指令,改变PE的值
就可切换。
gdt(global describation table):表用硬件完成,目的是速度更快。
CS:不再是左移四位的基址,而是选择子,对应的是查表的下标索引,表中存放基址。所以jmpi 0,8中CS=8是查表,根据表项产生基址。
在setup中对表进行初始化
总结下setup的作用:读硬件参数(为以后建立参作系统打下基础),挪动system到00地址处(操作系统的核心代码将一直停在此处),然后启动保护模式,
最后应用一条高级指令(32位)跳到0地址处执行。
接着执行system处的代码。
makefile:操作系统通过makefile产生一个Image(镜像,符合bootsect-setup-system)并放入0磁道0扇区,然后操作系统被顺利读入,产生桌面。
head.s是system的第一段代码,通过树状结构完成Image。
由head.s调用main.c,借助堆栈完成,L6永远不会被执行。
进入main.c函数,主要完成对硬件的初始化
以对内存初始化为例:
以数组的形式对内存进行初始化。
总结下这节课,实际上完成了两件事:把操作系统读入内存,完成初始化。