0%

L3-操作系统启动

  • setup.s -> system模块

L3 操作系统启动

setup.s

  • setup.s 程序代码的作用是要先得到计算机硬件的参数以方便system模块,即操作系统管理他们;然后do_move的作用是将system模块的起始位置挪动到0地址;再进入保护模式,改变取指方式(以gdt表来扩充内存地址),由1M(20位)扩充到4G(32位);最后通过jumpi 0,8跳到0地址处执行system模块代码。

  • 初始化 gdt 表:

    根据 gdt 表(global description table)来取指执行。

system模块

  • system模块是在bootsect.s和setup.s代码执行完毕后执行的代码模块。

    system模块由许多部分组成,其中head.s是system模块最开始的部分。

head.s
  • 到system模块的head.s文件时,汇编代码已经和bootsect.s的汇编代码不同了,因为前者是32位汇编代码,后者则是16位。

    head.s代码初始化了idt表和gdt表。

    注意:之前也初始化过一次gdt表,不过那是gdt临时表,是为jumpi 0,8服务的,这里是初始化了真正的gdt表。

  • 在head.s代码文件执行完之后,要从该代码文件跳转到main.c文件继续执行,类似于C语言函数互相调用,该跳转是利用栈来完成的。其中,main()函数将由于L6陷入死循环,这是应该的,只有main()函数陷入了死循环,操作系统才能一直运行下去。

main.c
  • main.c代码文件开始进行一系列的初始化。

  • ★★★bootsect.s:将操作系统从磁盘读入内存 ;

    -> setup.s:得到计算机硬件各参数以便操作系统管理,进入保护模式以改变取指方式;

    -> head.s:初始化 idt 表和 gdt 表;

    -> main.c:进行一系列初始化。

  • 总结:操作系统的启动可归纳为两件事:

    • 一是从硬盘读入操作系统到内存中;
    • 二是将操作系统建立起来,即初始化操作系统。
---------------The End---------------