按下开机键时候电脑都发生了什么
第一阶段:通电与硬件自检 (Power-On & POST)
- 通电 (Power On)
- 你按下电源按钮,电源开始向主板、CPU、内存等所有组件提供稳定、符合规范的直流电。
- 主板上由一个专门的时钟发生器开始产生时钟信号,同步整个系统的工作节奏。没有时钟,数字电路就无法工作。
- CPU复位 (Reset)
- 电源稳定后,主板会向CPU发送一个复位信号。CPU内的所有寄存器会被重置为一个已知的、固定的初始状态。
- 关键寄存器:程序计数器 (PC - Program Counter) 会被设置为一个预定义的硬编码地址。这个地址是CPU设计时决定的,指向BIOS/UEFI固件的起始位置(或者是从一个初始地址跳转到bios)。对于x86架构的CPU,这个地址通常是
0xFFFF0。这意味着CPU第一条指令就从这里开始取指执行。
- 执行固件代码 (BIOS/UEFI)
- CPU开始从PC指向的地址取指、译码、执行。
- 这些指令存储在主板上的一块ROM芯片中,这就是BIOS或更现代的UEFI。它的特点是非易失性,断电后内容不丢失,并且CPU在初始化早期就能直接读取。
- 固件代码开始执行,第一个重要任务是POST (Power-On Self-Test)。
- **BIOS(基本输入输出系统)**是固化在主板 ROM 芯片中的程序,它在开机时最先运行。CMOS(互补金属氧化物半导体)是存储 BIOS 设置信息的芯片,靠主板电池在断电后维持数据,BIOS 启动时会读取 CMOS 中的设置来配置计算机。
- 功能
- 硬件检测与初始化:包括开机自检硬件是否正常,为硬件分配资源并设置初始参数。
- 引导操作系统:按照设定的启动顺序引导操作系统,找到引导程序后移交控制权。
- ROM 与 RAM
- ROM 芯片:只读的存储器。
- RAM 芯片:随机存储器,可读可写,停电会丢失数据。
- CMOS:是一个存储参数配置的芯片,BIOS 会读取 CMOS 的参数,了解 CPU 的配置、时间配置以及启动顺序的配置。
- 功能
- 加电自检 (POST)
- 目的:检测关键硬件组件是否正常工作,为后续启动做准备。
- 过程:
- 检测和初始化CPU、内存:检查CPU功能,计算并检测内存大小和所有内存单元能否正确读写。你听到的“嘀”一声,通常表示内存检测通过。
- 检测和初始化外设:检测显卡、初始化显卡(此时屏幕开始显示),检测硬盘、键盘、鼠标等基本输入输出设备。
- 即插即用设备检测:为其他PCIe等设备分配资源(如中断号、I/O端口地址、DMA通道等)。
第二阶段:引导加载器 (Bootloader)
- 查找引导设备
- POST完成后,固件代码按照预设的启动顺序,去各个存储设备(硬盘、U盘、光驱等)的第一个扇区(512字节,称为主引导记录 MBR)或UEFI分区中的特定文件,寻找引导加载程序。
- 传统BIOS模式:读取硬盘的MBR,并将这512字节的内容加载到内存的
0x7C00这个固定位置。 - 现代UEFI模式:直接从EFI系统分区中加载名为
bootmgfw.efi(Windows) 或grubx64.efi(Linux) 的引导程序文件,无需经过MBR。 - MBR(Master Boot Record)即主引导记录,位于硬盘的首个物理扇区(0 磁道 0 柱面 1 扇区),负责引导操作系统并管理硬盘分区信息,512 字节,存放引导代码和分区表。
- 执行引导加载器
- CPU跳转到内存中引导加载器的位置并开始执行它的指令。
- 引导加载器的核心任务:
- 它非常小,功能有限。它的主要任务是找到并加载操作系统内核。
- 内核通常存储在文件系统中,而简单的MBR引导加载器可能不认识复杂的文件系统。因此,现代引导过程通常是多阶段的:
- 第一阶段(MBR中的)加载一个更强大的第二阶段引导加载器(如GRUB, Windows Boot Manager)。
- 第二阶段引导加载器会读取文件系统,提供一个选择菜单,最终将操作系统内核映像从硬盘加载到内存中。
第三阶段:操作系统初始化
- 内核接管
- 引导加载器将CPU的执行权交给已加载到内存中的操作系统内核。
- 内核开始解压自身(如果是压缩的),并初始化其核心数据结构。
- 初始化硬件和驱动
- 内核会重新检测系统硬件,但这次是以更精细、更可控的方式。
- 它加载并初始化设备驱动程序。驱动程序是操作系统与硬件之间的翻译官,让操作系统能真正控制硬件。
- 启动用户空间和初始化进程
- 内核启动第一个用户空间进程。
- 在Linux中是
init(现在通常是systemd)。 - 在Windows中是
Session Manager Subsystem (smss.exe)。 - 这个进程会读取初始化脚本,启动系统服务(如网络、打印)、登录管理器(如图形化登录界面)。
- 用户登录
- 你看到登录界面,输入用户名和密码。
- 验证成功后,系统为你启动Shell(如Windows的Explorer.exe或Linux的Bash),整个启动过程完成。
总结:计算机组成原理视角的核心要点
| 阶段 | 核心部件 | 行为(计算机组成原理角度) |
|---|---|---|
| 1. 通电 | 电源、时钟发生器 | 提供能量和同步信号,所有电路元件进入初始状态。 |
| 2. 取指 | CPU、ROM | CPU的PC寄存器被硬编码到ROM地址,开始取指-译码-执行周期。 |
| 3. 自检 | 内存、各种IO设备 | CPU执行ROM中的POST代码,通过写入/读出的方式测试内存和外设控制器的寄存器。 |
| 4. 加载 | 硬盘、内存、DMA | CPU或DMA控制器将硬盘第一个扇区的数据传输到内存的特定地址。 |
| 5. 跳转 | CPU | CPU修改PC寄存器,跳转到内存中引导加载器的地址,开始执行其指令。 |
| 6. 移交 | CPU | 引导加载器将更大的内核程序从文件系统加载到内存,并最终跳转到内核入口点,将控制权移交。 |
这个过程完美体现了冯·诺依曼体系结构的“存储程序”概念:CPU从不关心内存里是什么,它只是机械地从PC指向的地址取指令、执行指令。而启动的本质,就是通过一系列精巧的设计(硬编码的PC初始值、固件、引导程序),让CPU最终能执行到我们想要的操作系统程序。