但是,UEFI 并不是不进行自检,而是弱化了自检的概念,强化了自检的功能。简单讲就是,BIOS 其实也只能进行一些简单的自检,随着技术的发展,这些简单的自检已经没有必要了,而复杂的自检,BIOS 又做不到。所以,UEFI 提供了框架,对复杂的设备可以单独自检,或者干脆等到 OS 加载时由 OS 来进行。
取消自检流程确实缩短了启动时间,这也是 win10 开机快的原因之一。
UEFI 优势
作为 Legacy BIOS 的继任者,UEFI 拥有前辈所不具备的诸多功能,比如图形化界面、多种多样的操作方式、允许植入硬件驱动等等。这些特性让 UEFI 更加易用、更多功能、更加方便。
加上UEFI本身的开发语言已经从汇编转变成 C 语言,高级语言的加入让厂商深度开发UEFI变为可能。
Legacy BIOS 在读取磁盘时,每次只能读 64KB,非常低效,而 UEFI 每次可读 1MB,载入更快,此外,win8/win10
更是进一步优化了 UEFI 的支持,号称可以实现瞬时开机。
UEFI 和 BIOS 的区别
BIOS 方式在启动操作系统前,必须从硬盘上指定扇区读取系统启动代码(包含在主引导记录中),然后从活动分区中引导操作系统。
而 UEFI 已经具备文件系统的支持,能够直接读取 FAT 分区中的文件。
对扇区的操作远比不上对分区中文件的操作更直观更简单。
实战
光说不练假把式,下面我们就来实战一把,感受下 UEFI 的启动方式。
大致流程是,我们把 PC 设置为 UEFI 启动方式,优先从 U 盘启动,而 U 盘又被我们事先格式化为 FAT32 格式,里面存放有我们的 UEFI 应用程序。
最终就是 UEFI 固件,将我们编写的 UEFI 应用程序给启动起来。
源码
main.c
struct EFI_SYSTEM_TABLE {
char _buf[60];
struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL {
unsigned long long _buf;
unsigned long long (\*OutputString)(
struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL \*This,
unsigned short \*String);
unsigned long long _buf2[4];
unsigned long long (\*ClearScreen)(
struct EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL \*This);
} \*ConOut;
};
void efi\_main(void \*ImageHandle __attribute__ ((unused)),
struct EFI_SYSTEM_TABLE \*SystemTable)
{
SystemTable->ConOut->ClearScreen(SystemTable->ConOut);
SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Hello UEFI!\n");
while (1);
}
编译
$ x86_64-w64-mingw32-gcc -Wall -Wextra -e efi_main -nostdinc -nostdlib -fno-builtin -Wl,--subsystem,10 -o main.efi main.c
### 给大家的福利
**零基础入门**
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

因篇幅有限,仅展示部分资料
详情docs.qq.com/doc/DSlhRRFFyU2pVZGhS