首页 > 其他分享 >BIOS和UEFI

BIOS和UEFI

时间:2023-02-27 12:34:21浏览次数:46  
标签:初始化 操作系统 硬件 BIOS UEFI 内存

文章内容来自知乎上某位大佬的回答,之前保存在笔记里,找到原文后会附上链接。

UEFI和BIOS启动过程有什么不同吗?

有些同学说起UEFI和传统的BIOS区别,会如数家珍般的罗列MBR、PEI、DXE、UEFI分区啊这些东西,实际上这些全部是软件层面的抽象,本身并没有奇特的东西。
传统BIOS也可以做出改变支持PEI/DXE和UEFI分区等等,UEFI固件也可以支持支持传统BIOS的环境,两者并没有功能上本质的区别。

实际上PC的启动固件的引导流程从IBM PC机诞生第一天起,就没有本质改变过。
如果我们透过SEC、PEI、DXE和BDS等等复杂的术语看幕后隐藏的本质,就会发现无论传统BIOS还是UEFI,阳光之下没有什么新鲜的东西,启动本身无外乎三个步骤:
1、Rom Stage:在这个阶段没有内存,需要在ROM上运行代码。这时因为没有内存,没有C语言运行需要的栈空间,开始往往是汇编语言,直接在ROM空间上运行。在找到个临时空间(Cache空间用作RAM,Cache As Ram, CAR)后,C语言终于可以粉墨登场了,后期用C语言初始化内存和为这个目的需要做的一切服务。
2、Ram Stage:在经过ROM阶段的困难情况后,我们终于有了可以大展拳脚的内存,很多额外需要大内存的东西可以开始运行了。在这时我们开始进行初始化芯片组、CPU、主板模块等等核心过程。
3、Find something to boot Stage:终于要进入正题了,需要启动,我们找到启动设备。就要枚举设备,发现启动设备,并把启动设备之前需要依赖的节点统统打通。然后开始移交工作,Windows或者Linux的时代开始。

这就是传统BIOS和UEFI的启动过程,在剥去了术语后,主干的三个步骤从来没有变化过。
熟悉嵌入式系统开发的同学会发现,大多数嵌入式系统启动也大致是这些个步骤,从某种意义上讲,PC启动过程并没有什么特殊的。

传统BIOS尽管开始全部用汇编语言完成,但后期也部分引入了C语言,这些步骤完全是一样的。
什么MBR分区啊,UEFI分区都是枝节问题,都是技术上可以做到的,没有什么是UEFI可以做,传统BIOS不可以做到的。
那么问题来了,为什么UEFI会替代传统BIOS,UEFI展现了什么独特的魅力吗?要理解这一点,我们先要看看PC启动固件到底为什么必须。

为什么需要BIOS和UEFI?

与大多数人基本的概念不同,在某种意义上来说,X86体系比ARM体系更加开放。
X86是很多小伙伴一起玩,以生态圈的概念提供产品,并对自己那部分负责;而ARM体系虽然也依赖生态圈,但最终有个大Boss统合整个生态链,提供最后产品并对该产品负总责。
X86生态圈玩家众多,有OS厂商(OSV)定期发布操作系统,如Windows,Ubuntu;芯片厂商提供CPU,如Intel, AMD;主板厂商(OEM)提供电脑主板;独立硬件供应商(IHV)生产扩展板卡如显卡等等PCIE扩展卡,再如内存厂家推出一代一代不同的内存条等等。
DIY玩家可以自由选择搭配合适/兼容的产品搭配出自己心仪的机器,休闲上网用户花2000多元就可以搭配出一套可用的电脑,而游戏玩家则可能花费上万元才能满足游戏配置需求。
还有些品牌机厂商如Dell和联想等,他们提供整套最终产品给用户。但他们实际上是在所有小伙伴的零件基础上拼凑出个产品,技术不强,话语权弱,并不能统一整个产业链。用户津津乐道的反而是用的什么CPU,安装的什么操作系统,用的那种显卡等等。Windows死机、蓝屏和缓慢等等时候,用户往往会抱怨微软和Intel,而不是品牌厂商。
ARM体系由最后品牌厂商统合整个产品,它负责打通整个产业链,并对其中所有部分负责,话语权极强,同时对技术也相对较强。用户面对的具体品牌的产品,而不是碎片化的各个部分。强势的如Apple,硬件软件一起抓,完全组成闭环的链条。稍差也如华为等安卓手机,要负责安卓系统在自己手机移植部分(BSP),客户出了问题并不会找谷歌,而会去找华为。

在X86生态圈十分强势的微软,自己负责操作系统开发,跳过品牌直接服务最终用户,甚至不经允许直接升级操作系统,闹出不少风波。
强势也带来了副作用,它要直接面对数千数万种千奇百怪的硬件产品,如何才能用一个软件安装包服务于这么多种设备呢?必须要一个软件抽象层,封装这些硬件差别!
这就引出了BIOS和UEFI的最主要的功能:初始化硬件和提供硬件的软件抽象

ARM体系也要初始化具体主板相关硬件如GPIO和内存等,这些一般在BSP中完成。与X86体系不同之处在于这些硬件完全定制化,初始化的时候就预先知道有哪些设备,Solder Down了哪个品牌的哪种内存颗粒,到时候就照方抓药,初始化一大堆寄存器而已。
X86系统配置情况在开机时候是不知道的,需要探测(Probe) . Training(内存和PCIe)和枚举(PCIe等等即插即用设备),相对较复杂。

BIOS和UEFI提供了整个主板、包括主板上外插的设备的软件抽象。通过探测、Training和枚举,BIOS就有了系统所有硬件的信息。它通过几组详细定义好的接口,把这些信息抽象后传递给操作系统,这些信息包括SMBIOS (专栏稍后介绍)、ACPI表(ACPI与UEFI),内存映射表(E820或者UEFI运行时)等等。通过这层映射,才能做到做到操作系统完全不改而能够适配到所有机型和硬件。
在某种程度上来讲,BIOS和UEFI是将操作系统BSP部分单独封装后下放到主板或者BIOS提供商来完成。这在过去带来了巨大的好处,WinXP、Win7现在还可以运行在更新的电脑硬件上,新的硬件只要自己更改一下就行了,兼容性是ARM体系所不能比拟的。当然割裂的生态圈也带来了用户感受的千差万别,这也受到广泛诟病。各自为政也桎梏了创新,带来了同质化。为此,Intel越俎代庖,提出了变形本等等概念;而微软更直接出了Surface,似乎要与过去的小伙伴争食。其实这些都是不得已而为之,今后的发展还需要拭目以待。
ARM社区最近为了进入X86的传统优势领域,也开始接受UEFI,不过一般只在服务器领域。个别厂商为了支持Windows而在平板等设备支持UEFI,某厂商在手机上也要引入UEFI。不过这些只是支流,并且他们并不吧自己叫做BIOS,而叫做Bootloader。

人们总是习惯性的对新出现的东西持怀疑和否定的态度,UEFI在启动时又还是那三个步骤,那么UEFI一定是提供了某种特别的东西,才能让传统的固件工程和改换门庭。它们究竟是什么呢?答案就隐藏在上面一节“BIOS、UEFI的目的”中。UEFI扫除了传统BIOS割裂的生态,打通了PC固件之间的鸿沟,并提供统一的接口给操作系统,而不关心操作系统是什么;它能够更好的完成PC固件的终极目的:初始化硬件和提供硬件的软件抽象,和启动操作系统。如果说有什么东西帮助UEFI打败了传统BIOS,那这些东西就是:标准接口、开放统一和开源了。
传统BIOS来自于IBM,之后就进入战国时代,激烈的商战让接口统一成为了不可能做到的事,只有在面对微软这个大用户的时候,才勉强提供了“兼容”的基于软中断的接口。它封闭、神秘和充满各种不清不楚的预设和祖传代码,在调试PCI的ROM时要小心各种rom之间互相踩,各种只有老师傅才知道的神奇“诀窍”。要写个驱动,让它在各个BIOS厂商那里都能跑,简直成为了一件不可能完成的任务。
UEFI由Intel推动,在一开始就将标准公开,拉上了微软这个PC界的霸主,强势统一了江湖。在近20年的深耕下,统一了固件启动阶段基础框架Spec: Pl Spec与操作系统的接口Spec: UEFI Spec,并将抽象硬件的原语性Spec: ACPlSpec也拉入这个大家庭,都变成UEFI Forum的一份子。
现在只要符合UEFl driver model的驱动都可以在各个BIOS上运行,打通了各个BIOS厂商之间的壁垒;与此同时,符合UEFI标准的操作系统都可以流畅的在各种主板上运行,无论是Windows,还是Linux各种发行版,甚至是Android。实际上,PC生态圈的繁荣,和UEFI的推广和被广泛接受是分不开的。
值得一提的是UEFI内核的大部分代码是由Intel的中国工程师开发的。在大家一次次电脑的正常运行后面,有他们辛勤工作背影。他们也为固件的开源和国产化做出了自己的贡献。

UEFI将要向何处去?

在发展近20年之后,UEFI的代码量十分庞大。在Github上有数百万行!简直和一个操作系统一样,提供各种各样的驱动和lib,包括网络驱动、iscsi这样的大块头,蓝牙和WiFi这些小众驱动。多样的驱动和Lib,提供了极大的灵活性,用户可以拼接出强大的BIOS程序,但与此同时,这些庞大的代码,各种Lib和driver,让理解它十分困难。看准了这个机会,以前偏居一隅的Coreboot在跃跃欲试,走出了ChromeOS的疆域,在IoT市场上开始发力,并希望染指服务器领域。Google又提出LinuxBoot,希望在这个领域能分一杯羹。
简单就是美,如何简化它,如何更好地和开源社区一起愉快的玩耍,是UEFI需要解决的问题。20年之后的现在,UEFI已经变得越来越传统,曾经的屠龙骑士变成了恶龙,业界呼唤新的方案,Intel也不失时机的提出了ModernFW的概念。

名词解释

DXE:Driver Execution Environment,驱动程序运行环境

BSP:Board Support Package,板级支持包。是构建嵌入式操作系统所需的引导程序(Bootload)、内核(Kernel)、根文件系统(Rootfs)和工具链(Toolchain) 提供完整的软件资源包。

GPIO:General-purpose input/output,通用输入/输出端口。通俗地说,就是一些引脚,可以通过它们输出高低电平或者通过它们读入引脚的状态-是高电平或是低电平。GPIO口一是个比较重要的概念,用户可以通过GPIO口和硬件进行数据交互(如UART),控制硬件工作(如LED、蜂鸣器等),读取硬件的工作状态信号(如中断信号)等。

Solder Down:焊入

SMBIOS:System Management BIOS,是主板或系统制造者以标准格式显示产品管理信息所需遵循的统一规范。

OSV:Operating System Virtualization,智能桌面虚拟化平台。是基于X86标准计算机系统下实现PC桌面的集中管理、控制、存储、维护的PC桌面虚拟化技术。

PCIe:PCI-Express(peripheral component interconnect express)是一种高速串行计算机扩展总线标准,它原来的名称为“3GIO”,是由英特尔在2001年提出的,旨在替代旧的PCI,PCI-X和AGP总线标准。

ACPI:Advanced Configuration and Power Interface,高级配置与电源接口。1997年由Intel、Microsoft、Toshiba 所共同制定提供操作系统应用程序管理所有电源管理接口。2000年8月推出 ACPI 2.0规格。2004年9月推出 ACPI 3.0规格。2009年6月16日则推出 ACPI 4.0规格。2011年12月推出ACPI5.0规格。
作为标准中最广为认可的部分,电源管理经历了较多的改进。早先,Advanced Power Management模型(APM)将电源管理几乎完全分配给BIOS控制,这大大的限制了操作系统在控制电能消耗方面的功能。
当前,ACPI的电源管理特性从以前只适用便携式计算机(例如膝上型计算机)到桌上型电脑、工作站和服务器。例如,系统可能会进入极低功率消耗状态。这些就是可利用在多数桌面型电脑上的“睡眠”和“休眠”设置。睡眠和休眠状态可以通过移动鼠标,按键盘按键,从另外一台电脑接收一条信息(如果连接到了一个局域网)或者重大系统错误来唤醒系统。
如果ACPI在BIOS和其他系统硬件中被实现,它就可以由操作系统所调用(触发)。

E820:X86 架构机器在上电之后,BIOS 系统首先进行基础的硬件初始化,将机器初始化到 一个已知的状态,接着 BIOS 将 PC 指针跳转到特定位置以便引导内核的启动,最终 将执行权从 BIOS 移交给内核。以上便是一个最简单的内核引导过程,在这个过程中, BIOS 会初始化并探测系统可用和预留的内存信息,并将其存储在指定位置,内核在初始 话过程中,可以通过 BIOS 提供的一系列中断来获得内存相关的信息。
E820 内存管理器泛指从 BIOS 获得内存区域信息之后,对这些内存区域信息进行管理,以便于内存初始化时利用 这些信息对可用物理内存和预留内存进行规划和初始化等操作。

标签:初始化,操作系统,硬件,BIOS,UEFI,内存
From: https://www.cnblogs.com/polin/p/17159232.html

相关文章

  • BIOS初识
    就像人的肉体和思想的关系一样,计算机硬件是软件的躯体,软件是硬件的灵魂。没有硬件,软件无从谈起;没有软件,硬件就是一堆垃圾,毫无用处。众所周知,操作系统是系统软件,对硬件的......
  • UEFI初识
    概念UEFI(UnifiedExtensibleFirmwareInterface),统一可扩展固件接口,是一种个人电脑系统规格,用来定义操作系统与系统固件之间的软件界面,作为BIOS的替代方案。可扩展固件接......
  • UEFI学习——windows 环境搭建记录
    环境搭建的过程安装开发工具:下载VS2019(编译C/C++)、python、IASL(MicrosoftACPI源语言(ASL)编译器、NASM编译器(x86汇编语言编译器),默认安装到系统盘就好;添加环境......
  • 7.7 BIOS和引导
    程序的运行环境中,存在着名为BIOS(BasicInput/OutputSystem)的系统。BIOS存储在ROM中,是预先内置在计算机主机内部的程序。BIOS除了键盘、磁盘、显卡等基本控制程序外,还有启......
  • 7.7BIOS和引导
       程序的运行环境中,存在着名为BIOS(BasicInput/OutputSystem)的系统。BIOS存储在ROM中,是预先内置在计算机主机内部的程序。BIOS除了键盘、磁盘、显卡等基本控制程序......
  • 技嘉 Gigabyte UEFI DualBIOS无限重启
    问题描述:无法开机,按下电源后,主板通电状态灯亮,CPU和显卡风扇转动,显示器显示下图,然后陷入无限重启死循环。始终无法进入BIOS。 可以尝试的解决方案是:关机后,按住主板电......
  • 7.7BIOS和引导
    程序的运行环境中,存在着名为BIOS(BasicInput/OutputSystem)的系统。BIOS存储在ROM中,是预先内置在计算机主机内部的程序。BIOS除了键盘、磁盘、显卡等基本控制程序外,还有......
  • ThinkPad x220 BIOS
    MainConfigNetworkWakeOnLAN(局域网唤醒)  【ACOnly】   ACOnly仅插电源时开启,  ACandBattery插入电源及电池都启用Ethernet......
  • UEFI EDKII 编程学习
    环境搭建部分第一步:下载EDK2​​https://sourceforge.net/projects/edk2/files/latest/download?source=files​​ 第二步:将下载的UDK2015.Complete.MyWorkSpace中的BaseTo......
  • 3108 9361 9460等卡在浪潮两路机器UEFI模式下配置步骤
    1.RAID卡信息查看以及相关设置1.1开机进入到BIOS的RAID界面开机在浪潮LOGO处按”Delete”键进入到BIOS操作界面,选择”Advanced”选项,如下图:  择”AVAGOMegaRAID......