- 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:进行一系列初始化。
总结:操作系统的启动可归纳为两件事:
- 一是从硬盘读入操作系统到内存中;
- 二是将操作系统建立起来,即初始化操作系统。