《第三讲 操作系统启动》

     先回顾下上节课内容。上电后,计算机首先将操作系统从磁盘中载入到内存里,由引导程序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函数,主要完成对硬件的初始化

  

   以对内存初始化为例:

   

   以数组的形式对内存进行初始化。

  

  总结下这节课,实际上完成了两件事:把操作系统读入内存,完成初始化。

原文地址:https://www.cnblogs.com/573177885qq/p/4326183.html