uefi怎么用u盘启动安装windows

uefi怎么用u盘启动安装windows,第1张

UEFI 模式下安装Windows 7 *** 作系统(暂不涉及Linux等其它 *** 作系统):\x0d\1、硬盘必须是GPT格式,系统必须是64位,UEFI不支持32位系统。\x0d\备注:严谨地说,UEFI也可以引导MBR磁盘上的x64系统,但要做特殊设置。这里所说的是一般情况。\x0d\2、传统的MBR分区只支持到22T硬盘,大于22T的硬盘需要用到GPT,不然就浪费了;支持UEFI启动的微软 *** 作系统:windows Vista Sp1以后的所有64位系统。\x0d\3、安装要求:安装介质必须以UEFI方式启动电脑。切切!很多人死在这一步。如果像以前那样启动安装程序,就会出现无法安装到GPT分区的错误提示,从而造成安装失败。\x0d\4、安装介质:光盘、U盘、移动硬盘。\x0d\①光盘:只需要注意一点,以UEFI方式启动电脑。\x0d\②U盘、移动硬盘:存放安装文件的分区必须是FAT或者FAT32分区,不能是NTFS分区。因为UEFI不认识NTFS分区。\x0d\③Windows8原生支持UEFI,没问题。Windows7不一样,如果是U盘或移动硬盘安装,需要添加UEFI支持文件,否则不能以UEFI方式启动。\x0d\5、技术难点:如何“以UEFI方式启动电脑”?\x0d\①BIOS中打开UEFI模式。\x0d\②安装介质支持UEFI启动。\x0d\③Windows7及其以前的系统,用U盘或移动硬盘安装时,添加UEFI支持文件的方法:\x0d\从Windows8的安装文件中提取Bootmgfwefi文件,重命名为BOOTX64EFI,拷贝到win7安装文件的\EFI\Boot\下,没有BOOT文件夹新建一个。\x0d\Bootmgfwefi也可以从已经安装好的Win8系统获得。\x0d\④符合前两个条件时,启动菜单会出现以“UEFI”标识的U盘或移动硬盘启动项,选这一项,才会“以UEFI方式启动电脑”!电脑不同,此项稍有差异。\x0d\红框中的两个启动项,其实是同一个U盘。要选择下边那个有“UEFI”标识的项。\x0d\接下来就和原来安装系统基本一样了。\x0d\另一种方法(针对Windows7及其以前的 *** 作系统)\x0d\1、从Windows8的安装文件中提取Shellefi和Bootmgfwefi文件,拷贝到安装文件所在分区的根目录。下图为U盘文件结构:\x0d\2、以UEFI方式启动电脑,会进入UEFI Shell界面。(有的电脑BIOS中,可以选择“Launch EFI shell from filesystem device”启动电脑)。\x0d\3、进入UEFI Shell界面后,在 shell> 提示符后输入命令,即可启动windows安装程序。如下:\x0d\shell>fs0 回车,会进入系统认到的第一个磁盘分区\x0d\fs0:>ls 回车,会列出这个磁盘分区的所有文件和文件夹\x0d\如果看到了你刚才复制的Bootmgfwefi和Shellefi文件,说明这就是安装文件所在分区,接着:\x0d\fs0:>bootmgfwefi 回车,熟悉的windows安装界面就出现了。接下来和原来安装系统一样。\x0d\注意:如果FS0不是安装文件所在分区,就接着查看FS1、FS2、FS3\x0d\ (安装文件所在分区是FS1,不是FS0):\x0d\重要:关于BIOS设置\x0d\①打开BIOS中的UEFI支持。\x0d\把“Boot mode”项设为“UEFI only”;如果有“Lunch CSM”选项,将其设为“Enabled”。\x0d\②关闭安全引导。\x0d\进入“Security”——“Secure Boot”,将其设为“Disabled”。这是Windows8新引入的安全机制,不关闭不能安装其它 *** 作系统。

1,按EDK推荐,相应的子模块放到相应的文件夹中,所以新建文件夹hello,里面放入helloc和helloinf,结构如下:

“C:\MyWorkSpace\MdeModulePkg\Application\hello\helloc”

“C:\MyWorkSpace\MdeModulePkg\Application\hello\helloinf”

2,记事本打开”C:\MyWorkSpace\Nt32Pkg\Nt32Pkgdsc”,在 [Components] 下,加入一句:

MdeModulePkg/Application/hello/helloinf

//相当于Visual_studio在sln中加入一个proj

3,helloc的代码如下:

#include <Library/UefiApplicationEntryPointh>

#include <Library/UefiLibh>

EFI_STATUS

EFIAPI

UefiMain

(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE SystemTable)

{

SystemTable->ConOut->OutputStri

[TOC]

系统表是重要的数据接口之一,是用户空间通往内核空间的通道。

(1)在应用程序和驱动中访问系统表

系统表是 UEFI 内核的一个全局结构体,其指针作为程序映像入口函数的参数传递到用户空间。程序映像(包括 UEFI 应用程序、DXE 驱动程序、UEFI 驱动程序)的入口函数有统一的格式,函数原型如下:

(2)系统表指针从内核传递到用户空间的过程

程序映像的入口函数通常是 _ModuleEntryPoint。当应用程序或驱动加载到内存形成 Image 后,_ModuleEntryPoint 函数地址被赋值给 Image 对象的 EntryPoint,然后 Image->EntryPoint 会被执行,最终会从 Image 的入口函数 _ModuleEntryPoint 执行到模块的入口函数。

系统表可分为以下6个部分

系统表数据结构:

UEFI 中的表通常都以 EFI_TABLE_HEADER 开头,数据结构如下:

这三个控制台设备以及 ConIn、ConOut、StdErr 三个 Protocol 在驱动 ConSplitterDxe 中被初始化。

ConfigurationTable 是系统配置表,指向 EFI_CONFIGUTATION_TABLE 数组,数组中每一项是一个表,这个表的数据结构如下:

在 UEFI 中只有一个地址空间,所有程序都运行在 RING0 优先级,应用程序地址空间(用户空间)占用 UEFI 地址空间的一部分。

系统表的地址可以通过模块的入口函数的参数得到。示例:

上面示例中的模块入口函数 UefiMain 中使用传入的参数 SystemTable 访问系统表。EDK2 为了方便开发者,提供了 UefiBootServicesTableLib,在 UefiLib 定义了全局变量 gST

、gBS、gImageHandle。这三个全局变量在函数 UefiBootServicesTableLibConstructor 中被初始化,该函数是库 UefiBootServicesTableLib 的构造函数,在 AutoGenc 中的 ProcessLibraryConstructorList 被调用,而 ProcessLibraryConstructorList 是在 UefiMain 之前被调用的。

构造函数 UefiBootServicesTableLibConstructor 源码:

gST 变量是定义在用户空间的变量,而它指向的系统表定义在 UEFI 内核中。在应用程序或驱动工程文件的 [LibraryClasses] 里引用 UefiBootServicesTableLib 后,就可以使用 gST 访问系统表了。示例:

其实就是使用 gST 和 gBS 替换掉 SystemTable 和 SystemTable->BootServices。

启动服务是 UEFI 的核心数据结构,可以分为以下几类:UEFI 事件服务、内存管理服务、Protocol 管理服务、Protocol 使用类服务、驱动管理服务、Image 管理服务、ExitBootServices、其他服务。

启动服务由 UEFI 表头和表项组成,表中每一项是一个函数指针,该函数用于提供一项服务。

事件是异步 *** 作的基础,使得在 UEFI 系统内可以执行并发 *** 作。UEFI 事件服务包含事件(Event)、定时器(Timer)、任务优先级(TPL)三类服务。

详见第六章。

内存管理服务主要提供内存的分配与释放服务、管理系统内存映射。主要包括:AllocatePages、FreePages、AllocatePool、FreePool、GetMemoryMap。

AllocatePool/FreePool 用法

AllocatePool 和 FreePool 服务函数原型:

枚举类型 EFI_MEMORY_TYPE:

调用 gBS->ExitBootServices 之后, EfiBootServicesCode 和 EfiBootServicesData 类型内存被回收;EfiLoaderCode 和 EfiLoaderData 由 OS Loader 和 *** 作系统决定是否回收;EfiACPIReclaimMemory 类型内存在 APCI 启用后被回收;其他类型内存保留。

AllocatePages/FreePages 用法

内存和驱动开发中经常会要求分配到的内存不得跨页,或需要分配完整的内存页,为此提供了分配页的服务 AllocatePages。

AllocatePages 和 FreePages 服务函数原型:

枚举类型 EFI_AlLOCATE_TYPE

GetMemoryMap 用法

GetMemoryMap 用于取得系统中所有的内存映射。

GetMemoryMap 服务函数原型:

EFI_MEMORY_DESCRIPTOR 数据结构

Protocol 管理服务提供安装与卸载 Protocol 的服务,以及注册 Protocol 通知函书(安装时调用)的服务。

详见第八章、第九章。

Protocol 使用类服务包括 Protocol 的打开与关闭,查找支持 Protocol 的控制器,主要提供 Protocol 使用者使用。

详见第四章。

驱动管理服务包括将驱动安装到控制器的 connect 服务和将驱动从控制器上卸载的 disconnect 服务。

详见第九章。

Image 管理服务包括加载、卸载、启动、退出 UEFI 应用程序或驱动。

启动服务中的 Image 管理服务

ExitBootService 用于结束启动服务,该服务成功返回后,系统进入 RT 期。 *** 作系统加载器从启动服务接过对计算机系统的控制权后必须调用该服务。

启动服务中的其他服务

从进入 DXE 阶段运行时服务被初始化,直到 *** 作系统结束,运行时服务都一直存在并向上层提供服务。运行时服务主要包括:时间服务、读写系统变量、虚拟内存服务、其他服务。

时间服务包括:读取 / 设置硬件事件、读取 / 设置唤醒定时器。

GetTime/SetTime

计算机硬件时钟由单独的电池供电, *** 作系统启动时通过读取硬件时钟获得事件。

GetTime/SetTime 服务函数原型:

时钟性能用 EFI_TIME_CAPABILITIES 表示:

GetWakeupTime/SetWakeupTime

GetWakeupTime 用于读取唤醒定时器的状态,SetWakeupTime 用于启用或禁用唤醒定时器。

GetWakeupTime/SetWakeupTime 服务函数原型:

UEFI 系统变量服务包括:GetVariable、SetVariable、GetNextVariableName。

GetVariable 用法

GetVariable 用于根据变量名获取变量值和属性。

GetVariable 服务函数原型:

SetVariable 用法

SetVariable 有三项功能:新建、更新、删除变量。

SetVariable 服务函数原型:

GetNextVariableName 用法

GetNextVariableName 用于获取下一个系统变量,通过这个服务可以遍历系统中的变量。

GetNextVariableName 服务函数原型:

要启动搜索(获得第一个变量),需要 VariableName 指向空字符串。

虚拟内存服务包括:SetVirtualAddressMap 和 ConvertPointer。这两个服务只有在运行时期间被 *** 作系统加载器调用。

调用流程:

SetVirtualAddressMap/ConvertPointer 服务函数原型:

Address 作为输入参数时是物理地址,作为输出参数时返回对应的虚拟地址。ConvertPointer 通过查询系统的内存映射表计算出给定物理地址的虚拟地址。当 DebugDispositon 设置了 EFI_OPTION_PTR 标志时,输入参数 Address 允许为空。

以上就是关于uefi怎么用u盘启动安装windows全部的内容,包括:uefi怎么用u盘启动安装windows、如何编译第一个uefi程序、第五章 UEFI 的基础服务等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10078236.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存