转载
http://www.ruanyifeng.com/blog/2013/02/booting.html
作者:
从打开电源到开始操作,计算机的启动是一个非常复杂的过程。
我一直搞不清楚,这个过程到底是怎么回事,只看见屏幕快速滚动各种提示...... 这几天,我查了一些资料,试图搞懂它。下面就是我整理的笔记。
零、boot的含义
先问一个问题,"启动"用英语怎么说?
回答是boot。可是,boot原来的意思是靴子,"启动"与靴子有什么关系呢? 原来,这里的boot是bootstrap(鞋带)的缩写,它来自一句谚语:
"pull oneself up by one's bootstraps"
字面意思是"拽着鞋带把自己拉起来",这当然是不可能的事情。最早的时候,工程师们用它来比喻,计算机启动是一个很矛盾的过程:必须先运行程序,然后计算机才能启动,但是计算机不启动就无法运行程序!
早期真的是这样,必须想尽各种办法,把一小段程序装进内存,然后计算机才能正常运行。所以,工程师们把这个过程叫做"拉鞋带",久而久之就简称为boot了。
计算机的整个启动过程分成四个阶段。
一、第一阶段:BIOS
上个世纪70年代初,"只读内存"(read-only memory,缩写为ROM)发明,开机程序被刷入ROM芯片,计算机通电后,第一件事就是读取它。
这块芯片里的程序叫做"基本輸出輸入系統"(Basic Input/Output System),简称为。
1.1 硬件自检
BIOS程序首先检查,计算机硬件能否满足运行的基本条件,这叫做"硬件自检"(Power-On Self-Test),缩写为。
如果硬件出现问题,主板会发出不同含义的,启动中止。如果没有问题,屏幕就会显示出CPU、内存、硬盘等信息。
1.2 启动顺序
硬件自检完成后,BIOS把控制权转交给下一阶段的启动程序。
这时,BIOS需要知道,"下一阶段的启动程序"具体存放在哪一个设备。也就是说,BIOS需要有一个外部储存设备的排序,排在前面的设备就是优先转交控制权的设备。这种排序叫做"启动顺序"(Boot Sequence)。
打开BIOS的操作界面,里面有一项就是"设定启动顺序"。
二、第二阶段:主引导记录
BIOS按照"启动顺序",把控制权转交给排在第一位的储存设备。
这时,计算机读取该设备的第一个扇区,也就是读取最前面的512个字节。如果这512个字节的最后两个字节是0x55和0xAA,表明这个设备可以用于启动;如果不是,表明设备不能用于启动,控制权于是被转交给"启动顺序"中的下一个设备。
这最前面的512个字节,就叫做(Master boot record,缩写为MBR)。
2.1 主引导记录的结构
"主引导记录"只有512个字节,放不了太多东西。它的主要作用是,告诉计算机到硬盘的哪一个位置去找操作系统。
主引导记录由三个部分组成:
(1) 第1-446字节:调用操作系统的机器码。
(2) 第447-510字节:分区表(Partition table)。
(3) 第511-512字节:主引导记录签名(0x55和0xAA)。
其中,第二部分"分区表"的作用,是将硬盘分成若干个区。
2.2 分区表
硬盘分区有很多。考虑到每个区可以安装不同的操作系统,"主引导记录"因此必须知道将控制权转交给哪个区。
分区表的长度只有64个字节,里面又分成四项,每项16个字节。所以,一个硬盘最多只能分四个一级分区,又叫做"主分区"。
每个主分区的16个字节,由6个部分组成:
(1) 第1个字节:如果为0x80,就表示该主分区是激活分区,控制权要转交给这个分区。四个主分区里面只能有一个是激活的。
(2) 第2-4个字节:主分区第一个扇区的物理位置(柱面、磁头、扇区号等等)。
(3) 第5个字节:。
(4) 第6-8个字节:主分区最后一个扇区的物理位置。
(5) 第9-12字节:该主分区第一个扇区的逻辑地址。
(6) 第13-16字节:主分区的扇区总数。
最后的四个字节("主分区的扇区总数"),决定了这个主分区的长度。也就是说,一个主分区的扇区总数最多不超过2的32次方。
如果每个扇区为512个字节,就意味着单个分区最大不超过2TB。再考虑到扇区的逻辑地址也是32位,所以单个硬盘可利用的空间最大也不超过2TB。如果想使用更大的硬盘,只有2个方法:一是提高每个扇区的字节数,二是。
三、第三阶段:硬盘启动
这时,计算机的控制权就要转交给硬盘的某个分区了,这里又分成三种情况。
3.1 情况A:卷引导记录
上一节提到,四个主分区里面,只有一个是激活的。计算机会读取激活分区的第一个扇区,叫做"(Volume boot record,缩写为VBR)。
"卷引导记录"的主要作用是,告诉计算机,操作系统在这个分区里的位置。然后,计算机就会加载操作系统了。
3.2 情况B:扩展分区和逻辑分区
随着硬盘越来越大,四个主分区已经不够了,需要更多的分区。但是,分区表只有四项,因此规定有且仅有一个区可以被定义成"扩展分区"(Extended partition)。
所谓"扩展分区",就是指这个区里面又分成多个区。这种分区里面的分区,就叫做"逻辑分区"(logical partition)。
计算机先读取扩展分区的第一个扇区,叫做(Extended boot record,缩写为EBR)。它里面也包含一张64字节的分区表,但是最多只有两项(也就是两个逻辑分区)。
计算机接着读取第二个逻辑分区的第一个扇区,再从里面的分区表中找到第三个逻辑分区的位置,以此类推,直到某个逻辑分区的分区表只包含它自身为止(即只有一个分区项)。因此,扩展分区可以包含无数个逻辑分区。
但是,似乎很少通过这种方式启动操作系统。如果操作系统确实安装在扩展分区,一般采用下一种方式启动。
3.3 情况C:启动管理器
在这种情况下,计算机读取"主引导记录"前面446字节的机器码之后,不再把控制权转交给某一个分区,而是运行事先安装的(boot loader),由用户选择启动哪一个操作系统。
Linux环境中,目前最流行的启动管理器是。
四、第四阶段:操作系统
控制权转交给操作系统后,操作系统的内核首先被载入内存。
以Linux系统为例,先载入/boot目录下面的kernel。内核加载成功后,第一个运行的程序是/sbin/init。它根据配置文件 (Debian系统是/etc/initab)产生init进程。这是Linux启动后的第一个进程,pid进程编号为1,其他进程都是它的后代。
然后,init线程加载系统的各个模块,比如窗口程序和网络程序,直至执行/bin/login程序,跳出登录界面,等待用户输入用户名和密码。
至此,全部启动过程完成。
(完)
文档信息
- 版权声明:自由转载-非商用-非衍生-保持署名()
- 发表日期: 2013年2月16日
- 更多内容: »
- 付费支持:
- 社交媒体:,
- Feed订阅:
相关文章
- 2014.07.04:
所有应用软件之中,数据库可能是最复杂的。
- 2013.11.29:
学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈"。
- 2013.10.14:
计算机的存储层次(memory hierarchy)之中,寄存器(register)最快,内存其次,最慢的是硬盘。
- 2013.08.17:
半年前,我写了《计算机是如何启动的?》,探讨BIOS和主引导记录的作用。
广告
留言(65条)
说:
沙发,学习了。虽是计算机专业,但对底层的东西了解的不深,往往又拿透明的来搪塞自己。
| |
lvzongting 说:
bios不一定存在,bios只是提供了一个固定的方式,去访问其他输入输出设备,存在的目的是可以将硬件的变化简化,这 样内核就可以通过和固定的bios通信来获取基本的硬件地址信息,然后再获得更充分的硬件地址信息。没有bios的计算机,就没有这么一个固定的方式,随 着硬件的改变,就要静态的改变内核内部设备的入口地址,然后重新编译。可以这么说bios是使得现在操作系统变得通用的一个利器。比如现在不同的arm手 机的内核不能随便换着用,而有bios的计算机内核即使硬件不那么一样,却可以用同样的内核。还比如现在很多时候都会将硬件地址的map独立于内核写到一 个单独的文件中,内核载入的时候会从这些文件中读取硬件的入口地址。从上电开始,处理器的指令计数器会被初始化成一个值(这个值不一定是0x0000H,因为一般还会在前面放中断向量表),然后从这个地址开始执行程序。这 些程序有可能放到片内的flash,有可能放到片外的flash,或是RAM里面。由于RAM是掉电易失的,所以可能需要先从其他存储设备中载入内存然后 再从内存中调入片内进行运算。
| |
snowqiang 说:
这样来看, boot翻译成'自举'还是挺形象的。
| |
Wht'for 说:
>>>计算机通电后,第一件事就是读取它。我更好奇,是*什么*又是*怎么*读取的。
| |
说:
MBR是个很重要的概念,在经历N次启动硬盘找不到OS的情况才能深刻了解。VBR(卷引导记录)应该是硬盘在逻辑卷(LVM)管理方式的情况,不过LVM可以是管理多个硬盘,或者是单个硬盘的某个分区。
| |
Mike 说:
For UEFI, it is a different story.
| |
Canson 说:
引用Mike的发言:
For UEFI, it is a different story.
的确,或者说即使不是UEFI,Legacy的Bios的故事也有别的变种。BIOS 工程师路过
| |
OJ77 说:
很不错,解决了很多疑惑!
| |
说:
我曾经也写过一个类似的启动过程,更加注重的是linux/unix系统,如果从加电到grub1/2的执行,分别考虑到了EFI和BIOS的过程,地址是:http://www.dalei.org/linux-unix-boot-process
| |
说:
boot这个说明写的真好
| |
cumirror 说:
谢谢阮兄的好文。
下面这篇文章中有关于硬盘分区的详细介绍:
| |
goddyang 说:
我印象中MBR和partition table不是包含关系,MBR只包含最前面的446个字节的内容
| |
说:
引用goddyang的发言:
我印象中MBR和partition table不是包含关系,MBR只包含最前面的446个字节的内容
有几次安装系统,分区表正常,但是不能引导,重写MBR后可以引导了,所以我也有这种感觉。
| |
说:
Gpt分区的还是和以上过程有些差别
| |
说:
Master boot record是Master boot record,Partition table是Partition table,两者没有包含关系吧……
| |
skywalker1114 说:
阮兄:Bootstrap不是鞋带的意思,应该是"鞋子背带"的意思(http://en.wiktionary.org/wiki/bootstrap)在这里隐喻表示一种不需要外部帮助自己能够处理事情的情形。"pull oneself up by one's bootstraps"最初来自于《The Surprising Adventures of Baron Munchausen》这本书里的一个故事:主人公Baron Munchausen不小心掉进了一片沼泽,他通过自己的bootstraps将自己拉了出来(当然有童话神奇的色彩)。事实上在19世纪初美国就 有"pull oneself over a fence by one's bootstraps"的语言,意思是"做荒谬不可能完成的事情"。参考:http://en.wikipedia.org/wiki/Bootstrapping
| |
说:
引用夜弓的发言:
Gpt分区的还是和以上过程有些差别
请问您能讲一下区别吗?我记得GPT是可以支持大于2T的硬盘空间的吧
| |
说:
从逻辑和原理上来分析,BIOS是为了适应不同的操作系统。如论是DOS,Windows还是UNIX都可以通过读取 BIOS 中硬盘、软盘、键盘、显示器、日期等实现外部I/O调用,以用于实现某种计算机平台的应用。如果只是为了专用的操作系统,没BIOS也照样可以工作。就是 通过 reset vector 复位矢量,一个绝对跳转去执行相应的程序。
| |
dakwing 说:
bios提供类似API的东西(系统中断),如果没有bios,想操作输入输出设备那只能用out和in了,哪怕只是向屏幕输出一个字符或发出beep声
| |
说:
讲得很深入,
| |
noodles 说:
单个硬盘最大只能利用2T的空间
这个不是很明白
| |
GN_ghost 说:
我不知道这个署名转载时应该怎样保持署名。。。
| |
说:
引用Canson的发言:
的确,或者说即使不是UEFI,Legacy的Bios的故事也有别的变种。BIOS 工程师路过
能介绍一下BIOS 的工作过程么, 从上电~POST 完成之间都做了什么, 还有BIOS程序是怎么启动的?
| |
骑驴的桑乔 说:
引用Wht'for的发言:
>>>计算机通电后,第一件事就是读取它。我更好奇,是*什么*又是*怎么*读取的。
好奇。硬件通电之后就自动去读取ROM里的BIOS程序?如何做到的?
| |
yuchen 说:
看完,明白了自检和硬盘引导的道理。谢谢阮兄~
| |
fromoon 说:
一般cpu是有固化的自检的,然后北桥,没问题之后才读入bios。
| |
落蓝轩主 说:
引用noodles的发言:
单个硬盘最大只能利用2T的空间
这个不是很明白
2的32次方*512Byte得出有多少Byte,然后再转化成TB。但是我不明白分区表最后四个字节为什么能够表示最多有2的32次方个扇区。
| |
Jak Wings 说:
《计算机奥秘》第六版,对此也有不错的简介。
| |
Jak Wings 说:
引用Jak Wings的发言:
《计算机奥秘》第六版,对此也有不错的简介。
呃,我记错了,也只是简单的说了个过程而已……不过那本书全都是彩页,页页配图,介绍了不少计算机相关的东西。
| |
马小超 说:
对于第三段的第3小节,MBR 的446字节机器码就是 boot loader吧?
| |
说:
对于这个话题很感兴趣,根据自己了解的补充几点内存地址的东西:1.计算机开机时,CPU默认执行0ffffh:0000h处的指令(8086是这样,386应该类似),而此内存地址应该存放的就是bios rom2.bios执行玩post等后,将引导设备的mbr复制到内存地址07c00h处,跳转执行此处指令,这个地址应该是规定的3.现在一般引导设备中的mbr是grub或lilo这样的引导程序,这样的程序首先将自己复制到06c00h处执行,在主分区表中搜索活动分区,将用户选择的活动分区的第一个扇区读入到07c00h处,调转到07c00h处执行注:以上均在实模式中执行,还未进入保护模式4.为加载内核做准备,并将控制权交给kernel,系统启动成功注:这一步进入保护模式当然这是现在一般的启动流程,当然如果自己写os,可以直接在引导设备的mbr中写直接加载内核的代码,将编译的代码dd入引导设备的mbr中即可。
| |
说:
平时都没怎么注意这么细节 在这里学习啦
| |
狐说 说:
每种CPU固定的从一个地址开始运行,用于自举的程序必须固定装载在这个地方。形态可以是多种多样的
| |
说:
bootstrap不是鞋带的意思,应是靴子后面方便把靴子穿上的那个拉环
| |
说:
"拽着鞋带把自己拉起来" 这个很形象。对于计算机有多了一些了解,感谢。
| |
说:
从开始学计算机到现在一直想弄明白从按下计算机的启动按钮之后,每一个部件做了什么。本文讲的是大概的过程,细节恐怕很复杂,很难一一弄明白。
| |
Amy 说:
不是很详细。希望楼主继续补充。
| |
Nanthon 说:
原来Boot还有这个典故,有意思~
| |
说:
赞,这种学习的态度值得学习。
| |
说:
终于明白计算机的启动过程了,之前装Ubuntu、Win7双系统时对启动很迷茫...
| |
如墨 说:
bootstrap:a loop at the back of a boot, used to pull it on.这不就是鞋后跟上的"鞋拔子"吗?还是应该怎么叫?
补:查了一下叫"拔靴带"
| |
说:
学习,往往这些事情都不明白,自己还不去研究,博主有心了
| |
工士 说:
建议将Power-On Self-Test 翻译为 加电自检 或 开机自检
加电自检又称为开机自我检测(英文Power-on self-test,常用简称POST)
| |
Francise 说:
引用落蓝轩主的发言:
2的32次方*512Byte得出有多少Byte,然后再转化成TB。但是我不明白分区表最后四个字节为什么能够表示最多有2的32次方个扇区。
4个字节,每个字节8位二进制字符(0,1),所以总共32位,于是2的32次方
| |
说:
- 计算机入门选手路过,希望看到越来越多的精彩博文!
| |
说:
嗯 挺深奥的。要是更清楚知道电脑的运行原理就更好;只知道它是以电为载体,就只知道0和1的信息,到底电脑是怎样识别这些数字逻辑信息的呢?如何变电流信息为电脑识别的信息。没电脑前就只能写信 文字信息到有了电脑后的邮箱信息。不可思议的创造,一个新鲜的东西在几十年前就出现了,而我活了二十年了还不知道那是怎么创造出来的。求大神能解小弟疑惑啊。万分感谢
| |
jeacon 说:
引用林的发言:
嗯 挺深奥的。要是更清楚知道电脑的运行原理就更好;只知道它是以电为载体,就只知道0和1的信息,到底电脑是怎样识别这些数字逻辑信息的呢?如何变电流信息为电脑识别的信息。没电脑前就只能写信 文字信息到有了电脑后的邮箱信息。不可思议的创造,一个新鲜的东西在几十年前就出现了,而我活了二十年了还不知道那是怎么创造出来的。求大神能解小弟疑惑啊。万分感谢
对于通过计算机系统的运行情况大致如下首先源代码经过编译器变成可执行程序,可执行程序经过加载器加载到操作系统中,作为操作系统的一个进程运行,可执行程序可以理解为一条条可以被计算机 CPU识别的机器码,然后CPU运行,至于CPU为什么可以运行,就需要知道数字电路中的知识,诸如加法电路,译码电路等逻辑电路知识,关于内存和CPU 中的内部寄存器就需要了解数字电路中的时序电路,时序电路具备加电记忆的特点,用来实现寄存器。数字电路研究的是0101这种高低电平之间转换和输入输出的规律。至于数字电路的基础就要是模拟电路了,二极管三极管等等。大量的三极管构成了一个基本的数字电路单元,例如能够存储一位二进制数的寄存器。而模拟电路研究的是大量电子在加压后的宏观运动规律,这种宏观体现到数字电路上就是01的高低电平。那么单个电子的运动规律是如何的呢?这就需要电子量子学的知识作为支撑了,但是现在科技能够研究到的最深的领域,也就是量子了(电子也属于量子),至于我 们以前所学习过的单个量子的运行规律不见得是对的,但是这并不影响到我们研究大量量子的运行规律,单个量子不好研究,但是大量量子就会呈现出来一定的规律 性。
当你研究到量子,你也就研究到了当今科学最前沿的东西了,也就没有办法更深了。。。
不知我说的是否容易理解。
| |
techon 说:
这是计算机的常规过程,关于启动这块现在正处于老式和BIOS-MBR和UEFI-GPT的过度阶段
wiki上 UEFI的介绍:
前一阵看到的一篇文章:新一代UEFI BIOS科普和探索系列
| |
冰与火 说:
从您这儿了解到,为什么只能有4个主分区了。我之前想对硬盘分更多分区的时候(Windows 7),找到的解决办法是change the basic disk to dynamic disk on Disk 0.当时成功的实现了扩展分区,很高兴。但并没有深究这个convertion对电脑又什么影响。我觉得应该像您学习,追根溯源。但是,我从网上也只是了解到Basic和Dynamic之间定义的区别,并没看到转换之间的区别。Windows社区里倒是有老外问起这个问题,似乎也得 到了非常满意的答案,只是我没读懂那段英文的意思。http://social.technet.microsoft.com/Forums/en-US /winservergen/thread/cc90e135-4aa3-4ba0-8b22-057566dba5ec有对此清楚的朋友,还望赐教!
| |
niurg 说:
写的非常好,可惜没有从头至尾学过,很多环节都很模糊。
| |
张启杰 说:
有一个文档"From Power UP to Bash Prompt"很好地描述了计算机启动的过程,可以到网上搜来看看。
| |
shincepu 说:
高质量博文 + 高质量回复。谢谢各位了
| |
说:
引用马小超的发言:
对于第三段的第3小节,MBR 的446字节机器码就是 boot loader吧?
我记得也是这样 ,boot loader可以执行标准的动作来启动 ,但也可以干些其他事用其他方式启动, 就像grub那样,grub就是bootloader。
| |
李健 说:
老师:可以把你写这些文章的时候顺便把你的那些参考资料也记载一下吧。这样在看你的文章的时候也可以多学点,真心觉得写得不错。。
| |
篱下殇 说:
"所以单个硬盘可利用的空间最大也不超过2TB"这个没理解,应该是硬盘分区最大为2T吧
| |
说:
本篇博文主要还是讲述的是intel的x86架构的启动原理,实际上arm启动原理与上述过程并不相同。
| |
说:
x86为了兼容以前的8086CPU,所以开机时进入实模式,实模式下是16位寻址方式,此时0ffffh:0000h的 物理地址指向了32位寻址范围的4G内存的最后64K的16字节处,正是BIOS的ROM代码,BIOS的存在意义主要是建立一个中断向量表,然后用这些 中断去检测和读取其他的设备,比如内存,硬盘等,最后会被操作系统的代码重新覆盖这些向量。
| |
孟帅 说:
这是Linux启动后的第一个进程,pid进程编号为1,其他进程都是它的后代。对于这句话 我不太理解 怎么叫"其他进程都是它的后代"?是不是说,电脑开着的时候,这个进程一直在运行,一直占用着内存?后代用来比喻什么?进程之间的关系哪有后代之说?那不就是线程吗?
| |
dliyc 说:
@jeacon:
解释到数字电路就可以了,诸如触发器,加法器之类的。量子嘛,就扯的有点远了。
| |
鬼鬼 说:
扩展分区可以包含无数个逻辑分区 这个有限制的吧,不是无限的
| |
Song 说:
博主的文章 + "成仔不说话"的回复,对我的帮助最大。博主让我知道了boot的真正含义,以前确实困惑过加载时"蛋和鸡"的问题。接着对于ROM,BIOS,MBR512,4硬盘,2TB,都能理解。就是困惑谁执行拷贝,搬运操作系统到内存,怎么交接控制权有点模糊。"成仔不说话"的补充回答了我这个疑惑,包括:"CPU默认执行0ffffh:0000h处的指令,rom-bios""将引导设备的mbr复制到内存地址07c00h处,跳转执行此处指令""grub或lilo这样的引导程序,先将自己复制到06c00h处执行,搜索活动分区读入到07c00h处,调转到07c00h处执行,控制权交给kernel"kernel开始启动自己第一个进程init...总结:1)拷贝都是由前一个运行的程序执行。2)控制权的交接是拷贝后执行跳转(应该是通过CPU的PC)。