BIOS入门篇 | 认识BIOS
每当被问到我是做什么的时候,我都会回答“嗯~ 算程序员吧”,对方又问:什么类型的呢?“一个电脑的开机程序,就是从按下电源键到看到屏幕LOGO这段时间跑的程序”
什么是BIOS
BIOS全称basic input output system,即基本输入输出系统,它是PC主板上的固件,负责初始化硬件资源并引导启动OS,可以说BIOS就是为了启动OS而生。
为什么要用BIOS
实际上启动OS并不一定需要使用BIOS,我们常见的嵌入式设备(如监控机),它们使用BootLoader来引导OS(一般是指Linux),BootLoader相当于BIOS的角色,负责初始化内存,加载OS内核等。由于嵌入式设备的硬件环境各不相同,没有统一的标准,所以在不同嵌入式硬件上运行OS每次都得修改配置BootLoader和内核,比较繁琐。传统的PC设备则不一样,整个硬件系统架构都是有标准的,早期由Intel,IBM,AMD等大厂制定,发展至今已成为一套成熟且统一的系统架构。同样的,既然硬件能统一,OS也可以做到一致。此时,要让OS可以在硬件工作起来,还需要一段引导程序,负责检初始化硬件(如初始化内存),检测硬件资源(如可否正常分配资源)等,前面这些都正常了,说明OS正常运行的条件满足了,此时做最后一步就是引导启动OS了,这一阶段的程序就称为BIOS。
BIOS存在的条件是统一的硬件,像嵌入式这种就完全没有必要了。
代码
BIOS只是一段引导程序,早期由汇编语言编写的。经过多年的发展,硬件可用的资源越来越丰富,BIOS已经无法满足现有的硬件了,此时打造一种新的引导程序便迫在眉睫。2002年12月英特尔发布了一种新的引导程序规范,称为EFI(Extensible Firmware Interface),后交由Unified EFI Forum(统一可扩展固件接口论坛)来推广与发展,并更名UEFI,新的引导程序正式面世了!
UEFI是一套规范,阐述了UEFI需要实现哪些功能,这些功能该怎么实现,实现的时候需要使用什么名称。比如规范中有一个USB相关的定义,有一个USB Host Controller Protocol,用来控制USB控制器,这个Protocol需要由13个函数组成,如下:
每个函数都有详细注明了它的使用方法,传入传出参数,返回值等,但是具体函数内部具体如何实现是不做要求的,只要能实现对应的功能即可。
UEFI的规范可以当做是一套库函数,是用来被调用的,那要怎么去使用这些库呢?整套引导的代码该从哪里写起?这时候一份称为《Platform Initialization Specification》(简称PI Spec)的手册派上用场了。
PI手册定义了UEFI代码的各个启动阶段(除了SEC阶段)的流程,每个阶段需要做哪些操作。此外,还定义了启动过程中使用到的一些机制,如HOB,SMM,S3 Resume等。
UEFI和PI手册定义整个引导程序的启动过程,当进入OS后,UEFI便功成身退了,只留下一些Runtime Service可供OS使用。进入操作系统后,人不可能无时无刻都在使用,当出现空闲状态时还是一直运行或者玩个扫雷就性能全开,就显得有点浪费电量,特别是笔记本电脑,这样的话电池很快就会消耗完。因此,对电脑进行电源的管理是非常有必要的。1997年由Intel、Microsoft、Toshiba共同制定提供操作系统应用程序管理所有电源管理接口称为ACPI(Advanced Configuration and Power Interface),即高级配置与电源接口。目前ACPI手册版本已经更新到6.3了,功能也越来越丰富,现在已经不单单是一个关于如何省电的手册了。在ACPI中,定义了一种用来描述ACPI的语言ASL(ACPI Source Language),由ASL写成的文件是需要包到UEFI固件中的,它编译后会变成AML(ACPI Machine Language),由OS去解析并处理。
UEFI在初始化阶段,需要与整个硬件系统资源打交道,比如Memory,PCIE,ISA BUS等,它们也都有标准的手册。
整个X86的架构也是有定义的,目前比较权威且完善的就是Intel制定的IA32手册,它是基于Intel自家的产品来写,如果是其他的CPU,如AMD,可能有一些差异,但整体上是一致的。
至此,有了这些规格书,UEFI代码便可以实现了,EDK应运而生!目前最新的代码已经更名为EDK2,是目前所有UEFI固件的基础代码。
EDK2主要是实现手册所定义的各项基本功能,是一套通用的代码,并不能直接拿来使用,还需要根据各个平台的差异做修改或对功能进行扩充,此时就有了做这项工作UEFI代码厂商,他们会整合优化EDK2的基础代码和芯片厂商(Intel、AMD还有中国的龙芯,兆芯等)的核心代码,有些还会加进一些自家的特色功能,让代码使用起来更加便捷。AMI就是比较著名的厂家,他们的代码都进行了深度的定制,很多功能几乎只要改改enable跟disable就可以了。
BIOS SETUP
为了能让普通用户能够对某些功能进行配置,UEFI提供了一个简单人机界面,称为“Setup界面”,也叫“BIOS Setup”。虽然BIOS退出舞台了,但由于习惯的原因,“BIOS”这个叫法一直存留至今。有了这个BIOS SETUP,用户便可以通过它了解一些基本的信息,如CPU,内存大小等,然后还可以设置启用禁用或启用一些功能,比如有些网吧的电脑会关掉USB接口,而普通用户则要启用,此时就可以对它进行配置。
BIOS固件
UEFI代码编译后会生成一个二进制文件,它便是BIOS/UEFI固件。要让CPU可以执行固件,需要把它烧录在CPU或PCH中的SPI Flash(也称BIOS ROM)中,CPU启动的时候便会从Flash中读取固件,执行指令。
NOTE
UEFI、ACPI和PI SPEC都可以在这里下载到:Unified Extensible Firmware Interface Forum
EDK2项目地址:GitHub - tianocore/edk2: EDK II
Intel IA32手册:Intel® 64 and IA-32 Architectures Software Developer’s Manual...
版权声明:
作者:bin
链接:https://ay123.net/mystudy/bios/1181/
来源:爱影博客
文章版权归作者所有,未经允许请勿转载。
![](https://ay123.net/wp-content/uploads/2021/08/LOGO.png)
共有 0 条评论