操作系统基础:从开机流程洞悉其运作原理
深入剖析操作系统:从开机流程洞悉其运作原理
一、课程导入与回顾
上一讲我们初步认识了操作系统,了解到计算机系统如同一个有序的“三层建筑”。底层是硬件,像CPU、内存、键盘等,它们是计算机的物理基础;中间层是操作系统,起着承上启下的关键作用;上层则是各类应用程序,比如常用的Word软件。操作系统为上层应用提供了使用硬件的接口,就像printf
函数,极大地方便了我们输出信息,提高了计算机的使用效率。
然而,很多同学在学习操作系统时,往往只关注open
、fork
等接口的使用,局限于编写上层应用程序。但本课程的目标更为深入,旨在“揭开钢琴的盖子”,深入操作系统内部,探究其运作原理,就如同打开钢琴,了解其复杂的构造与发声机制,为后续设计和改进操作系统筑牢根基。
二、探索开机背后的秘密
开机时那神秘的黑色屏幕背后隐藏着操作系统启动的关键信息。我们每次开机都会看到这个画面,想必大家都充满好奇。从这里入手探索,既合理又能满足好奇心。为此,我们精心安排了实验一,期望大家通过程序控制开机画面和启动过程。本次课会讲解部分控制方法,大家课后可以自己动手编程实践,毕竟实践出真知,只有亲自操作,才能更深刻地理解操作系统。
要弄清楚开机后发生了什么,需要我们主动思考,借助已有的知识、常识和推理能力。而了解计算机的工作原理,是解决这个问题的关键,它是计算机行业的核心常识,对理解操作系统至关重要。
三、计算机工作原理基础
计算机是基于计算模型设计的,其中阿兰·图灵在1936年提出的图灵机极具代表性。图灵机模拟了人在纸上的计算过程,比如计算3+2,小孩子看到纸上的数字后,在大脑中运算,得出结果后再写下来。图灵机用一条纸带模拟纸张,用控制器模拟大脑,用读写头模拟眼睛和笔。控制器读取纸带上的数字和运算符,按照内部逻辑运算,最后将结果写在纸带上。不过,这种图灵机功能较为单一,只能进行特定运算。
后来,图灵又提出了通用图灵机。可以把普通图灵机想象成只会做一道菜的厨师,而通用图灵机则像能看懂各种菜谱的厨师。厨师根据不同菜谱在脑海中形成不同的做菜逻辑,通用图灵机的控制器初始是空白的,读入不同的逻辑(程序)后,就能完成相应的运算,如读入加法逻辑就能做加法,读入乘法逻辑就能做乘法。这里设置控制器动作的“菜谱”,其实就是计算机中的程序。
将程序载入计算机执行任务,这一思想由冯·诺伊曼提出。他主张把程序存到内存里,然后载入到CPU(当时叫控制器)中解释执行,就能输出结果。其基本结构是把程序载入内存,用一个指针(IP或PC指针)指向当前要处理的指令,然后进行“取指执行”,计算机便自动开始工作。所以,“取指执行”是计算机工作的核心机制。
四、开机流程深度解析
对于常见的x86结构(英特尔结构)计算机,刚上电时,内存中存在一部分固化的程序——BIOS(Basic Input Output System,基本输入输出系统),它被固化在FFFF0处。计算机硬件自动设置CS = FFFF,IP = 0,通过计算CS左移四位 + IP
得到的地址恰好是FFFF0,计算机由此开始执行BIOS程序。
BIOS程序肩负重任,它会全面检查内存、键盘、显示器、软盘硬盘等硬件设备,尤其是主板。若检查不通过,说明硬件存在问题,操作系统将无法启动。若检查通过,BIOS会从磁盘的零磁道零扇区读入一个512字节的扇区到内存的7C00处,这个扇区就是操作系统的引导扇区。引导扇区包含操作系统的第一段代码,读入后,BIOS会把CS设置为7C0,IP设置为0,程序跳转到引导扇区开始执行操作系统代码。
引导扇区使用汇编代码编写,以boot set.s
文件为例。汇编代码的优势在于每一条指令都能精准地变成机器指令,便于精确控制。在boot set.s
中:
- 首先给段寄存器DS和ES赋值,并设置SI和DI为0,从而形成7C00和90000(十六进制)两个地址。
- 接着使用
repeat mov
指令,移动256个字(512字节),将boot set
从7C00处挪到90000处,为后续操作腾出空间。 - 然后通过间接跳转指令,让程序跳到新的位置继续执行。
- 再使用
int 13
中断读磁盘,从第二个扇区开始读四个扇区,将数据读到内存的90200处,这四个扇区组成了setup
代码。
读完setup
后,会使用int 0x10
中断在屏幕上输出“loading system”,这就是开机logo。由此可知,黑色屏幕背后完成了打出开机logo,读入操作系统部分代码(先读入setup
,后续还有更多内容要读)的操作。如果想修改开机logo,比如改成“李OS is loading”,只需替换相应字符串、修改字符数量相关参数,重新编译boot set.s
并重新引导系统即可,这也是实验一的部分内容。
boot set.s
完成任务后,通过修改CS和IP的值(CS = 9020,IP = 0),将控制权交给setup.s
,setup.s
开始取指执行,开机进入新的阶段。
流程图
五、操作系统启动后续流程及意义
setup.s
执行时,会进一步对系统进行初始化操作,比如获取和设置系统硬件信息。在这个过程中,会读取更多操作系统关键模块和代码到内存,还会与硬件设备进一步交互,像持续读取磁盘、初步设置内存管理等,逐步构建起操作系统运行所需的环境。
当setup.s
完成使命,会将控制权传递给操作系统的下一个关键部分。后续程序依据既定逻辑和规则,持续完善系统启动流程,直到整个操作系统完全启动并能正常使用。
整个操作系统启动过程环环相扣,任何一个环节出现问题都可能导致系统无法正常启动。理解这些启动过程,不仅能让我们知晓操作系统是如何启动并开始工作的,还为后续深入学习操作系统的进程管理、内存管理、文件系统管理等机制奠定了坚实基础。这只是深入探索操作系统内部运作的开端,后续还有许多有趣且关键的知识等待我们去学习和挖掘。
六、汇编知识
该视频围绕操作系统展开,其中涉及的汇编知识是理解计算机底层运行机制和操作系统启动过程的关键。这些知识贯穿于操作系统启动的各个环节,从BIOS程序执行到引导扇区操作,再到系统初始化,对系统的正常运行起着不可或缺的作用。具体如下:
- 段寄存器与偏移地址:在x86结构中,内存地址由段寄存器(如CS、DS、ES等)和段内偏移(如IP、SI、DI等)组成。例如,刚上电时,计算机硬件自动设置CS = FFFF,IP = 0,通过CS左移四位再加上IP得到物理地址FFFF0,以此确定程序执行的起始位置。在引导扇区的汇编代码
boot set.s
中,也通过给段寄存器DS和ES赋值,并设置SI和DI为0,形成了如7C00和90000(十六进制)等地址,用于数据传输和程序跳转等操作 。 - 汇编指令
- 数据传输指令:
mov
指令用于数据传输,在boot set.s
中,使用mov
指令对寄存器进行赋值,如mov ax, 值
mov dx, 值
等,通过这种方式设置寄存器的值,进而实现对内存地址和数据的操作 。 - 重复移动指令:
repeat mov
指令(视频中可能是类似功能的指令表述)用于重复移动数据。在boot set.s
里,利用该指令移动256个字(512字节),把boot set
从7C00处挪到90000处,为后续操作腾出空间 。 - 跳转指令:间接跳转指令(如
jmp
相关指令)在程序流程控制中发挥重要作用。在boot set.s
执行过程中,通过间接跳转指令,使程序跳到新的位置继续执行,确保程序按照预定逻辑运行 。 - 中断指令:
int
指令用于触发中断。视频中提到的int 13
中断用于读磁盘操作,从磁盘特定扇区读取数据到内存;int 0x10
中断用于在屏幕上输出字符,如显示开机logo“loading system” 。
- 数据传输指令:
- 汇编语言在操作系统中的应用优势:相较于C语言,汇编语言的每一条指令都能直接变成机器指令,可对硬件进行完整控制。在操作系统引导过程中,对代码的精确控制至关重要,例如引导扇区代码必须精准控制内存地址和硬件操作,因此操作系统中会大量使用汇编语言 。
- 汇编代码与硬件交互:汇编代码直接与硬件进行交互。在BIOS程序执行时,汇编代码用于检查内存、键盘、显示器、软盘硬盘等硬件设备,确保硬件正常运行,为操作系统的启动创造条件 。在引导扇区和
setup.s
执行过程中,也通过汇编代码实现与磁盘、内存等硬件设备的数据传输和操作,如从磁盘读取数据到内存特定位置,以及对内存管理的初步设置等 。