• 《第三讲 操作系统启动》


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

      

       以对内存初始化为例:

       

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

      

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

  • 相关阅读:
    BZOJ3790 神奇项链
    Tarjan求Lca
    Manacher算法--Poj3974
    [Usaco2015 Feb]Censoring
    扩展Kmp
    Ural1297 最长回文串
    [Usaco2007 Dec] 队列变换
    Pku2774 最长公共子串
    Spoj 694 Distinct Substrings
    Pku1734 Musical Theme 不可重叠最长重复子
  • 原文地址:https://www.cnblogs.com/573177885qq/p/4326183.html
Copyright © 2020-2023  润新知