从 BIOS 开始的计算机启动

目录
[隐藏]

天天在用计算机,但似乎并不了解计算机。抽空好好给自己捋了捋,并没有涉及很深的硬件知识,也不去考虑硬件如何工作,仅仅是为了让自己能更清楚自己使用的东西,让自己一点一点去理解自己写的代码对底层对硬件会有什么影响。(依然是站在自己这样一个小白的角度,更像一篇给自己的科普)

1、BIOS 

BIOS 早也听过,也进去 BIOS 里面开启过 CPU 虚拟化功能,但除此之外似乎并没有十分正式的去了解过这个东西。

BIOS(Basic Input Output System,基本输入输出系统),BIOS 是一种软件,BIOS 芯片则是一种固件。课本上介绍过,固件就是固化了软件的硬件的称号。也就是说,买来的一台没有装操作系统的电脑,实际上已经有一个软件存在了,就是 BIOS。

1.1 Where & Who

BIOS 通常是固化在主板上的一块 ROM 芯片中。是计算机启动第一个执行的程序,那计算机是只能直接执行二进制代码的,所以 BIOS 程序应该是用二进制代码编写(网上看到有说是汇编语言写的,感觉不太正确)。那有哪些 BIOS 生产厂商在做将 BIOS 固化到芯片中这个事呢?查到资料中提到比较多的有三家:

AmericalMegatrends,Inc (AMI,美国安迈)、Award(惟尔科技)、PhoeniX。这三家的 BIOS 固件长这个样子:

1.2 What & How

BIOS 因为是计算机启动最先启动的程序,后续都无法进入,所以 BIOS 厂商会提供一些方法进入 BIOS 界面(通常是启动时长按某个键位进入)。

BIOS 可以为计算机提供底层的、最直接的硬件控制(中断等),计算机的原始操作都是依照固化在 BIOS 里的内容来完成的。BIOS 是硬件和其它软件程序之间的一个接口,负责解决硬件的即时需求,并按软件对硬件的操作要求具体执行。但现在的操作系统通常并不通过 BIOS 操作硬件,自身可以直接和硬件打交道。

BIOS 的功能主要来说是两点:开机自检、系统启动引导。

开机自检:(Power On Self Test,简称 POST)主要检测电脑硬件是否良好,包括 CPU 、内存、ROM、抓板、键盘等。如果出现问题通常会有对应的声音报警信号。

系统启动引导:这是系统安装的关键了,BIOS 程序会根据设置的磁盘启动顺序去读取第一扇区内的代码,将这些系统启动引导程序加载到内存执行。

1.3 BIOS & CMOS 

BIOS 是软件,而 CMOS 是一个硬件,Complementary Metal Oxide Semiconductor——互补金属氧化物半导体(本意是指互补金属氧化物半导体存储嚣,是一种大规模应用于集成电路芯片制造的原料),是微机主板上的一块可读写的 RAM 芯片,主要用来保存当前系统的硬件配置和操作人员对某些参数的设定。CMOS RAM芯片由主板上一块纽扣电池供电,因此无论是在关机状态中,还是遇到系统掉电情况,CMOS信息都不会丢失。

     所以说 CMOS 只有存储信息的能力,存储的就是一些参数,而 通过 BIOS 设置程序可以修改存储在 CMOS 中的参数,从而改变硬件的一些行为。

1.4 EFI & UEFI

BIOS 之后又有了 EFI、UEFI 这两种更加友好的固件,

        EFI(Extensible Firware Interafce,可扩展固件)由英特尔倡导的替代 BIOS 的升级方案,最大特色是自带图形驱动,用图形界面取代 BIOS 的蓝白文字界面,可通过鼠标进行设置。

        UEFI(Unified Extensible Firmware Interface,统一可扩展固件接口)由 EFI 发展而来,国际组织维护。

        UEFI 使用高级语言 C 编写,所以安全性和稳定性不如汇编语言编写的 BIOS。

1.5 BIOS 小结

如果计算机没有装操作系统,开机后一般会显示 BIOS 厂商的开机界面,然后提示找不到系统启动引导程序。当然你长按特定键一样可以进入设置 BIOS 设置界面(一定程度上算是已经在使用计算机了,,,)

早期的 BIOS 只能存放在 ROM 芯片中,只能烧制进去,所以无法更改。然后随着硬件发展,慢慢有了 EPROM(erasable programmable read-only memory)、EEPROM(electrically erasable programmable read-only memory),那 BIOS 就存放到这种芯片中了,所以现在可以直接通过软件更新 BIOS 了。

虽然没有丰厚的基础支持我去更深入的了解,但还是觉得应该要去了解这些可以掌握的。

2、计算机的启动过程

前面讲 BIOS ,但没有提到 Why,为什么要有 BIOS。想一下,最早时候计算器怎么启动?“必须先运行程序,才能启动计算机,但计算机不启动就无法运行程序”,听上就很矛盾,所以一定要先把一小段程序转入内存,然后计算机才能启动。这一小段程序就是 BIOS 了。

这里插个彩蛋,计算器启动为什么要叫“boot”? boot 原意是鞋子,在这里 boot 是 bootstrap(鞋带)的缩写,这来自一句谚语"pull oneself up by one's bootstraps"  ,就是“拽自己的鞋带把自己提起来”。这当然不可能,早期工程师用这个谚语比喻计算机的启动过程,久而久之就简称为 boot 了。

2.1 BIOS 运行

计算机启动的第一个阶段毫无疑问是 BIOS 程序,BIOS 在通电后就运行 BIOS 首先进行自检,那计算机是怎么一通电就直接运行 BIOS 程序的呢?“对于x86系列的CPU,一加电就将指令寄存器设置为:0xFFFF0000,表示CPU开始从 0xFFFF0000 这个内存中取出一条指令执行,通常在0xFFFF0000处是一条地址转跳指令,转向BIOS的入口

如果 BIOS 自检没问题,就会进入 BIOS 的下一阶段,加载引导扇区(按 BIOS 设置的 BOOT Sequence,即外部设备加载顺序,依次检查对应设备的引导扇区是否具有系统引导程序,当然排在前面的设备就是优先转交控制权的设备)。这个引导扇区可以是硬盘上,也可以是光盘上,也可以是 USB 上。这就是按 BOOT Sequence 来的。

BIOS 将最前面的存储设备的 引导扇区 的内容加载到 内存 中,并跳转到引导程序的第一条指令。BIOS 将所检查的外部存储设备的第一个扇区(512B 字节)载入内存,放在 0X00007C00 处,如果一个上去的最后两个字节是 “55 AA”,那么这就是一个引导扇区,BIOS 就会将控制权交给这个区域的引导程序,这 512 B 内容就叫做“主引导记录”;如果不是,就检查下一个设备,如果都没有则显示“NO ROM BASIC ”,然后死机。

2.1.1 MBR(Master Boot Record,主引导记录)

根据 Wiki: 主引导记录   MBR 是计算机开机访问硬盘所必须要读取的首个扇区。

MBR 只有512个直接,存不了太多东西,它的主要作用是,告诉计算机到硬盘哪一个位置去找操作系统。

MBR 由三部分组成:

  (1) 第1-446字节:调用操作系统的机器码。

  (2) 第447-510字节:分区表(Partition table)。

       (3) 第511-512字节:主引导记录签名(0x55和0xAA)。

硬盘分区表只有 64 字节的大小,每个分区信息需要占据 16 字节,所以一个硬盘最多有 4 个分区(称为”主分区“)。每个分区构成如下:

  (1) 第1个字节:如果为0x80,就表示该主分区是激活分区,控制权要转交给这个分区。四个主分区里面只能有一个是激活的。

  (2) 第2-4个字节:主分区第一个扇区的物理位置(柱面、磁头、扇区号等等)。

  (3) 第5个字节:主分区类型

  (4) 第6-8个字节:主分区最后一个扇区的物理位置。

  (5) 第9-12字节:该主分区第一个扇区的逻辑地址。

  (6) 第13-16字节:主分区的扇区总数。

2.2 硬盘启动

在 BIOS 将引导扇区的系统引导程序加载到内存后,控制权就会转交到硬盘的某个分区了。

2.2.1 卷引导记录

计算机读取激活分区的第一个扇区,叫做"卷引导记录"(Volume Boot Record,简称 VBR,也称分区引导记录,Partition Boot Record 简称 PBR )。VBR 的主要作用是,寻找激活分区根目录下的 NTLDR(xp)、bootmgr(Win7 above)、grldr(Grub) 等可用于引导的程序(这些引导程序通常由汇编语言写的)。

2.2.2 启动管理器

"启动管理器"(boot loader)是系统预先安装的程序,由用户选择启动哪一个操作系统。VBR 将控制权交给 bootloader,bootloader 会寻找激活分区中的启动配置数据,在操作系统内核启动前进行一系列初始化工作。具体没有去了解,,有兴趣的自行查阅。

2.3 操作系统 启动

控制权交给操作系统后,操作系统的内核首先被载入内存。以 Linux 系统为例,先载入 /boot 目录下的 kernel。内核加载成功后,第一个运行的程序是 /sbin/init,这个程序根据配置文件产生 init 进程,pid 为 1,是所有其它进程的祖先。然后 init 加载系统的各个模块,直至执行 /bin/login 程序,跳出登录界面。

至此,计算机就完成了整个启动过程,操作系统也成功运行了。

2.4 OEM、MSDN、RTM 科普

OEM (Original Equipment Manufacture,原始设备生产商)。就是 微软专门给某些品牌生产商预装系统提供的操作系统版本,这些品牌厂商可以在系统中添加一些本品牌的标识、软件等。该版本系统不能“零售”,不需要激活,又是随计算机一起发布的,所以又称“随机版”。通常是品牌机才会有,例如买一台联想电脑,联想公司就已经为你预装的操作系统,就叫 OEM 版的操作系统(此时联想即为 OEM 代工厂商)。

        当然,除了品牌机自带的 OEM 版系统,还有 MSDN 版、RTM 版系统。

        MSDN 版面向开发者的(通常是软件/硬件生产商)

        RTM 版(Release to Manufactruing),该版本和正式版已经完全是一样的程序代码了,需要激活使用,但并没有光盘。

3、总结和参考

通过短暂的学习,虽然很难深入理解,但有了一定的了解也够了,不会再是无知的样子了,,希望自己能一点点的去清楚自己写的代码会对底层产生什么影响。

计算机是如何启动的——阮一峰

如何编写引导程序——CSDN

发表评论

电子邮件地址不会被公开。 必填项已用*标注

To