1

计算机启动过程(万字长文)

 4 months ago
source link: https://www.cnblogs.com/anywherego/p/17960904
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一、计算机启动的基本流程

当电源通电后,计算机系统的启动过程始于主板上的固件,通常是BIOS(基本输入/输出系统)或UEFI(统一可扩展固件接口)。基本流程如下:

1、电源通电

用户按下计算机电源按钮,电源开始供给计算机各个组件。此时,CPU并没有直接开始执行指令。

2、BIOS/UEFI

  • 自检: 电源通电后,控制权首先交给BIOS(或UEFI)固件。BIOS/UEFI负责进行自检(POST,Power-On Self-Test)。在自检过程中,BIOS/UEFI检查计算机的硬件组件,确保它们正常工作。如果自检发现问题,系统可能会发出蜂鸣声或在屏幕上显示错误信息。
  • 初始化硬件: BIOS/UEFI在自检完成后,开始初始化系统中的硬件组件,包括主板、内存、CPU、显卡等。这确保这些硬件能够在系统启动时正常工作。

3、Boot Loader 引导加载程序

  • 加载:一旦硬件初始化完成,BIOS/UEFI从预定义的引导设备(通常是硬盘或固态硬盘)中加载引导加载程序。BIOS确定从哪个设备引导计算机,例如硬盘、固态硬盘、光驱等。BIOS会尝试加载设备上的引导扇区(boot sector)或引导记录(boot loader)。
  • 执行:引导加载程序被加载到内存中后,控制权传递给它。引导加载程序的任务是加载操作系统内核到内存,并将控制权传递给操作系统。

4、操作系统启动

引导加载程序执行后,操作系统内核开始运行。操作系统初始化并接管计算机的控制。此时,用户通常会看到操作系统的启动画面或登录界面。

以上就是计算机通电后的基本工作流程。

电源BIOS/UEFIBoot LoaderOS通电并交付控制权自检和初始化硬件从引导设备加载引导加载程序到内存交付控制权从分区加载操作系统内核到内存交付控制权初始化并运行操作系统电源BIOS/UEFIBoot LoaderOS

现代操作系统是从最古老的8086系统一步一步发展而来的,处理器厂商为了向后兼容,很多底层相关的原理都是一样的(如果不兼容,就会丢弃市场份额)。

二、电源通电(系统上电)

1、用户按下电源按钮

计算机开机时,通常是通过前面板上的电源按钮(Power button)来触发硬件发出PWRSW#(Power Switch)信号的。基本流程如下:

  • 1.连接电源按钮: 电源按钮通常是连接到主板上的一个小电路板或电缆上的。这个电路板上有一个按钮,用户按下按钮就能触发电源信号。
  • 2.PWRSW#信号: PWRSW#是一个开关信号。按下电源按钮时,这个信号会从低电平(通常是地GND)变为高电平,然后再变回低电平。这种变化可以被主板的电路所感知。
  • 3.EC接收信号:嵌入式控制器(Embedded Controller EC)接收到PWRSW#信号,标志着电源启动过程的开始。

电源按钮和主板连接: 电源按钮通过一组线缆连接到主板上的一个特定的连接器(插脚),通常被标记为"PWRSW"(Power Switch),PWRSW#就是通过其发送给主板。

602164-20240112153354087-289349096.png

2、嵌入式控制器(Embedded Controller EC)

嵌入式控制器EC是挂在CPU的LPC(Low Pin Count)总线下的一颗嵌入主控芯片,嵌入式控制器的目的是帮助计算机(主要是笔记本)管理低速外设,像触摸板、矩阵键盘等,最重要的是计算机通过EC来做电源管理。

EC启动电源的流程:

  • 1.EC通知PMU: 主板上通常集成了一个电源管理电路(Power Management Circuit,PMU),EC通过一个特定的线路通知PMU启动电源。
  • 2.PMU启动PSU: 电源管理电路发出启动信号(一个由PMU产生的数字信号或电压信号)后,会激活电源供应单元(Power Supply Unit,PSU),使其开始为计算机各个部分提供电源,这个线路通常被称为“电源启动”(PS-ON)线路。
  • 3.PSU启动并供电:一旦接收到启动信号,PSU开始启动,并向计算机的各个部分提供电源。
ECPMUPSU通过特定的线路通知PMU启动电源发出启动信号(PS-ON)启动并向计算机各个部分提供电源ECPMUPSU

3、电源供应单元(Power Supply Unit,PSU)

电源供应单元(Power Supply Unit,PSU)是计算机硬件的关键组件之一,它负责将来自电源的交流电(AC)转换为计算机内部电子设备所需的直流电(DC),PSU(电源供应单元)通过内部的电压监控电路来确定各个部分的电压是否已经稳定。以下是这个过程的详细描述:

  • 1.PSU启动并供电:一旦接收到启动信号,PSU开始启动,并向计算机的各个部分提供电源。
  • 2.电压监控电路:PSU内部有一个电压监控电路,这个电路会实时监控PSU的所有输出电压。
  • 3.电压检测:电压监控电路会检测每个输出电压是否已经达到他们的正常值。例如,+12V的输出电压是否已经稳定在+12V,+5V的输出电压是否已经稳定在+5V,等等。
  • 4.电源正常信号:当电压监控电路检测到所有的输出电压都已经稳定在他们的正常值时,它会触发一个名为“电源正常”(POWERGOOD#或者PWROK#)的信号。这个信号是一个电压信号,通常在+5V左右。
PSU计算机各部分电压监控电路电源正常信号启动并供电监控所有输出电压检测每个输出电压是否正常触发电源正常信号(+5V)PSU计算机各部分电压监控电路电源正常信号

当开关电源启动之后,如果交流输入电压在额定范围之内,且各路直流输出电压达到允许的最低检测值(+5V 输出为4.75V 以上),那么经过100ms~500ms 的延时,P.G.电路就会发出“电源正常”的信号(P.OK 为高电平)。当电源交流输入电压降至安全工作范围以下或+5V电压低于4.75V 时,电源会送出“电源故障”信号(P.OK 为低电平)。P.G.信号非常重要,即使电源的各路直流输出都正常,如果没有P.G.信号或P.G.信号时序不对,都会造
成电脑不能开机。

当电源供应单元(Power Supply Unit,PSU)收到启动信号后,它会开始提供电源给计算机的各个部分。这个过程涉及到主板上的不同芯片组(例如南桥和北桥)、CPU、内存等组件。

以下是电源启动后各个部分供电的一般顺序:

  • 电源供应单元启动: 收到启动信号后,电源供应单元开始运行。现代电源通常是开关电源,其内部电子元件调整输出电压,确保其符合计算机系统的要求。
  • CPU供电: 电源供应单元提供电源给CPU。这通常涉及多个电源轨道,包括主要的+12V轨道和辅助的+5V和+3.3V轨道。CPU通常有自己的电源规格,供电参数由主板上的电源转换电路来管理。
  • 内存供电: 电源供应单元还提供电源给主板上的内存模块。内存通常需要+5V和+3.3V电源。
  • 南桥和北桥供电: 电源供应单元继续向主板上的芯片组提供电源。南桥和北桥是主板上的两个关键芯片组,它们负责管理与I/O、存储、网络等相关的功能。南桥通常较为周边,而北桥则更靠近CPU。现代计算机已经采用了集成的处理器(SoC)设计,其中 CPU 集成了原先北桥和南桥的功能。
  • 扩展卡和外围设备供电: 电源供应单元还为主板上的扩展卡(例如显卡、网卡)和外围设备提供电源。这些设备通常通过PCI Express插槽或其他连接器与主板相连。
  • 启动存储设备供电: 存储设备(如硬盘、固态硬盘)在电源启动后也会得到电源供应,以便可以被访问。

4、EC启动CPU

当嵌入式控制器(EC)收到PWROK(或POWERGOOD)信号后,它会开始启动计算机的启动过程。以下是一些具体的步骤:

  • 1.EC通知芯片组:EC监测来自电源供应单元(PSU)的PWROK信号,EC就会通知主板上的芯片组,发送名为PM_PWRBTN#的信号,开始计算机的启动过程。
  • 2.南桥和北桥的交互:南桥和北桥相互通信,确保电源管理的正常进行。南桥向北桥发送PLT_RST#信号,同时向CPU发送PWRGOOD#信号。
  • 3.CPU启动:北桥向CPU发送CPU_RST#信号(电平信号),通知CPU开始工作。此时,计算机的启动过程正式开始。
  • 4.EC启动其他设备:在计算机启动过程中,EC还可能负责启动和管理其他设备,如冷却风扇、硬盘驱动器等。
  • 5.EC监控电源状态:在整个启动过程中,EC会继续监控电源状态。如果出现任何问题,EC会立即关闭电源以保护硬件。
ECPSU芯片组南桥北桥CPU其他设备发送PWROK信号发送PM_PWRBTN通知电源管理发送PLT_RST发送PWRGOOD发送CPU_RSTCPU启动并开始执行指令启动和管理其他设备监控电源状态ECPSU芯片组南桥北桥CPU其他设备

CPU_RST#信号通过主板上的电路传输到CPU,CPU内部有一个专门的接口用于接收CPU_RST#信号。这个接口通常被称为复位(Reset)引脚或复位线路。当CPU接收到CPU_RST#信号时,这个复位引脚会被激活,从而触发CPU的复位过程,使CPU开始执行预设的启动程序

三、BIOS

现代计算机基本都用UEFI替换了BIOS,但整体流程了原理是一致的,所以依然使用BIOS来说明CPU启动操作系统的初始过程。

BIOS(基本输入输出系统)是一种在计算机启动时运行的软件,它负责初始化和测试计算机硬件,并加载操作系统。以下是关于BIOS的一些详细信息:

  • 1.功能:BIOS的主要功能是在计算机启动时初始化和测试系统硬件(如CPU、内存、硬盘驱动器等),并加载操作系统。这个过程通常被称为引导(booting)或启动。
  • 2.ROM存储位置:BIOS通常存储在主板上的一个ROM(只读存储器,BIOS程序占64K大小)芯片中。这个ROM芯片通常被称为BIOS ROM。
  • 3.POST:在计算机启动时,BIOS会首先执行一个名为电源自检(Power-On Self Test,POST)的过程。POST会检查和测试计算机的硬件,确保所有硬件都正常工作。
  • 4.启动顺序:BIOS会根据预设的启动顺序来查找启动设备。这可能是硬盘驱动器、光驱、USB驱动器或者网络。一旦找到启动设备,BIOS就会加载设备上的启动扇区到内存,并跳转到那个地址来执行操作系统的加载程序。
  • 5.设置:BIOS还提供了一个设置界面,通常被称为BIOS设置或者CMOS设置。在这个界面中,用户可以更改各种系统设置,如启动顺序、系统时间和日期、硬件参数等。

2、CPU加载BIOS

以32位CPU为例,接收到CPU_RST#信号后,会执行以下步骤来加载BIOS:

  • CPU会将指令指针寄存器(IP)设置为0xFFFFFFF0,这是CPU保留的最高的64KB的地址空间给BIOS使用的起始地址。(IP寄存器存储了CPU要执行的下一条指令的地址)
  • CPU通过地址总线将0xFFFFFFF0发送给ROM。ROM会根据地址总线上的地址,将对应的数据通过数据总线发送回CPU。CPU会将数据总线上的数据读入指令寄存器(IR),然后解码并执行。(IR寄存器存储了CPU当前要执行的指令的内容)
  • 一般情况下,ROM中的0xFFFFFFF0处的数据是一条跳转指令,它会将IP寄存器的值修改为0xF0000,这是BIOS的实际入口地址。这样,CPU就可以跳转到0xF0000处,开始执行BIOS的代码(在0xF00000xFFFFF之间,大小64K)。
  • BIOS的代码会对硬件进行检测和初始化,然后加载操作系统的引导程序(Boot Loader),最后将控制权交给操作系统。
CPUROMBIOS将0xFFFFFFF0发送给ROM将0xFFFFFFF0处的数据(跳转指令)发送给CPU将跳转指令读入IR,解码并执行,将IP设置为0xF0000将0xF0000发送给ROM将0xF0000处的数据(BIOS代码)发送给CPU将BIOS代码读入IR,解码并执行执行BIOS代码,(检测硬件,然后加载Boot Loader)CPUROMBIOS

扩展(可跳过)

1、为什么32位的CPU,在执行BIOS第一条指令时,要将值修改成了0xF0000

  • 早期的IBM PC使用的是16位的CPU,它的地址线有20位,可以寻址1MB的地址空间,即从0x000000xFFFFF。其中,最高的64KB的地址空间,即从0xF00000xFFFFF,是给ROM使用的,用于存储BIOS的代码。
  • 16位的CPU启动时,它会将IP寄存器的值设置为0xFFF0,然后从ROM中的0xFFF0处开始读取BIOS的入口地址(一条跳转指令),然后跳转到0xF0000处执行BIOS的代码。
  • 后来,CPU的地址线增加到32位,可以寻址4GB的地址空间,即从0x000000000xFFFFFFFF。但是,为了保持和早期的IBM PC的兼容性,CPU仍然保留了最高的64KB的地址空间给BIOS使用,也就是从0xFFFFFFF00xFFFFFFFF
  • 当32位的CPU启动时,它会将IP寄存器的值设置为0xFFFFFFF0,然后从ROM中的0xFFFFFFF0处开始读取BIOS的入口地址,然后跳转到0xF0000处执行BIOS的代码。这样,32位的CPU就可以和16位的CPU使用相同的BIOS代码,而不需要修改。

因此,32位的CPU,在执行BIOS第一条指令时,将值修改成了0xF0000,是为了和16位的CPU保持一致,实现兼容性。

2、64位CPU的加载过程

64位CPU的启动过程和32位CPU的启动过程基本相同,只是有以下几点不同:

  • 64位CPU的地址线有64位,可以寻址更大的地址空间,从0x00000000000000000xFFFFFFFFFFFFFFFF
  • 64位CPU的数据总线也有64位,可以一次传输更多的数据,提高了效率。
  • 64位CPU的指令指针寄存器(IP)指令寄存器(IR)也有64位,可以存储和执行更长的指令,增强了功能。
  • 64位CPU在启动时,会先进入兼容模式,即模拟32位CPU的工作方式,以保持和旧的BIOS的兼容性。在兼容模式下,CPU的地址线只使用32位,地址总线上的地址也只有32位,即从0x000000000xFFFFFFFF。因此,CPU仍然会从0xFFFFFFF0开始读取BIOS的入口地址,然后跳转到0xF0000处执行BIOS的代码。
  • BIOS的代码会检测CPU的类型,如果发现是64位CPU,就会切换到长模式,即64位CPU的正常工作方式。在长模式下,CPU的地址线使用64位,地址总线上的地址也有64位,即从0x00000000000000000xFFFFFFFFFFFFFFFF。这样,CPU就可以寻址更大的地址空间,加载更大的操作系统。

四、Boot Loader

  • Boot Loader是一种程序,存储在硬盘的特定区域,用于加载操作系统。它的作用是在BIOS完成硬件的检测和初始化后,从硬盘或其他设备中读取操作系统的核心文件,将其加载到内存中,然后将控制权交给操作系统,使其开始运行。
  • Boot Loader的功能是实现CPU实模式保护模式的切换,以及从硬盘到内存的数据传输。实模式是一种最简单的内存管理模式,它只能寻址1MB的地址空间,而且没有内存保护机制。保护模式是一种高级的内存管理模式,它可以寻址4GB(32位)的地址空间,而且有内存保护机制。操作系统一般都是在保护模式下运行的,因此,Boot Loader需要将CPU实模式切换到保护模式,才能加载操作系统。
  • Boot Loader原理是利用硬盘的分区表文件系统的信息,以及操作系统的核心文件,实现从实模式保护模式的切换,以及从硬盘内存的数据传输。

硬盘是一种非易失性的存储设备,它可以长期保存数据,但是它的速度较慢,而且不能直接被CPU执行内存是一种易失性的存储设备,它可以短期保存数据,但是它的速度较快,而且可以直接被CPU执行。操作系统需要在内存中运行,因此,Boot Loader需要将硬盘中的操作系统的核心文件读取到内存中,才能启动操作系统。

Boot Loader的类型有很多,不同的操作系统和硬件平台可能使用不同的Boot Loader。常见的Boot Loader有以下几种:

  • GRUB:全称为GNU GRand Unified Bootloader,是一种开源的,多操作系统的,可配置的Boot Loader,支持Linux,Windows,FreeBSD等多种操作系统,以及多种硬件平台,如x86,x86_64,ARM等。GRUB的特点是可以在启动时提供一个菜单,让用户选择要启动的操作系统,也可以在菜单中修改启动参数,或者进入命令行模式,执行一些高级的操作。
  • LILO:全称为LInux LOader,是一种早期的,专用于Linux的Boot Loader,支持Linux和DOS等操作系统,以及x86硬件平台。LILO的特点是简单,稳定,但是不够灵活,不能在启动时修改启动参数,也不能支持多种文件系统,如FAT32,NTFS等。
  • NTLDR:全称为NT Loader,是一种专用于Windows NT系列的Boot Loader,支持Windows NT,2000,XP,Server 2003等操作系统,以及x86硬件平台。NTLDR的特点是可以在启动时提供一个菜单,让用户选择要启动的操作系统,也可以在菜单中修改启动参数,或者进入恢复控制台,执行一些修复的操作。
  • BOOTMGR:全称为Boot Manager,是一种专用于Windows Vista及以后的Boot Loader,支持Windows Vista,7,8,10,Server 2008等操作系统,以及x86,x86_64,ARM等硬件平台。BOOTMGR的特点是可以在启动时提供一个菜单,让用户选择要启动的操作系统,也可以在菜单中修改启动参数,或者进入高级启动选项,执行一些高级的操作。

3、BIOS通过Boot Loader加载OS

  • BIOS在完成硬件的检测和初始化后,会读取CMOS中的设置,确定要从哪个设备启动,比如硬盘,光盘,U盘等。(CMOS是一种可读写的存储器,用于保存BIOS的配置信息)
  • BIOS会根据CMOS中的设置,选择一个启动设备(通常是硬盘),通过INT 13h中断调用来访问硬盘,然后读取该设备的第一个扇区,也就是主引导记录(Master Boot Record MBR)。MBR是一个512字节的数据块,包含了Boot Loader的一部分代码,以及硬盘的分区表。
  • BIOS会将MBR中的Boot Loader的代码复制到内存的0x7C00处,然后跳转到该地址,执行Boot Loader的代码。MBR中除了启动代码外,还包含一个分区表(Partition Table),它记录了硬盘上的分区信息,包括每个分区的起始扇区、大小、类型和状态(是否为活动分区)。
  • MBR中的启动代码会根据分区表来找到活动分区(Active Partition),也就是要启动的操作系统所在的分区,然后从该分区的第一个扇区中读取卷引导扇区(Volume Boot Record VBR)。VBR也是一个512字节的扇区,它包含了一个卷引导记录(Volume Boot Record)和一个文件系统信息(File System Info)。
  • MBR中的启动代码会将读取到的VBR复制到内存地址0x7C00处,覆盖掉原来的MBR,然后跳转到该地址执行VBR中的启动代码。VBR中的启动代码会根据文件系统信息来找到操作系统内核文件(OS Kernel File),这是一个可执行文件,它包含了操作系统的核心功能和服务。
  • VBR中的启动代码会将读取到的OS Kernel File复制到内存中的一个合适的地址,然后跳转到该地址执行OS Kernel File中的启动代码。这时,操作系统就开始运行了,它会接管计算机的控制权,初始化各种设备驱动和系统服务,然后加载用户界面和应用程序,等待用户的输入。
BIOSCMOSHard DiskMemory读取配置信息INT 13h中断读取第一个扇区MBR加载MBR到0x7C00Jump to 0x7C00INT 13h读取活动分区的第一个扇区VBR加载VBR到0x7C00Jump to 0x7C00INT 13h读取OS Kernel FileOS Kernel File加载OS Kernel File到内存Jump to OS Kernel AddressBIOSCMOSHard DiskMemory

至此计算机启动就完成了,后续工作就交由操作系统了

主引导记录MBR(Master Boot Record)

MBR是主引导记录(Master Boot Record)的缩写,它是一种存储在硬盘的第一个扇区的数据块,用于存储Boot Loader的一部分代码,以及硬盘的分区表。MBR的作用是在BIOS完成硬件的检测和初始化后,从硬盘中读取Boot Loader的代码,将其加载到内存中,然后执行Boot Loader的代码,从而启动操作系统。

MBR的结构一般由以下几个部分组成:

  • 引导代码区:这是MBR的主要部分,它存储了Boot Loader的一部分代码,用于从硬盘的分区表中找到操作系统所在的分区,然后读取该分区的第一个扇区,也就是卷引导记录(VBR)。VBR是一种存储在硬盘分区的第一个扇区的数据块,用于存储Boot Loader的另一部分代码,以及文件系统的信息。引导代码区的大小和内容取决于具体的Boot Loader,一般占用MBR的大部分空间,约440字节左右。
  • 磁盘签名:这是MBR的一个可选部分,它存储了一个32位的数据,用于标识硬盘的唯一性,以便于操作系统和应用程序识别和管理硬盘。磁盘签名的大小和内容是可变的,一般占用MBR的4个字节。
  • 保留字:这是MBR的一个固定部分,它存储了一个16位的数据,用于填充MBR的空白部分,以便于MBR的对齐和校验。保留字的大小和内容是固定的,其值为0x0000,占用MBR的2个字节。
  • 分区表:这是MBR的一个重要部分,它存储了硬盘的分区信息,如分区的类型,大小,位置,状态,引导标志等。分区表是一个记录了硬盘分区信息的数据结构,用于告诉BIOS和操作系统硬盘的结构和位置。分区表的大小和内容取决于具体的硬盘,一般占用MBR的最后64个字节,包含4个分区表项,每个分区表项占用16个字节。
  • 结束标志:这是MBR的一个固定部分,它存储了一个16位的数据,用于标识MBR的结束,其值为0x55AA。结束标志的作用是告诉BIOS和Boot Loader这是一个有效的MBR,可以执行其中的引导代码。结束标志的大小和内容是固定的,占用MBR的最后两个字节。

卷引导记录VBR(Volume Boot Record)

VBR是卷引导记录(Volume Boot Record)的缩写,它是一种存储在硬盘分区的第一个扇区的数据块,用于存储Boot Loader的一部分代码,以及文件系统的信息。VBR的作用是在MBR中的Boot Loader将CPU从实模式切换到保护模式后,从硬盘分区中读取操作系统的核心文件,将其加载到内存中,然后将控制权交给操作系统,使其开始运行。

VBR的结构一般由以下几个部分组成:

  • 引导代码区:这是VBR的主要部分,它存储了Boot Loader的一部分代码,用于从文件系统中读取操作系统的核心文件,将其加载到内存中,然后跳转到该地址,执行操作系统的代码。引导代码区的大小和内容取决于具体的Boot Loader和文件系统,一般占用VBR的大部分空间,约400字节左右。
  • BPB(BIOS Parameter Block):这是VBR的一个重要部分,它存储了文件系统的基本信息,如扇区大小,簇大小,保留扇区数,FAT表数,根目录项数,总扇区数,卷标,文件系统类型等。BPB的作用是告诉Boot Loader和操作系统文件系统的结构和位置,以便正确地读取文件和目录。BPB的大小和内容取决于具体的文件系统,一般占用VBR的前面部分,约60字节左右。
  • 扩展引导代码区:这是VBR的一个可选部分,它存储了一些额外的引导代码,用于实现一些高级的功能,如错误处理,菜单选择,密码验证等。扩展引导代码区的大小和内容取决于具体的Boot Loader和文件系统,一般占用VBR的后面部分,约50字节左右。
  • 结束标志:这是VBR的一个固定部分,它存储了一个16位的数据,用于标识VBR的结束,其值为0x55AA。结束标志的作用是告诉BIOS和Boot Loader这是一个有效的VBR,可以执行其中的引导代码。结束标志的大小和内容是固定的,占用VBR的最后两个字节。

INT 13h

INT 13h是一个BIOS提供的中断服务,它可以让Boot Loader访问硬盘的任意扇区,而不需要知道硬盘的具体类型和参数。通过INT 13h,Boot Loader可以根据文件系统信息来定位OS Kernel File的位置,然后读取它到内存中。

INT 13h是一个很方便的服务,它可以屏蔽硬盘的底层细节,让Boot Loader只需要关注如何加载操作系统。如果没有INT 13h,Boot Loader就需要自己实现硬盘的驱动程序,这会增加Boot Loader的复杂度和大小,而Boot Loader的空间是非常有限的,只有512字节。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK