操作系统启动
什么是操作系统?
系统软件
操作系统是计算机硬件与应用软件之间的一层软件,用来管理各种硬件以及给应用软件提供统一的接口。

冯诺伊曼存储程序思想
即将程序和数据放到计算机内粗存储器中,计算机在程序的控制下一步一步进行处理,基本步骤是不断地取值执行。
计算机启动过程
BIOS
- 计算机刚上电时处于实模式,根据CS:IP寻址到第一段程序,即ROM BIOS映射区,BIOS检查RAM、键盘、显示器、软硬磁盘等。
- 将磁盘0磁道的第一个扇区(引导扇区)读入0x7c00处,并设置CS=0x07c0,ip=0x0000
- 引导扇区是启动设备的第一个扇区,因此硬盘上的第一个扇区存放着开机后执行的第一段可以控制的程序
![]()
bootsect.s
- 从BIOS跳转到引导扇区,引导扇区主要执行bootsect.s
- bootsect.s代码将setup.s读入内存,然后打印开机logo,再将操作系统剩余部分也加载进来
setup.s
- 作用一是获取计算机的各种硬件参数,比如内存等
- 从实模式进入保护模式,改变了寻址方式
- 建立保护模式下的全局描述符表gdt和中断处理函数表idt,gdt表由硬件实现,目的是加快速度。此时寻址方式从实模式下的CS左移4加IP,变成了保护模式下的根据CS查表(保护模式下分段了,不再是直接计算),然后加IP。gdt表和idt表都是用来进行地址翻译的。
![]()
- setup.s将操作系统移动到0地址处
head.s
- system模块由许多文件编译而成,第一部分代码是head.s
- system模块一般有一堆源码,通过makefile编译之后生成操作系统镜像文件Image,然后将该镜像写到0磁道的第一个扇区
- head.s中真正初始化gdt表和idt表,setup.s中只是临时建立了gdt表,setup.s进入保护模式,head.s进入之后进行初始化
![]()
- head.s中设置页表之后,会跳转到C函数main.c
![]()
main.c
- 设置页表之后,会执行函数main,即从head.s跳转到了main.c函数,即函数调用。main函数永远不会返回,操作系统是永不停止的程序
- main.c用来进行各种初始化
![]()
- 比如meminit是内存初始化,会初始化页表,每个页大小为4k,页表用来表示哪些是使用的,哪些是没有使用的
![]()
启动过程总结
-
bootsect.s:将os从磁盘读进来
-
setup.s:获得一些硬件参数,启动保护模式
-
head.s:初始化gdt表页表等,然后跳转到main.c
-
main.c:执行一系列初始化
-
启动过程一共做了两件事:一是将操作系统读入内存,二是进行初始化。






浙公网安备 33010602011771号