UEFI and BIOS or Bootloader

Linux –UEFI– BIOS –register– Hardware

BIOS对熟练工程师需求相当大, BIOS对硬件的改变相当敏感,硬件小变需要小改,大变需要大改. BIOS和硬件的操作界面是硬件寄存器. BIOS工程师需要根据各种Spec、原理图和功能需求,填写寄存器,最后抽象后向上汇报符合UEFI标准统一界面。

  1. Rom Stage: 没有内存,也没有C语言的stack空间。assembly 找到cache空间作为RAM然后用c来初始化内存。
  2. RAM Stage: 终于有内存了,许多需要大内存的东西可以开始初始化芯片组,CPU,主板等
  3. Linux: 枚举设备,发现启动设备,解决依赖的节点,移交工作

什么MBR分区啊,UEFI分区都是枝节问题 为什么需要BIOS和UEFI? ARM体系靠品牌商需自己负责BSP部分。而x86更开放,问题在于如何用软件包装无数种硬件产品? 即,如何初始化硬件和提供硬件的软件抽象

ARM体系当然也要BSP初始化具体主板相关硬件如GPIO和内存,但是因为是定制硬件,初始化已经知道了Solder Down那个品牌的内存颗粒,按照spec sheet写就好了。 X86的问题是不知道,需要探测(Probe)、Training(内存和PCIe)和枚举(PCIe等等即插即用设备)使得 BIOS就有了系统所有硬件的信息。它通过几组详细定义好的接口,把这些信息抽象后传递给操作系统。

BIOS, “兼容”的基于软中断的接口. 它封闭、神秘和充满各种不清不楚的预设和祖传代码,在调试PCI的ROM时要小心各种rom之间互相踩,各种只有老师傅才知道的神奇“诀窍”。要写个驱动,让它在各个BIOS厂商那里都能跑,简直成为了一件不可能完成的任务。

Coreboot and LinuxBoot FSP提供芯片初始化,而FSP数千到上万个参数才是系统复杂的难点所在 Coreboot from IOT, LinuxBoot from Server BIOS

Coreboot: 不懂当时的传统BIOS,也不想懂, 他觉得Linux自己就有很多设备的驱动,为什么还要在BIOS里面做一遍呢?他用了20多行汇编完成了简单的初始化. (内存初始化就几行汇编搞定),将Flash中的Linux拷贝到内存中,直接跳到Linux,就这样打完收工!

他们从两方面对v1 LinuxBIOS进行了扩展:Intel Cache As RAM + Device Tree coreboot设计简单,入门门槛较低。随着Intel开始探索IOT市场,coreboot上手容易的特点也成为了Intel支持IOT用户的一个选项:

Intel IOT firmware = coreboot + FSP

grub都是提供efi文件供uefi识别

uboot 好,就按你的思路,我们把 uboot 放进 kernel,看看行不行。从 CPU 上电开始说起:CPU 上电,BIOS(CPU 内置的一小段代码)自检,并企图让 kernel 运行起来;kernel 要运行,必须将 kernel 加载到内存才行,BIOS 便尝试将 kernel 从硬盘读入内存,这时麻烦来了,BIOS 发现内存并没有被初始化,不能用啊(内存像大多数外设一样,使用前必须要初始化)。BIOS 想,既然内存未初始化,我就初始化它呗,不过 BIOS 自身并没有初始化内存的代码(因为BIOS太小了,而且代码是固定的),那谁有这段代码呢?答案是 kernel。可是要想运行 kernel,又必须把 kernel 加载到内存。这不就形成死结了吗。。。BIOS 冥思苦想了半天,终于想出来了一个办法,CPU 内部有 SRAM 啊,并且 SRAM 无需初始化就能直接使用,我可以将 kernel 加载到 SRAM 中运行啊,说干就干,BIOS 便开始将 kernel 加载到 SRAM,结果发现 kernel 有 100MB,SRAM 只有 64KB,加载个屁呀!看样子 SRAM 是无法运行 kernel 了,不过 BIOS 依稀记得:kernel 的前面 4K 空间存储着初始化内存的代码。那就先将这 4K 加载到 cache 运行,用这段代码将内存初始化好,不就可以把内核加载到内存运行了吗。我真是个小机灵鬼,BIOS 心想。说干就干,结果还真被它给干成了,kernel 成功跑起来了。过了一段时间,客户改了需求,需要升级固件,kernel 便下载新的固件并覆盖自己,注意,是覆盖自己,结果一不小心中途某个字节写错了,再次开机时,已经变砖了,你说悲剧不悲剧。后来又想到了一个办法,能不能从 kernel 分离出一小段代码,这段代码只负责升级等一些基础工作,由于小,不容易出错,也更稳定。说干就干,把一些基础功能,如升级固件等单独提取出来,我们称它为 uboot。尼玛,又回来了,你说 linux 系统为什么一定要用 uboot 引导内核 ?

Written on March 17, 2023