计算机的开机启动过程

(1) 启动过程总览

(二)详细说明

1、CPU 供电

按下主机的电源键后,计算机开始启动,为主板部分芯片和CPU进行供电。主板上电后开始初始化其固件。固件是一些固化在芯片组上的程序,它会试图去启动 CPU。如果启动失败(例如 CPU 坏了或没插好),计算机就会死机并给出错误提示(如某些版本的主板固件会发出蜂鸣警告)。这种状态称为 “zoombie-with-fans”。

如果前一个阶段未出错,就开始加电工作,在多 CPU 或多核 CPU 情况下,某一个 CPU 会被随机选取作为启动 CPU(bootstrap processor,BSP)运行 BIOS 内部的程序。其余的 CPU(application processor,AP)保持停机直到操作系统内核显式地使用它们。

2000 年以前的计算机主板上均使用 BIOS,如今绝大多数计算机采用的是 EFI(Mac 用的就是 EFI)或 UEFI。BIOS 正在逐步被淘汰。基于 EFI、UEFI 的开机过程与传统的BIOS不尽相同,本文将以传统的 BIOS,Intel CPU 为例介绍开机过程。

此时 CPU 工作模式为实模式,该模式下地址总线是 20 位,寻址范围是 0x00000~0xFFFFF 的 1M 范围。这也就解释了为什么 BIOS 的容量只有 1MB。

Intel CPU 用三种运行模式: 实模式、32 位保护模式、64 位保护模式。实模式: Intel 8086 的寻址方案,为了商业连续性,兼容了这古老的方案;保护模式: 采用了虚实地址转换方案。

BIOS 启动之初,内存是空的。此时 CPU 处于实模式,内存的地址映射均为硬连接的设备。内存映射图如下图所示:

2、重置向量

CPU 启动后其大多数寄存器会被初始化为预定的值,包括指令寄存器(Instruction register,IR),它保存着 CPU 将要执行指令的内存地址。此时 CPU 会有一个特殊行为,其会对 IR 的初始值加上一个基址寄存器的值,生成一个 32 位的地址 0xFFFFFFF0。之所以称为特殊行为,是因为实模式下 CPU 只能寻址 1MB 地址空间,而这个 32 位地址已经大于 1MB 的内存限制。因此,0xFFFFFFF0 也被称为重置向量(reset vector),参考上图 0xFFFFFFF0 处的标识。

于是,CPU 开始执行 0xFFFFFFF0 地址处的指令,该地址处是一条 JUMP 指令,这条指令清空了基址寄存器的值,并让指令跳回到 BIOS 开始处(物理地址为 0xF0000,参考上图 0xF0000 处的标识)以执行 BIOS。

BIOS 内部可以分成两个区块: code block(普通程序)、boot block(引导程序)。上电后,boot block 会先被执行,它会检查 code block 的代码是否正确,如果正确,就会转到 code block 继续执行下去。

3、BIOS 初始化

0xF0000 地址实际上是 BIOS 中的 boot block 的开始处。在这个阶段,会初始化部分硬件。系统的 CPU、USB 只有部分被初始化。

4、BIOS POST(加电自检)

初始化完成后,CPU 跳转到 0xA0000 地址处(参考上图 640KB 处)进行 BIOS 加电自检(power on self test, POST)。这个过程会检查计算机的各项组件,如 CPU、显卡、内存、鼠标、键盘等。如果找不到内存或者键盘都有可能让BIOS停止工作并且打印一些相关的错误信息,如果找不到显卡 BIOS 会发出蜂鸣警告

当 CPU 执行到 0xC0000 地址处(参考上图 768KB 处),开始寻找其他设备的 ROM,如果找到任何其他设备的 BIOS,它们也会被执行。

下一步,显卡就会显示 BIOS 界面,并进行更深入的检查。

5、BIOS 记录系统设定值

检查完成后,BIOS 会根据自己的"系统资源表",对系统进行进一步确认,从而确定计算机配有哪些资源或设备。例如 BIOS 支持随插即用,它会检测并配置随插即用设备。

然后 BIOS 会遵循高级配置电源接口(Advanced Configuration Power Interface,ACPI)在内存中设置好一系列的数据来描述硬件信息,以便被操作系统内核利用。

7、MBR

到这一步,BIOS 开始尝试加载操作系统。它会从硬盘,光驱,软驱,网络等几个地方依次寻找操作系统(用户可以在 BIOS 设定中修改查找的优先级)。如果找不到操作系统,BIOS 会停机并给出错误信息。

假设在硬盘上找到了操作系统,它会首先读取硬盘上的大小为 512 Bytes 的 0号扇区,这个扇区被称为 主引导记录(master boot record,MBR),其包含三部分:

a) 引导程序(Boot Loader)

b) 硬盘分区表(Partition Table)

c) 结束标志字

BIOS 读完磁盘上的 MBR 之后会把它拷贝到内存 0x7C00 地址处,然后 CPU 跳转到该内存地址执行 MBR 里的指令。事实上,被复制到物理内存的内容就是 Boot Loader。常见的 Boot Loader 有 grub、lilo、spfdisk。

8、硬盘启动

这时,计算机的控制权就要转交给硬盘的某个分区了,这里又分成三种情况。

情况A:卷引导记录

卷引导记录(Volume boot record,缩写为VBR)。

"卷引导记录"的主要作用是,告诉计算机,操作系统在这个分区里的位置。然后,计算机就会加载操作系统了。

情况B:扩展分区和逻辑分区

随着硬盘越来越大,四个主分区已经不够了,需要更多的分区。但是,分区表只有四项,因此规定有且仅有一个区可以被定义成"扩展分区"(Extended partition)。

所谓"扩展分区",就是指这个区里面又分成多个区。这种分区里面的分区,就叫做"逻辑分区"(logical partition)。

计算机先读取扩展分区的第一个扇区,叫做"扩展引导记录"(Extended boot record,缩写为EBR)。它里面也包含一张64字节的分区表,但是最多只有两项(也就是两个逻辑分区)。

计算机接着读取第二个逻辑分区的第一个扇区,再从里面的分区表中找到第三个逻辑分区的位置,以此类推,直到某个逻辑分区的分区表只包含它自身为止(即只有一个分区项)。因此,扩展分区可以包含无数个逻辑分区。

但是,似乎很少通过这种方式启动操作系统。如果操作系统确实安装在扩展分区,一般采用下一种方式启动。

情况C:启动管理器

在这种情况下,计算机读取"主引导记录"前面446字节的机器码之后,不再把控制权转交给某一个分区,而是运行事先安装的"启动管理器"(boot loader),由用户选择启动哪一个操作系统。

8、操作系统

控制权转交给操作系统后,操作系统的内核首先被载入内存。

linux

以Linux系统为例,先载入/boot目录下面的kernel。内核加载成功后,第一个运行的程序是/sbin/init。它根据配置文件(Debian系统是/etc/initab)产生init进程。这是Linux启动后的第一个进程,pid进程编号为1,其他进程都是它的后代。

然后,init线程加载系统的各个模块,比如窗口程序和网络程序,直至执行/bin/login程序,跳出登录界面,等待用户输入用户名和密码。

至此,全部启动过程完成。

Windows

以Windows7 为例,当控制权转交到操作系统后,计算机会执行如下操作:

  1. 加载内核程序(Ntoskrnl.exe)、硬件抽象层(hal.dl)、注册表 SYSTEM 项(system32\configlsystem)、设备驱动,然后控制权交给 Ntoskrnl.exe

  2. Ntoskmnl 初始化执行体子系统,并初抽化引导的和系统的设备驱动启动程序,为原生应用程序《如SMSS 等)初始化运行环境,控制权交给 SMSS.exe

  3. SMSS 初始化注册表,创建系统环境变量,加载 Win32 子系统(Win32k.sys),启动子系统进程(CSRSS、Wininlt、Winlogon),控制权交给 Wininit.exe 和Winlogon.exe

  4. Wininit 启动服务控制管理器(SCM),本地安全子系统(LSASS》,本地会话管理(LSM)

  5. Winlogon 加乾登录界面程序(Logonur),显示交互式登录对话框。等待用户登录后,根据注册表配置启动 Userinit.exe 和 Explorer.exe

  6. Userinit 启动用户所有自启动进程,津立网络连接,启动生效的组策略

  7. Explorer 提供交互式图形界面,包括桌面和文件管理。

至此计算机启动就完成啦

计算机开机启动过程详解相关推荐

  1. 计算机开机启动流程详解

    一.BIOS 1.BIOS是什么 BIOS:基本输入输出系统(Basic Input Output System),它是一组固化到计算机内主板上一个ROM(Read-Only Memory)只读存储器 ...

  2. linux系统启动的第一个进程是,CentOS6开机启动过程详解

    CentOS 6 开机流程--Linux由kernel和rootfs组成.kernel负责进程管理.内存管理.网络管理.驱动程序.文件系统.安全等;rootfs由程序和glibc组成,完善操作系统的功 ...

  3. 家用计算机启动过程 装载主引导记录,计算机启动过程详解

    综述: 计算机启动时经过了哪些过程: 计算机接通电源后,第一步要进行加电自检,也就是POST(Power On Self Test),检查RAM.驱动器等:第二步BIOS会读取活动分区主引导记录的启动 ...

  4. Linux开启动过程详解

    Linux开启动过程详解 Linux启动过程 前言: Linux是一种自由和开放源代码的类UNIX操作系统.该操作系统的内核由林纳斯·托瓦兹在1991年10月5日首次发布.在加上用户空间的应用程序之后 ...

  5. linux系统设置服务开机启动3种方法,Linux开机启动程序详解

    linux系统设置服务开机启动 方法1:.利用ntsysv伪图形进行设置,利用root登陆 终端命令下输入ntsysv 回车:如下图 方法2:利用命令行chkconfig命令进行设置 简要说明一下ch ...

  6. centos7 启动流程图_Linux启动过程详解

    Linux启动过程详解 作者:江远航 一.启动流程图如下 图1 Linux启动流程图 BIOS ---> MBR ---> Kernel---> Init 二.Linux启动顺序 一 ...

  7. linux efi 启动原理,Linux(RHEL6)启动过程详解

    Linux(RHEL6)启动过程详解 Linux(红帽RHEL6)启动过程详解: RHEL的一个重要和强大的方面是它是开源的,并且系统的启动过程是用户可配置的.用户可以自由的配置启动过程的许多方面,包 ...

  8. linux开机启动服务详解

    http://blog.163.com/sjt_linux/blog/static/19931031920126295452884/ linux开机启动服务详解(转) 2012-07-29 17:45 ...

  9. Delta3d框架学习--程序启动过程详解

    一个Delta3d程序启动过程详解 一.初始化一个dtGame::GameApplication的实例,dtGame::GameApplication* app = new dtGame::GameA ...

最新文章

  1. 【Stage3D学习笔记续】山寨Starling(八):核心优化(批处理)的实现
  2. px4驱动linux,px4开发指南——linux下qgroundcontrol地面站安装
  3. Set_uid set_gid stick_bit 软链接 硬链接
  4. git与eclipse集成之代码冲突与解决
  5. Management of your data
  6. Map 四种获取 key 和 value 值的方法,以及对 map 中的元素排序
  7. oracle11g linux 日期格式设置
  8. C语言丨线性表(三):双链表
  9. 编程零基础应当如何开始学习 Python?
  10. Delphi调用外部程序详解
  11. python导入datetime模块_Python时间模块datetime用法
  12. phpstudy 2016 版本的安装缺少VC9的运行库如何下载,解决!
  13. java编写蠕虫病毒_网络蠕虫病毒代码分析
  14. !doctype html public 广告飘窗不能用了,页面广告飘窗
  15. 概率统计Python计算:双正态总体均值差的单侧区间估计
  16. Linux-CentOS 安装yasm
  17. VIO中的角速度和四元数
  18. android混淆那些坑
  19. IT技术外包公司值得去吗?
  20. 云原生监控报警可视化

热门文章

  1. 【一本通】1064:奥运奖牌计数
  2. 技术所带来的生产率提升,将会大大提高资本要素回报率
  3. 【计息日期】国债逆回购类产品的起息日期和兑付日期,如何用python优雅实现?~
  4. 江苏移动CM101s-MV100-EMMC- M8233_强刷固件包
  5. 电路图中R1,D1有什么作用 ?
  6. python如何给一个xls文件修改数据_Python-修改xls文件示例
  7. python输入生日输出星座_python输入日期输出星座?
  8. python控制程序_Python 流程控制
  9. 可以用于毕设参考,请勿过度借鉴
  10. 在国内市场,外汇到底能不能做?外汇合法吗?