关于开机
关于开机
[TOC]
BIOS->Boot->OS->SHELL
从本质上来讲,上面这四个东西都是程序. 从启动电脑,到进入操作系统之前的整个流程为,
- BIOS:启动主动执行的固件,会认识第一个可启动的设备
- MBR:第一个可启动设备的第一个扇区内的主引导记录块,内含启动引导代码
- 启动引导程序(boot loader):一个可读取内核文件来执行的软件
- 内核文件:开始启动操作系统
BIOS
关于主板
主板就像生命系统的神经一样,将重要的部件连接起来. 当大脑(CPU)发布命令后,信号通过神经(主板)传导给手、脚等部位(各项接口设备)作出相应的反应. 因此主板的设计显著影响着计算机的性能.
早期的主板上包含两个主要芯片,靠上方的叫北桥,靠下方的叫南桥,我们管他们叫作芯片组. 北桥的速度较快,负责连接高速设备,内存、显卡等组件,并与CPU进行通信,同时负责与南桥进行通信. 南桥负责连接速度较慢的设备接口,包括硬盘、USB设备、网卡等组件,南桥的信息先传递给北桥,然后再与CPU进行通信. 目前的计算机,北桥的内存控制器已经被整合到CPU中了,已经没有传统意义上的北桥了,因此芯片组的说法也就没有了,南桥也就自然换了一个说法,可以把它叫作PCH(platform controller hub).
CMOS
主板上的组件是非常多的,而每个组件的参数又具有可调整性,比如我们可以调整CPU的频率(超频),或者是否启用网卡、显卡等,这些元信息的各项参数,储存在主板上一块叫作CMOS(complementary metal oxide semiconductor)的芯片上. CMOS实际上是一种晶体管,叫作互补金属氧化物半导体. 在计算机中,我们特指在电脑主板上这块可以读写的芯片. CMOS记录了主板上各项重要参数,包括系统时间、CPU电压与频率、各项设备的IO地址等. 由于这些数据的记录需要用电,因此CMOS需要借助额外的电源来使用记录功能,主板上因此放置了一块纽扣电池. 这些数据如何读取和更新呢?这就是BIOS的功能.
BIOS
BIOS (Basic Input Output System) 一个程序,和其他运行在系统中的程序不同,BIOS是一个写死到主板上的一个存储芯片中的一个汇编程序. 这颗存储芯片即使在没有通电时也能够记录数据,即只读存储器ROM(read only memory). 在计算机启动的时候,BIOS程序最先运行,加载CMOS中的参数,首先进行硬件自检,检验计算机硬件能否满足运行的基本条件. 如果没有问题,屏幕就会打印出CPU、内存、硬盘等基本信息. 之后,尝试调用存储设备中的引导程序,进一步进入操作系统中,此时BIOS程序结束. 不同的电脑(主板)有着不同的热键来在开机时进入BIOS.
磁盘分区
在Win里我们可以把整个磁盘进行分区,比如C、D、E盘. 磁盘分区有下面两个角度的考虑:
数据的安全性
每个分区的数据是分开的. 所以将某个分区的数据重新整理时,可以将重要数据移至其他盘.
系统的性能考虑
分区将数据集中在某个区段内,如一来当有数据要读取自该分区时,磁盘只会查找该数据所在的区段,比如1-100的柱面范围,从而提高了数据读取的速度.
假如对磁盘分好区了,计算机得知道一共有几个分区..每个区的开始和结束在那里呀,因此一定要存在一个分区表,来记录分区的信息. 分区表存在两种格式,MBR和GPT.
MBR
早期的Linux系统为了兼容Windows的磁盘,使用的是支持Windows的MBR(master boot record,主引导记录)的方式来处理启动引导程序和分区表。启动引导程序记录区与分区表处在磁盘的第一个扇区,这个扇区通常是512字节的大小,
- 主引导记录(Master boot record,MBR):可以安装启动引导程序的地方,有446字节
- 分区表(partition table):记录整块硬盘分区的状态,有64字节
由于MBR格式的分区表仅有64个字节的容量,因此最多仅能有4组记录区,每组记录区记录了该区段的起始与结束的柱面号码.
对于Windows系统,这1-4个分区就分别代表着C、D、E、F盘.
当然,虽然MBR的分区表中最多仅有4组记录区,但是我们可以做到“看起来”把磁盘分成超于4个的多个分区,我们可以通过扩展分区的方式来实现这一点,如下图所示,
在上图的分区方式中,我们4个分区记录区中仅用到两个,P1为主要分区,P2为扩展分区. 我们把扩展分区继续划分了5个子分区,这5个由扩展分区继续切出来的分区,被称为逻辑分区(logical partition),扩展分区最多只有一个. 我们可以总结一下主分区、扩展分区和逻辑分区的一些特性:
- 主分区和扩展分区最多可以有4个
- 扩展分区最多只有1个
- 逻辑分区是由扩展分区持续划分出来的分区
- 能够被格式化后作为数据存取的分区是主要分区与逻辑分区,扩展分区无法被格式化
- 逻辑分区的数量依操作系统而不同.
GPT
GPT(Globally unique identifier partition table)磁盘分区表,最多允许128个分区,而且每个分区的容量没有限制(MBR分区格式中单一分区的最大容量为2TB)。同时,在MBR中,仅有第一个512字节块用来放置引导程序和记录分区信息,而在GPT格式中,前后各有一个区块来储存分区信息,用以备份,因此其更加安全可靠.
用哪种分区模式对系统运行没有影响,很老的操作系统和启动引导程序可能不支持GPT分区格式,但目前包括Windows Vista,7,8,10和大多数新版Linux都已经支持GPT分区表.
BIOS + 启动引导程序
刚才我们看到了,磁盘第一扇区的分区表中包含两部分,首先是446字节的启动引导程序,之后是记录具体分区信息的分区表。我们把计算机的引导启动称作Boot过程,这个单词起源于bootstrap,鞋带,
pull oneself up by one's bootstraps
拽着鞋带把自己拉起来,在启动计算机时,必须先运行程序,计算机才能启动,但是计算机不启动,又无法运行程序.. 所以Boot实际上代表着一种<自引导>,在计算机术语里,意指 to load a program into a computer from a disk; to start or ready for use especially by booting a program.
在计算机启动时,首先主动执行BIOS程序,BIOS会去分析计算机里有哪些存储设备,以硬盘为例,BIOS会根据用户的设置去取得能够启动的硬盘,并且到该硬盘里面去读取第一个扇区的446个字节的启动引导程序的位置,成功找到后,BIOS的使命完成,将工作交给这个启动引导程序.
启动引导程序的目的是加载操作系统的内核文件,告诉计算机到硬盘的哪一个位置去找操作系统。由于启动引导程序是操作系统在安装的时候所提供的,因此它可以识别硬盘内的文件系统格式,因此就能够读取内核文件,此时工作交给操作系统内核,引导程序的使命也就结束了。
如果分区表是GPT格式的话,BIOS也能够MBR兼容区块读取第一阶段的启动引导代码,如果启动引导程序支持GPT的话,使用BIOS同样可以读取到正确的操作系统内核。而如果启动引导程序不支持GPT,那么就无法读取内核文件,无法启动操作系统。
这里要弄清楚各部分的关系,BIOS是写死在主板上的,因此它与操作系统无关;446字节的MBR(master boot record)主引导记录也是硬件支持的设置,但安装在MBR上的启动引导程序(boot loader)是操作系统安装在上面的一个程序,它是与操作系统有关的. 启动引导程序的主要功能包括:
- 提供选项:用户可以选择不同的启动选项,这也是多重引导的重要功能
- 加载内核文件:直接指向可使用的程序区段来启动操作系统
- 转交其他启动引导程序:将启动管理功能转交给其他启动引导程序负责
实际上多系统就是通过这些功能实现的,假如个人计算机上只有一个硬盘,里面分成了四个分区,其中第一第二分区分别安装了Windows和Linux,在启动时,我们可以选择直接加载Windows的内核文件来开机,也可以将启动引导程序指向第二个分区的启动引导程序,第二个引导程序启动后,可以加载Linux的内核文件,启动Linux系统,完成多重引导.
当然,BIOS会去分析计算机里有哪些存储设备,在开机进入BIOS后,如果我们在电脑上插入了安装了操作系统的硬盘,我们也可以指定从硬盘中启动系统,来实现通过外界硬盘实现的双系统,或者制作U盘启动盘来重装系统,其原理都是相似的.
OS
和BIOS一样,OS(operating system,操作系统)也只是一组程序,BIOS负责将计算机引导进入操作系统,操作系统负责管理电脑的所有活动以及驱动系统中的所有硬件,比如让CPU进行逻辑判断和数值运算,让内存可以开始加载、读取数据,让网卡传输数据、让外置设备开始运转等等,这些功能都是通过操作系统的内核(kernel)完成的. 为了方便用户对硬件进行控制,操作系统提供了一套应用程序编程接口(API)来给用户开发软件。比如要开发C语言程序,只需要参考C语言的语法即可,不再需要去考虑内核的相关功能,因为内核的系统调用接口会主动地将C语言的相关语法转换成内核可以识别的任务函数,内核自然就可以顺利地运行该程序。所以我们相当于是在核的外面与计算机打交道,处在“壳”的位置,所以SHELL程序起名叫SHELL(壳),其实一切应用程序本质上都是壳程序.
在定义上,只要能够让电脑硬件正确无误地运行,就算是操作系统。所以本质上来说,操作系统就是内核及其提供的接口工具。由于操作系统的内核层直接参考硬件规格写成,所以同一个操作系统程序不能够再不一样的硬件架构下运行(比如x86架构与arm架构),只要硬件不同,操作系统的内核程序就要进行相应修改.
内核
操作系统的内核程序主要负责电脑相关的资源分配与管理. 内核程序的基本功能包括,
- 系统调用接口:提供简单的接口让用户控制硬件资源
- 进程管理:调度排队让CPU处理的任务,有效地分配CPU资源
- 内存管理:控制整个系统的内存管理
- 文件系统管理:提供对不同文件格式的支持,支持数据的输入与输出的工作
- 设备驱动:硬件的管理是内核的主要工作之一,设备的驱动是内核需要完成的事情. 当然,硬件的发展非常快,对于较新的硬件,操作系统并没有提供支持,此时操作系统如何驱动这个硬件呢?通常,操作系统都会提供给一个API给硬件开发商,让他们可以根据这个接口设计驱动硬件的驱动程序. 在安装新硬件的时候,只要安装厂商提供的驱动程序就好啦. 要注意驱动程序是根据操作系统提供的API而开发的,所以不同系统下的驱动程序是不能够通用的.