1. BIOS

当你按下电源键的那一刻起,计算机的的启动就开始了。Intel x86 系列的 CPU 可以分别在 16 位 实模式(Real mode) 和 32 位 保护模式(Protected mode) 下运行。为了向后兼容,Intel 将所有 x86 系列的 CPU(包括最新型号的 CPU)的硬件都设计为加电即进入 16 位实模式运行

实模式的特征是 CPU 的寻址空间只有 2 ^ 20 = 1048576 Bytes = 1 MB,且硬件不支持分布机制和实时多任务

同时,Intel CPU 还会借助于 复位向量(reset vector),让 CPU 在加电瞬间强行将 CS 的值设置为 0xFFFF,将 IP 的值设置为 0x0000,如此一来 CS:IP 就指向了 0xFFFF0(CS * 16 + IP) 这个内存地址,而 BIOS(Basic Input/Output System,基本输入/输出系统) 程序的入口地址恰恰就是 0xFFFF0!也就是说,BIOS 程序的第一条指令就设计在这个位置上

BIOS 与 CMOS 之间的联系与区别:

BIOS 是一段程序,存储在 电可擦除可编程只读存储器(EEPROM) 中,EEPROM 是闪存芯片,在特定的条件下是可写的,因此我们可以更新升级 BIOS 程序,断电后内容不会丢失。但在谈到主板上存储 BIOS 的闪存芯片时,业内人士把它看作 ROM(Read Only Memory,只读存储器)

用户可以修改 BIOS 程序的相关设置项,例如设置硬件时间、IPMI地址、启动顺序等,而设置结果就保存在 CMOS 中

CMOS 是 RAM(Random Access Memory,随机存储器),RAM 的特点是加电状态下可任意读、写,断电后内容丢失(比如内存),但 CMOS 由主板上的充电电池供电,即使计算机断电,里面的内容也不会丢失。给 CMOS 放电,即取下主板上的电池再插回去,就可以清空 CMOS 中保存的内容

1.1 POST

BIOS 程序的代码量并不大,却非常精深。首先它会检查计算机硬件能否满足基本的运行条件,这个过程叫作 POST(Power-On Self-Test,加电自检),它主要针对计算机硬件如内存、硬盘、RAID卡、显卡等进行检测, 例如内存不能正常工作的话,整个启动过程将终止。加电自检的检查速度极快,甚至感受不到它的存在

1.2 Boot Sequence

加电自检通过后,BIOS 会依次初始化其它硬件设备,比如显卡、SAS3 HBA卡、3108 RAID卡等。然后,BIOS 会按照类似下图中的 启动顺序(Boot Sequence),逐一地去查找这些硬盘、光盘、LiveCD、U盘、网络 PXE 引导等设备(底层原理是通过 INI 13 中断),并判断是否为 可引导设备(bootable device)。例如你插入一张光盘,但是它并不是可启动的光盘,就没法引导启动,BIOS 就会跳过它继续查找下一个引导设备,如果最后都没有找到,则会在显示器上显示 Operating System not found

各厂商生产的计算机进入 BIOS 设置界面的按键不同,一般为 F2 / Del 等

2. MBR

如何判断当前设备是 可引导设备 呢?BIOS 会读取设备的第一个扇区(0 磁头 0 柱面 0 扇区)到内存中,默认每个扇区 sector 的大小为 512 Bytes,如果这 512 字节的最后两个字节是 0x55AA,表明该扇区是 引导扇区(boot sector),则 BIOS 认为该设备可以用于启动(也可能后续无法从该设备启动),并将控制权移交给它;否则,继续查找下一个设备

3. Bootloader (GRUB legacy)

常见的 引导加载程序(bootloader):

古老的 LILO(LInux LOader),现在几乎没有发行版使用了

CentOS 5/6: GRUB(GRand Uniform Bootloader) 0.x 版本,也叫 GRUB legacy

CentOS 7: GRUB 2 1.x 之后的版本,目前最新为 2.02

Linux 发行版ISO 或 LiveCD: 一般使用 isolinux

PXE 网卡启动: 一般使用 syslinux

Windows: ntloader

本文以 GRUB legacy 为例讲解

3.1 GRUB 三段式引导

由于 引导加载程序 很大,而上图中 MBR 中最前面的引导代码只占 440 字节,这太小了,所以它只包含引导加载程序的第一阶段代码(stage1)

第二阶段代码(stage2)一般存放在硬盘的 /boot/grub 目录下(可能是单独的硬盘分区),假设该分区使用 ext4 文件系统格式,那么 GRUB 的第一阶段代码想读取第二阶段代码的话,就必须先加载该文件系统的驱动,446 字节空间根本放不下,所以就出现了 stage1_5,它位于 MBR 那个扇区与第一个硬盘分区之间(历史原因,第一个分区是从 63 号扇区开始,即 MBR 和第一个分区之间有 62 sectors = 31744 Bytes = 31 KB 空闲的空间)

由于 stage1_5 可以容纳的代码量较大,因此它有足够的空间来包含一些常见的 文件系统驱动 程序,例如标准的 e2fs_stage1_5、xfs_stage1_5、iso9660_stage1_5等。回顾 Linux 安装时,最后一步除了把 GRUB 的 stage1 安装到 MBR 中以外,还会根据 /boot 分区的文件系统类型,比如是 ext4,则把 e2fs_stage1_5 放到 MBR 后面的 31 KB 空间内

所以当 stage1 定位和加载了 stage1_5 之后,就能读取到引导加载程序的 stage2,从而在屏幕上显示 引导菜单 等信息,如下所示:

阅读全文

引导linux为什么要用实模式,Linux引导过程与故障排除|第1章:Linux启动流程详解...相关推荐

  1. 【正点原子Linux连载】第三十二章 U-Boot启动流程详解 -摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

    1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址: ...

  2. Linux启动流程详解

    Linux组成 Linux: kernel+rootfs     kernel: 进程管理.内存管理.网络管理.驱动程序.文件系统.安全功能     rootfs:程序和glibc     库:函数集 ...

  3. 嵌入式linux的运行过程,嵌入式linux的启动流程--详解

    开门见山: 1.嵌入式linux启动第一步----Boot Loader Boot Loader在这里我就不细说了,详细分析起来的话有很多内容,网上也有很多讲解很详细的文章.这段小程序中我们可以初始化 ...

  4. Linux服务器启动流程详解

    启动第一步 - 加载BIOS 启动第二部 - 读取MBR 启动第三部 - Boot Loader 启动第四部 - 加载内核 启动第五部 -用户层init依据inittab文件来设定运行等级 重新引导系 ...

  5. linux upstart脚本,Linux upstart启动方式详解

    Ubuntu从6.10开始逐步用Upstart()代替原来的SysVinit进行服务进程的管理.RHEL(CentOS)也都从版本6开始转用Upstart代替以往的init.d/rcX.d的线性启动方 ...

  6. linux内核运行在实模式还是,Linux内核分析方法谈

    Linux的最大的好处之一就是它的源码公开.同时,公开的核心源码也吸引着无数的电脑爱好者和程序员:他们把解读和分析Linux的核心源码作为自己的最大兴趣,把修改Linux源码和改造Linux系统作为自 ...

  7. Linux系统引导过程及故障排除

    Linux系统引导过程及故障排除 一.Linux操作系统引导过程 二.系统初始化进程 三.排除启动类故障 (一)修复MBR扇区故障 (二)修复GRUB引导故障 (四)遗忘root用户的密码 一.Lin ...

  8. linux开机启动服务详解

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

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

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

最新文章

  1. 前端大神用React刻了一个Windows XP
  2. Docker学习总结(6)——通过 Docker 化一个博客网站来开启我们的 Docker 之旅
  3. 思考--为何早晨型人更容易成功
  4. 听说92.8%的人答不对这道Python题,我不信,后来我信了!真有趣
  5. HDSF主要节点解说(二)工作原理
  6. thinkphp5与thinkphp3.X对比
  7. c++笔试必考内容:const使用详解
  8. flash实用工具类+开源包收藏
  9. 用原生JS写PHP里的Ajax
  10. word加载项打包发布注意事项总结
  11. IN改写关联注意事项!
  12. 两个DIV高度自适应方法(左右两个DIV高度一样)
  13. 大厂Java核心面试题出炉:java视频教程马士兵
  14. 盘点10种局域网联机游戏
  15. WZ安卓面试宝典App
  16. 要点初见:开源AI绘画工具Stable Diffusion代码分析(文本转图像)、论文介绍(下)
  17. 条件格式实现ABC分析
  18. java如何设置控制台打印的字体颜色、背景、字体样式(idea设置打印字体样式)工具类 - 附插件方式
  19. STATA闪退,CLDS数据无法转码
  20. LTE Cognitive Femtocell scenario

热门文章

  1. JQuery如何与数据库交互
  2. 4-asa-url-filter
  3. 如何使用Tree-shaking减少代码构建体积
  4. frp + nginx 配置多人共用的http 内网穿透服务
  5. Oracle性能调优之--Buffer cache 的调整与优化
  6. 如何在Mac上安装Node.js和NPM
  7. LSA类型讲解——LSA-1【1类LSA——Router LSA】详解
  8. 牛逼哄哄的 MQ 到底有啥用?
  9. Docker 安装MongoDB 以及 相关配置文件、数据文件映射
  10. 【java】List 根据实体属性值搜索