Windows 引导启动流程详述(BIOS-UEFI)

Windows 启动流程详述

  • BIOS 和 UEFI 的由来
    • BIOS 存在哪里
    • BIOS 程序的功能
    • BIOS 和 UEFI 的发展由来
    • 如何查看当前计算机是什么方式引导启动呢?
    • Linux 下如何查看 BIOS 大小?
  • 启动流程详述
    • 使用 BIOS 进行系统启动流程
    • 使用 UEFI 进行系统启动流程
      • SEC阶段
      • PEI阶段
      • DXE阶段
      • BDS阶段
      • TSL阶段
      • RT阶段
      • AL阶段
  • 总结
  • 参考文献


BIOS 和 UEFI 的由来

BIOS 存在哪里

上个世纪70年代初,“只读内存”(read-only memory,缩写为ROM)发明,开机程序被刷入ROM芯片,计算机通电后,第一件事就是读取它。

在这里插入图片描述
这块芯片里的程序叫做"基本輸出輸入系統"(Basic Input/Output System),简称为BIOS。

BIOS 程序的功能

存储在 ROM 芯片中的这一小段程序就是 BIOS 程序,虽然现在新出现的引导启动方式已经有了 UEFI 启动(或者 EFI 启动),但是其实 UEFI 或者 EFI 的一部分也是存储在这个芯片中。它们在计算机上电后的流程基本是一致的。上电后,硬件操作会将芯片中的程序读到内存中的固定位置,并赋值 PC 和 CS 固定的数值使得 CPU 能够从内存固定的位置去取值执行,从而开始最初的 BIOS 程序执行(这里的 BIOS 程序是指 BIOS 和 UEFI 的统称)。一直以来,我们都将计算机的引导启动程序称为 BIOS ,无论现在它还是否叫 BIOS 或者 UEFI ,我们还是习惯统称其为 BIOS。

BIOS 和 UEFI 的发展由来

最早的 BIOS 就是存放在计算机 ROM 中用于引导开机的一段程序代码(汇编代码)。其功能也很简单纯粹,计算机硬件自检、CMOS设置、寻找存放有操作系统的存储硬件、读取存储硬件的程序、引导操作系统启动、提供硬件 I/O 和硬件中断等基础功能。这些基础功能对于计算机上电后的运行是必不可少的一部分。(就像最简单的 51 单片机一样,最初上电后也需要执行一段最基本的寄存器初始化和内存代码读取的汇编指令)

虽然 BIOS 作为电脑加电启动所必不可少的部分,但是从其于 1975 年诞生之日起近 30 余年, 16 位汇编语言代码,1M 内存寻址,调用中断一条条执行的理念和方式竟然一点都没有改变,虽然经各大主板商不懈努力,BIOS 也有了 ACPI(Advanced Configuration Power Interface)一种基于BIOS 的系统电源管理方案 (是由BIOS实现)提供CPU和外设的电源管理功能;当空闲的时候会被OS调用提供CPU的电源管理。 、USB 设备支持,PnP 即插即用支持等新东西,但是这在根本上没有改变 BIOS 的本质,而 Intel 为了迁就这些旧技术,不得不在一代又一代处理器中保留着 16 位实模式(否则根本无法开机的)。但是,英特尔在 2001 年开发了全新的安腾处理器,采用 IA-64 架构,并推出了全新的 EFI。后来证明,安腾处理器、IA-64 架构没有推广开来,而 EFI 和后继的 UEFI 却发扬光大,成为现在电脑的主要预启动环境。

EFI,是 Extensible Firmware Interface 的词头缩写,直译过来就是可扩展固件接口,它是用模块化、高级语言(主要是 C 语言)构建的一个小型化系统,它和 BIOS 一样,主要在启动过程中完成硬件初始化,但它是直接利用加载 EFI 驱动的方式,识别系统硬件并完成硬件初始化,彻底摒弃读各种中断执行。EFI 驱动并不是直接面向 CPU 的代码,而是由 EFI 字节码编写成, EFI 字节码是专用于 EFI 的虚拟机器指令,需要在 EFI 驱动运行环境 DXE 下解释运行,这样 EFI 既可以实现通配,又提供了良好的兼容。此外,EFI 完全是 32 位或 64 位,摒弃 16 位实模式,在 EFI 中就可以实现处理器的最大寻址,因此可以在任何内存地址存放任何信息。另外,由于 EFI 的驱动开发非常简单,基于 EFI 的驱动模型原则上可以使 EFI 接触到所有硬件功能,在 EFI 上实现文件读写,网络浏览都是完全可能的。BIOS 上的的 CMOS 设置程序在 EFI 上是作为一个个 EFI 程序来执行的,硬件设置是硬件设置程序、而启动管理则是另一个程序,保存 CMOS 又是另一个程序,虽然它们在形式的 Shell 上是在一起的。

EFI 在功能上完全等同于一个轻量化的 OS(操作系统),但是 EFI 在制定时就定位到不足以成为专业 OS 的地位上,首先,它只是一个硬件和操作系统间的一个接口;其次,EFI 不提供中断访问机制,EFI 必须用轮询的方式检查并解释硬件,较 OS 下的驱动执行效率较低,最后,EFI 只有简单的存储器管理机制,在段保护模式下只将存储器分段,所有程序都可以存取任何一段位置,不提供真实的保护服务。

伴随着 EFI,一种全新的 GUID 磁盘分区系统(GPT)被引入支持,传统 MBR 磁盘只能存在 4 个主分区,只有在创建主分区不足 4 个时,可以建立一个扩展分区,再在其上建立被系统识别的逻辑分区,逻辑分区也是有数量的,太多的逻辑分区会严重影响系统启动,MBR硬盘分区最大仅支持2T容量,对于现在的大容量硬盘来说也是浪费。GPT 支持任意多的分区,每个分区大小原则上是无限制的,但实际上受到 OS 的规定限制不能做到无限,不过比 MBR 的 2T 限制是非常重要的进步。GPT 的分区类型由 GUID 表唯一指定,基本不可能出现重复,其中的 EFI 系统分区可以被 EFI 存取,用来存取部分驱动和应用程序,虽然这原则上会使 EFI 系统分区变得不安全,但是一般这里放置的都是些“边缘”数据,即使其被破坏,一般也不会造成严重后果,而且也能够简单的恢复回来。

当 EFI 发展到 1.1 的时候,Intel 决定把 EFI 公之于众,于是后续的 2.0 吸引了众多公司加入,EFI 也不再属于英特尔,而是属于了 Unified EFI Form 的国际组织,EFI 在 2.0 后也遂改称为 UEFIUEFI 其中的 EFI 和原来是一个意思,U 则是 Unified(一元化、统一)的缩写,所以 UEFI 的意思就是“统一的可扩展固件接口”,与前身 EFI 相比,UEFI 主要有以下改进:

  • 首先,UEFI 具有完整的图形驱动功能,之前的 EFI 虽然原则上加入了图形驱动,但为了保证 EFI 和 BIOS 的良好过渡,EFI 多数还是一种类 DOS 界面(仍然是 640480 VGA 分辨率),只支持 PS/2 键盘操作(极少数支持鼠标操作),不支持 USB 键盘和鼠标。到了 UEFI,则是拥有了完整的图形驱动,无论是 PS/2 还是 USB 键盘和鼠标,UEFI 一律是支持的,而且 UEFI 在显卡也支持 GOP VBIOS 的时候,显示的设置界面是显卡高分辨率按 640480或1024*768 显示,因此画面虽小但很清楚,但是这样会导致屏幕周围大片留黑,不过鱼和熊掌不可兼得,除非 UEFI 默认窗口大小也是最高分辨率。
  • 其次,UEFI 具有一个独特的功能,安全启动,而 EFI 是没有安全启动的,安全启动(Secure Boot),实际上通俗的解释是叫做固件验证。开启 UEFI 的安全启动后,主板会根据 TPM 芯片(或者 CPU 内置的 TPM )记录的硬件签名对各硬件判断,只有符合认证的硬件驱动才会被加载,而 Win8 以后的 Windows 则是在操作系统加载的过程中对硬件驱动继续查签名,符合 Windows 记录的硬件才能被 Windows 加载,这在一定程度上降低了启动型程序在操作系统启动前被预加载造成的风险,但是这也会造成系统安装变得垄断。

无论 EFI 还是 UEFI,都必须要有预加载环境、驱动执行环境、驱动程序等必要部分组成,为了支持部分旧设备(如在 UEFI 下挂载传统 MBR 硬盘,不支持 UEFI 启动的显卡在 UEFI 下仍然支持运行等),还需要一个 CSM 兼容性支持模块、EFI 或 UEFI 都是仅支持 GPT 磁盘引导系统的,后面的内容会具体谈一下 EFI 或 UEFI 启动计算机的过程。

从这里,我们就能发现,之前的 BIOS 引导启动需要配合 MBR 的传统磁盘分区进行,而后来者 UEFI 则是引导新的 GPT 磁盘分区进行启动。所以现在主流的启动流程可以简单概括如下两种:

  • BIOS + MBR
  • UEFI + GPT

如何查看当前计算机是什么方式引导启动呢?

在“此电脑”上右键选择“管理”,弹出“计算机管理”选择“磁盘管理”,如果能找到一个“EFI系统分区”,那么就是UEFI引导方式了。
在这里插入图片描述

Linux 下如何查看 BIOS 大小?

Linux 下可以查看 BIOS 大小通过 dmidecode 这个命令来查看。也就是读取 BIOS 的信息。

root@aliyun:~# dmidecode -t bios -q  # 方法一
BIOS InformationVendor: SeaBIOSVersion: 8c24b4cRelease Date: 04/01/2014Address: 0xE8000Runtime Size: 96 kBROM Size: 64 kB --- ROM Size,在此可以看到,BIOS 大小为 64K。Characteristics:BIOS characteristics not supportedTargeted content distribution is supportedBIOS Revision: 0.0root@aliyun:~# cd /sys/class/dmi/id/  # 方法二
root@aliyun:id# ls
bios_date          chassis_serial   modalias        product_serial   sys_vendor
bios_vendor        chassis_type     power           product_uuid     uevent
bios_version       chassis_vendor   product_family  product_version
chassis_asset_tag  chassis_version  product_name    subsystem

启动流程详述

前面,我们讲述了关于 BIOS 和 UEFI 的由来和基本作用。了解了它们在计算机启动过程中所需要发挥的作用后,下面就来详细看一下在计算机上电后它们具体是如何执行和操作来引导操作系统正常启动的。

使用 BIOS 进行系统启动流程

BIOS 用于计算机硬件自检、CMOS 设置、引导操作系统启动、提供硬件 I/O、硬件中断等4项主要功能,因此 BIOS 程序可以分为若干模块,主要有 Boot Block 引导模块、CMOS 设置模块、扩展配置数据(ESCD)模块、DMI 收集硬件数据模块,其中引导模块直接负责执行 BIOS 程序本身入口、计算机基本硬件的检测和初始化,ESCD 用于 BIOS 与 OS 交换硬件配置数据,DMI 则充当了硬件管理工具和系统层之间接口的角色,通过 DMI,用户可以直观地获得硬件的任何信息,CMOS 设置模块就是实现对硬件信息进行设置,并保存在 CMOS 中,是除了启动初始化以外 BIOS 程序最常用的功能。

BIOS 本身是汇编语言代码,是在 16 位实模式下调用 INT 13H 中断执行的,由于 x86-64 是一个高度兼容的指令集,也为了迁就BIOS的16位实模式的运行环境,所以即使现在的 CPU 都已是 64 位,如果还是在 BIOS 启动(基本见于 09 年以前的主板),在开机时仍然都是在 16 位实模式下执行的。16 位实模式直接能访问的内存只有 1MB,就算你安了 4G、8G 或者 16G 还是 32G 内存,到了 BIOS 上一律只先认前 1MB。在这 1MB 内存中,前 640K 称为基本内存,后面 384K 内存留给开机必要硬件和各类 BIOS 本身使用,具体如下图所示:

在这里插入图片描述

  1. 如上图所示,当按下 power on 之后,此时的 CPU 处于 real address mode。由硬件负责将 BIOS 64K 的内容加载到 0xF00000xFFFFF(64K 内存)。并将 CS(code segment) 置为 0xF000,IP(instruction pointer) 置为 0xFFF0。组合起来的内存地址 PC 就是 0xFFFF0
  2. 此时 CPU 从 PC = 0xFFFF0 处开始取指、执行。那么从 0xFFFF00xFFFFF 只有 16Bytes。空间太小了,能放啥呢?但是可以跳到其他地方去执行啊。不错,这里存放的有一条指令是 jmp far f000:e05b, 组合起来就是 0xfe05b。注意这个地址可是在 0xF00000xFFFFF 范围之内,也就是这条指令跳转到 BIOS 内部的代码去执行。从 0xFE05B0xFFFF0 将近 8K 内存,代码不少。
  3. 此时 CPU 从 PC = 0xfe05b 开始取值、执行。具体干啥呢?就是执行所谓的开机自检。检查计算机硬件。同时去找启动扇区,那什么才是启动扇区呢?若 0 盘 0 道 1 扇区最后两个字节分别是 0x55,0xaa,那就是启动区。很像 java class 文件中的魔数,就是标记一下。同时将找到的启动扇区(512Bytes) 复制到内存 0x7C000x7DFF(512Bytes) 处。最后会将 CS 置为 0x0000, IP 置为 0x7C00,组合起来就是 0x7C00
  4. 此时 CPU 从 PC = 0x7C00 开始取值、执行。具体干啥呢?这就是开发人员可以决定的了。在启动扇区上可以是加载 OS Kernel 的代码,硬盘分区,boot loader 等。

将上述细节流程进行概括如下:

  1. 上电并稳定后,CPU执行地址 0xFFFF0H 处指令,此处为BIOS程序;

  2. BIOS 进行硬件自检,没有问题后加载硬盘的第一个扇区到内存0x7c00H 处,第一个扇区为 MBR(Master
    Boot Record),MBR 包含执行程序和分区表;

  3. CPU 开始执行 MBR 程序,查找第一个活动分区,把活动分区的第一个扇区加载到内存中,活动分区第一个扇区为 PBR(Partition Boot Record);

  4. CPU 开始执行 PBR,第一个指令就是跳过 BPB(BIOS Parameter Block)到可执行代码处;BPB 包含比较多参数,有族的大小、MFT 记录大小、MFT 位置等,用于读取 NTFS 文件;

  5. PBR 读取 VBR(Volume BootRecord,占用分区开始的16扇区)剩余的 15 扇区到内存中;接着 CPU 跳转到 0x07C0:027A 处,执行 BOOTMGR 代码(第二个扇区中);

  6. 开始寻找 bootmgr.exe,找不到则寻找 ntldr.exe(win vista之前的系统);

  7. CPU 加载并跳转到 bootmgr.exe 处执行,读取 BCD 文件,如果含有多个系统,则列举显示供用户选择;

  8. 选择的是 Windows 则读取 winload.exe 文件到内存中,CPU 跳转到winload.exe 处执行,读取文件 \windows\bootstat.dat,有需要则显示引导菜单,比如安全引导等等;接着加载内核程序 Ntoskrnl.exe,相关辅助 HAL.dll、CI.dll、PSSHED.dll、BootVID.dll,把 CPU 执行权交给内核程序;

  9. 内核程序执行系统初始化。

在这里插入图片描述

使用 UEFI 进行系统启动流程

前面已经介绍了 UEFI 的由来,所以相比 BIOS 来说 UEFI 会在扩展性、易用性等等方面有很大的改进。下面就来详细讲述 UEFI 的启动执行流程。

一般地,预加载环境和驱动执行环境是存储在 UEFI(UEFI BIOS)芯片中的,当打开电源开关时,电脑的主要部件都开始有了供电,与 BIOS 不同的是,UEFI 预加载环境首先开始执行,负责 CPU 和内存(是全部容量)的初始化工作,这里如出现重要问题,电脑即使有报警喇叭也不会响,因为 UEFI 没有去驱动8255发声,不过预加载环境只检查 CPU 和内存,如果这两个主要硬件出问题,屏幕没显示可以立即确定,另外一些主板会有提供 LED 提示,可根据 CPU 或内存亮灯大致判断故障。

CPU 和内存初始化成功后,驱动执行环境(DXE)载入,当 DXE 载入后,UEFI 就具有了枚举并加载 UEFI 驱动程序的能力,在此阶段,UEFI 会枚举搜索各个硬件的 UEFI 驱动并相继加载,完成硬件初始化工作,这相比 BIOS 的读中断加载速度会快的多,同样如加载显卡的 UEFI 驱动成功,电脑也会出现启动画面,硬件驱动全部加载完毕后,最后同 BIOS 一样,也得去启动操作系统。

在启动操作系统的阶段,同样是根据启动记录的启动顺序,转到相应设备(仅限 GPT 设备,如果启动传统 MBR 设备,则需要打开 CSM 支持)的引导记录,引导操作系统并进入,这里需要注意的是,UEFI 在检测到无任何操作系统启动设备时,会直接进入 UEFI 设置页面,而不是像 BIOS 那样黑屏显示相关信息。

  1. 按下电源键,电源向主板以及其它设备供电,刚开始电压不稳,主板会持续发送 RESET 信号给 CPU,CPU 执行初始化。当电压稳定后,主板停止发送 RESET 信号,CPU 开始执行指令;

  2. CPU 读取 UEFI 指令,执行 UEFI 初始化,执行其它设备的初始化;

  3. 查找 EFI 分区,EFI 分区不需要一定是第一个分区;

  4. 加载 \EFI\Boot\bootx64.efi,在安装 Windows 时实际上会使用\EFI\Microsoft\Boot\bootmgfw.efi 的内容替换到 \EFI\Boot\bootx64.efi,所以\EFI\Boot\bootx64.efi 其实就是 \EFI\Microsoft\Boot\bootmgfw.efi

  5. bootmgfw.efi 会读取 BCD 文件,BCD 是一个数据库文件,如果包含多个系统,信息会包含在 BCD 中,通过显示一个系统列表供用户选择;

  6. BCD 中包含每个系统的引导文件的路径,Windows 的是\Windows\System32\winload.efi,加载到内存中并执行;

  7. winload.efi 读取 \Windows\bootstat.dat 文件,有需要则显示引导菜单,比如安全引导等等;接着加载内核程序 Ntoskrnl.exe,相关辅助HAL.dll、CI.dll、PSSHED.dll、BootVID.dll,把 CPU 执行权交给内核程序;

  8. 内核程序执行系统初始化。

在这里插入图片描述

从 Intel 官方的资料,可以详细讲 UEFI 的执行流程概括成如下七个阶段:

  • SEC(安全验证)->
  • PEI(EFI前期初始化)->
  • DXE(驱动执行环境)->
  • BDS(启动设备选择)->
  • TSL(操作系统加载前期)->
  • RT(系统系统运行阶段)->
  • AL(系统灾难恢复期或关机)

如下图所示:

在这里插入图片描述

详细说明 UEFI 这七个阶段如下:

SEC阶段

作为计算机上电后第一阶段,SEC会做一些与硬件相关的验证,并且将控制权交给PEI Foundation。(注:IA-32和Itanium会有差别)

SEC阶段主要功能:

处理平台启动及重启信号
创建临时存储区域
作为可信系统的根
传递参数给下一阶段(既PEI Foundation)
1、处理平台启动机重启信号:

系统上电信号处理,系统重启信号处理,系统异常信号处理。

2、创建临时存储区域:

SEC阶段需要初始化一些临时内存(这时各种外设及内存并没有被初始化),作为程序的运行载体,仅对CPU和CPU内部Cache作为临时RAM,区别于普通的内存,我们称它为CAR(Cache As RAM)。因为内存并没有初始化,需要将Cache配置成为no-eviction,当read/write miss时候并不会向内存发出miss事件,如果这时向内存发出miss事件会导致平台故障。

3、作为可信系统的根

任何安全设计中,后续模块获得控制的完整性,由调用者证实必须有根,既SEC阶段作为整个可信系统的根。

4、传递参数给下一阶段(既PEI Foundation)

SEC阶段需要为PEI阶段做准备,最终SEC需要把控制权交给PEI。

需要准备如下信息给 PEI Foundation:

  • 当前的系统状态,PEI可以根据这些状态判断系统的健康状况。(注:IA-32和Itanium会有差别)
  • BFV(Boot Firmware Volume)的地址和大小
  • 临时RAM的地址和大小
  • 栈的地址和大小
  • EFI_SEC_HOB_DATA_PPI这个HOB(Optional)

PEI阶段

PEI阶段资源依然十分有限,PEI后期才会初始化内存,主要功能就是初始化一些硬件设备,并且给DXE准备执行环境,通过HOB传递给DXE Foundation,最终将控制权交给DXE Foundation。

初始化内存
准备memory相关的HOB
准备FV相关的HOB
控制权交给DXE Foundation
PEI阶段主要由PEI Foundation、PEIM Dispatcher来处理上述操作。

PEI Foundation:负责初始化gPeiServices和流程执行
PEI Dispatcher:找出系统中所有的PEIM,并根据PEIM之间的依赖关系按顺序执行PEIM,其中CPU/Memory初始化都是由特定的PEIM来完成的,其中DxeIpl来Load DxeCore。

PEI阶段流程

在这里插入图片描述

DXE阶段

这一阶段,内存已经完全可以使用了,这个阶段进行大量的工作,主要是提供:

  • DXE Foundation:负责初始化一系列服务如BootServices/RuntimeServices/DxeServices,和安装一些ConfigurationTable。
  • DXE Dispatcher:负责分发DXE Drivers,包括MM Drivers也是在这个阶段共同分发。
  • DXE Drivers:负责初始化一些Protocol及安装Binding Driver为后续使用。

BDS阶段

BDS阶段理论上也是DXE阶段的一部分,主要负责执行可启动策略,主要包括:

  • 初始化控制台设备
  • 为设备加载相关的驱动,由Binding Driver来决定怎么加载。
  • 为BIOS Setup做准备。
  • 根据系统设置加载和启动可启动选项。

TSL阶段

由 BDS 阶段 LoadImage 并 StartImage 的 grub 镜像。

这一阶段由 grub 执行,资源由 UEFI kernel 提供,当 grub 调用 ExitBootServices 后就进入系统 Runtime 阶段。

RT阶段

这阶段控制权完全交给了 OS,保留 RuntimeServices 交给 OS 使用, MM Mode 脱离于 OS 独立运行。

AL阶段

在 RT 阶段,如果遇到灾难性错误,固件提供错误处理机制和灾难恢复机制,UEFI/PI Spec 都未定义该阶段的行为。

总结

综上对 BIOS 和 UEFI 启动计算机过程的叙述,可以概括为:

  • BIOS 先要对 CPU 初始化,然后跳转到 BIOS 启动处进行 POST 自检,此过程如有严重错误,则电脑会用不同的报警声音提醒,接下来采用读中断的方式加载各种硬件,完成硬件初始化后进入操作系统启动过程;
  • UEFI 则是运行预加载环境先直接初始化 CPU 和内存,CPU 和内存若有问题则直接黑屏,其后启动 PXE 采用枚举方式搜索各种硬件并加载驱动,完成硬件初始化,之后同样进入操作系统启动过程。

此外,BIOS 是 16 位汇编语言程序,只能运行在 16 位实模式,可访问的内存只有 1MB,而 UEFI 是 32 位或 64 位高级语言程序(C 语言程序),突破实模式限制,可以达到要求的最大寻址。

参考文献

Intel 资料:

  • https://edc.intel.com/content/www/us/en/design/products-and-solutions/software-and-services/firmware-and-bios/firmware-interface-table/
  • https://www.intel.cn/content/www/cn/zh/developer/articles/tool/unified-extensible-firmware-interface.html?wapkw=UEFI

知乎资料:

  • https://zhuanlan.zhihu.com/p/483888207
  • https://zhuanlan.zhihu.com/p/342088326
  • https://zhuanlan.zhihu.com/p/54108702
  • https://zhuanlan.zhihu.com/p/283054574
  • https://zhuanlan.zhihu.com/p/36976698#:~:text=1%20BIOS%E5%8A%A0%E7%94%B5%E8%87%AA%E6%A3%80%EF%BC%88Power%20On%20Self%20Test%20–%20POST%EF%BC%89%E3%80%82%202,%E6%A3%80%E6%9F%A5MBR%E7%9A%84%E7%BB%93%E6%9D%9F%E6%A0%87%E5%BF%97%E4%BD%8D%E6%98%AF%E5%90%A6%E7%AD%89%E4%BA%8E55AAH%EF%BC%8C%E8%8B%A5%E4%B8%8D%E7%AD%89%E4%BA%8E%E5%88%99%E8%BD%AC%E5%8E%BB%E5%B0%9D%E8%AF%95%E5%85%B6%E4%BB%96%E5%90%AF%E5%8A%A8%E8%AE%BE%E5%A4%87%EF%BC%8C%E5%A6%82%E6%9E%9C%E6%B2%A1%E6%9C%89%E5%90%AF%E5%8A%A8%E8%AE%BE%E5%A4%87%E6%BB%A1%E8%B6%B3%E8%A6%81%E6%B1%82%E5%88%99%E6%98%BE%E7%A4%BA%22NO%20ROM%20BASIC%22%E7%84%B6%E5%90%8E%E6%AD%BB%E6%9C%BA%E3%80%82%20%E5%BD%93%E6%A3%80%E6%B5%8B%E5%88%B0%E6%9C%89%E5%90%AF%E5%8A%A8%E8%AE%BE%E5%A4%87%E6%BB%A1%E8%B6%B3%E8%A6%81%E6%B1%82%E5%90%8E%EF%BC%8CBIOS%E5%B0%86%E6%8E%A7%E5%88%B6%E6%9D%83%E4%BA%A4%E7%BB%99%E7%9B%B8%E5%BA%94%E5%90%AF%E5%8A%A8%E8%AE%BE%E5%A4%87%E7%9A%84MBR%E3%80%82%203%20%E6%A0%B9%E6%8D%AEMBR%E4%B8%AD%E7%9A%84%E5%BC%95%E5%AF%BC%E4%BB%A3%E7%A0%81%E5%90%AF%E5%8A%A8%20%E5%BC%95%E5%AF%BC%E7%A8%8B%E5%BA%8F%20%E3%80%82

w3school 资料:

  • https://www.w3cschool.cn/bioswqsc/zuxjo6.html

CSDN 资料:

  • https://blog.csdn.net/power_to_go/article/details/106645417#:~:text=x86%20%E6%9E%B6%E6%9E%84%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%90%AF%E5%8A%A8%E6%B5%81%E7%A8%8B%201%20%E5%A6%82%E4%B8%8A%E5%9B%BE%E6%89%80%E7%A4%BA%EF%BC%8C%E5%BD%93%E6%8C%89%E4%B8%8B%20power%20on%20%E4%B9%8B%E5%90%8E%EF%BC%8C%E6%AD%A4%E6%97%B6%E7%9A%84%20CPU,%E4%BB%8E%20PC%20%3D%200x7C00%20%E5%BC%80%E5%A7%8B%E5%8F%96%E5%80%BC%E3%80%81%E6%89%A7%E8%A1%8C%E3%80%82%20%E5%85%B7%E4%BD%93%E5%B9%B2%E5%95%A5%E5%91%A2%EF%BC%9F%20%E8%BF%99%E5%B0%B1%E6%98%AF%E5%BC%80%E5%8F%91%E4%BA%BA%E5%91%98%E5%8F%AF%E4%BB%A5%E5%86%B3%E5%AE%9A%E7%9A%84%E4%BA%86%E3%80%82%20

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/4315.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2022 年第十二届 MathorCup 高校数学建模挑战赛D题思路(移动通信网络站址规划和区域聚类问题)

目录 一、前言 二、问题背景 三、问题 四、解题思路 (1)针对问题1: (2)针对问题2: (3)针对问题3: 五、附上几个典型代码 (1)K-means算法…

【Unity编辑器扩展】(三)PSD转UGUI Prefab, 一键拼UI解放美术/程序(完结)

工具效果: 第一步,把psd图层转换为可编辑的节点树,并自动解析UI类型、自动绑定UI子元素: 第二步, 点击“生成UIForm"按钮生成UI预制体 (若有UI类型遗漏可在下拉菜单手动点选UI类型): 验证一键生成UI效果: 书接上…

SAP HANA使用SQL创建SCHEMA:

语法是 CREATE SCHEMA “<Schema_Name>” 使用图形方法创建 SAP HANA 表&#xff1a; 创建图形计算视图&#xff1a;

FFmpeg视频转码关键参数详解

1 固定码率因子crf&#xff08;Constant Rate Factor&#xff09; 固定码率因子&#xff08;CRF&#xff09;是 x264 和 x265 编码器的默认质量&#xff08;和码率控制&#xff09;设置。取值范围是 0 到 51&#xff0c;这其中越低的值&#xff0c;结果质量越好&#xff0c;同…

React Antd Form.List 组件嵌套多级动态增减表单 + 表单联动复制实现

Antd Form.List 组件嵌套多级动态增减表单 表单联动复制实现 一、业务需求 有一个页面的组件&#xff0c;其中一部分需要用到动态的增减 复制表单&#xff0c;然后就想起 了使用 Antd 的 Form.List 去完成这个功能。 这个功能的要求是&#xff1a; 首先是一个动态的表单&…

SQL-每日一题【178.分数排名】

题目 表: Scores 编写 SQL 查询对分数进行排序。排名按以下规则计算: 分数应按从高到低排列。 如果两个分数相等&#xff0c;那么两个分数的排名应该相同。 在排名相同的分数后&#xff0c;排名数应该是下一个连续的整数。换句话说&#xff0c;排名之间不应该有空缺的数字。 …

Linux:LAMP搭建(全源码包安装)

LAMP 就是 Linux Apache Mysql PHP/Python 目录 Linux安装 Apache安装 Mysql安装 安装PHP 安装PHP扩展包 编译安装PHP PHP 添加优化模块 测试网页协同工作 Linux安装 虚拟机安装 (1条消息) VMware&#xff1a;安装centos7_鲍海超-GNUBHCkalitarro的博客-CSD…

Mybatis-Plus学习1

mybatis-plus需要两个依赖&#xff0c;一个lombok&#xff0c;一个mybatis-plus <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version> </dependency> …

路由协议基本术语

文章目录 1、自治系统AS2、EGP和IGP3、度量标准和度量值4、管理距离5、路由协议与路由算法6、路由环路问题 1、自治系统AS Internet中&#xff0c;自治系统就是处于同一个管理机构&#xff08;如一个ISP&#xff09;控制下的路由器和网络群组 在同一个自治系统中的所有路由器…

Learn Mongodb DB数据库部署 ②

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; PHP MYSQL &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…

集合专题----List篇

1、Collection常用方法 package com.example.collection.Collection;import java.util.ArrayList; import java.util.List;public class Collection03 {public static void main(String[] args) {List list new ArrayList();//接口可以指向实现该接口的类//add:添加单个元素l…

快消EDI:联合利华Unilever EDI需求分析

联合利华&#xff08;Unilever&#xff09;是一家跨国消费品公司&#xff0c;总部位于英国和荷兰&#xff0c;在全球范围内经营着众多知名品牌&#xff0c;涵盖了食品、饮料、清洁剂、个人护理产品等多个领域。作为一家跨国公司&#xff0c;联合利华在全球各地都有业务和生产基…