操作系统是如何被加载的?
Contents
最近在学习计算机操作系统,其知识结构庞杂,难度对于我来说挺大的,深感有必要写点笔记,思考、总结、输出也许方能领会其中。第一篇文章就从一个简单的角度入手.
计算机通电后,操作系统是如何开始运行的?
首先,关注下计算机主板(mother board)上四个关键硬件:BIOS,主存(RAM),硬盘(Hard Disk),CPU:
- BIOS:Basic Input/Output System,主板上的一个固件程序(Firmware),通常是预装在主板上的,计算机通电之后就是靠他开始第一步的工作。
- RAM:这个大家都比较熟悉,不同的程序运行在主存上不同的地址空间。
- HD:硬盘的第一个扇区一共512个字节,存储了一个小玩意叫BootLoader,就是靠他来加载操作系统内核的。
- CPU:下图可以看到CPU里我只画了寄存器registers,常用的寄存器包括AX、DX、stack pointer、instruction pointer等。
加载BIOS
主板制造商会将固件程序编译成二进制文件,写入BIOS芯片中(固件程序一般是用汇编语言编写)。计算机通电启动时,BIOS会被加载到主存上,自动执行一系列固定程序来检测计算机硬件是否正常,例如检测内存、硬盘、键盘、鼠标等外部设备,并且根据预设的启动顺序查找硬盘上的引导程序(boot loader)。
CPU的指令寄存器会指向主存上BIOS指令的起始地址0xFFFF0(上图红色虚线指向的第一个位置)。当CPU执行一条指令时,它会将指令指针自增以指向下一条指令的地址。
加载BootLoader
BootLoader程序加载到主存上执行,执行起始地址为0x7C00(上图红色虚线指向的第二个位置)。 BootLoader主要负责在计算机启动时加载操作系统内核(kernel)到内存中,并将控制权转交给内核,使其能够开始执行。所以,开发操作系统,编写boot代码是绕不开的第一步。
加载操作系统内核
BootLoader将硬盘上存储的操作系统内核加载到相应的的内存地址空间。执行起始地址为0x100000(上图红色虚线指向的第三个位置)。 操作系统内核在被加载到内存之前,需要经过解压缩和初始化等一系列操作。解压缩是因为操作系统内核一般包含大量指令和数据,压缩存储在硬盘相对节省空间;
初始化包括以下几个方面:
- 初始化CPU:内核会对CPU进行初始化,包括设置CPU的寄存器、设置中断处理程序(interupt)和系统调用处理程序(sys call)等,以便在操作系统运行时能够调用它们。
- 初始化内存:内核会对内存进行初始化,包括检测可用内存、分配内存空间等。在初始化过程中,内核还会设置页表(page table)等,以便操作系统能够正确地访问内存。
- 初始化设备驱动程序:内核会加载并初始化设备驱动程序,以便操作系统能够访问硬件设备。在初始化过程中,内核会从文件系统中加载设备驱动程序,并将它们链接到内核中(动态链接)。
- 加载系统模块:在初始化过程中,内核会从文件系统中加载一些必要的模块,并将它们链接到内核中。这些模块包括文件系统模块、网络模块、安全模块等,它们可以提供一些必要的服务,例如文件系统访问、网络通信等。
- 启动用户空间初始化程序:内核初始化完成后,会启动用户空间初始化程序(user space initialization program),它负责启动其他系统进程,并提供一些必要的服务(例如网络、文件系统等)。
完成上述操作后,内核会将控制权转交给用户空间初始化程序,从而完成操作系统的启动。
在Windows操作系统中,用户空间初始化程序是Windows Explorer(或称为资源管理器)。Windows Explorer是一个图形化用户界面,它提供了用户在Windows系统中的桌面环境,并且负责启动其他系统进程和服务,例如Windows服务、网络服务等。
结尾
本文个别地方因为知识局限就没有展开,随着学习的深入以后有机会再探讨。
参考
1.柏林工业大学 Viktor Engelmann 他的个人主页http://www.algorithman.de/Autor/index.php
2.清华大学 陈渝 操作系统原理课程 B站有很多他的课程视频
3.intel官方网站:https://www.intel.com/content/www/us/en/gaming/resources/how-to-update-bios.html
Author Jeffery@slc
LastMod 2023-03-06