您的位置:首页 > 文旅 > 美景 > UEFI学习笔记(六):EDK II 模块:Libraries,DriversApplication

UEFI学习笔记(六):EDK II 模块:Libraries,DriversApplication

2024/12/23 15:51:08 来源:https://blog.csdn.net/qq_44189622/article/details/142139989  浏览:    关键词:UEFI学习笔记(六):EDK II 模块:Libraries,DriversApplication

UEFI学习笔记(六):EDK II Modules:Libraries,Application&Drivers

  • 一、模块(Modules)的概念
    • 1、Library模块
    • 2、Application模块
    • 3、Driver模块
    • 4、Application和Driver的区别
  • 二、EDK II 实现UEFI Application
      • 1)HelloWorld.inf
      • 2)HelloWorld.c
  • 三、EDK II 实现UEFI Driver
      • 1)MyDriver.inf
      • 2)MyDriver.c

一、模块(Modules)的概念

模块是一个最小的可编译单元,在放在Package里面的(Package是EDK II 最小的对外发布的单元)。模块包括LibraryDriverApplication等类型。每一个模块都有一个INF文件。

1、Library模块

Library和Library之间可以互相依赖。

[LibraryClasses.common]## <LibraryClassName>|<LibraryInstancePathToInf/Name.inf>DebugLib|MdePkg/Library/BaseDebugLibNull/BaseDebugLibNull.inf

(p.s. 可以用Doxygen根据代码生成CHM文件,方便查找Libary的功能)
MdePkg(Specs) —>SerialPort(Class)—>DebugLibSerialPort(Instance)—>DebugLib

LibraryClass应的是头文件, Library Intance对应的是一个模块(INF)
LibraryClass主要在include/Library/目录下面找,Libray Instance主要在Libary目录下找

2、Application模块

作用: 调试device、平台分析、工具开发、显示变量、显示设备等

(os loader 是一种特殊的application,执行完成后不会return或者exit,相反会调用EFI boot service gBS->ExitBootServices()来将控制权从fireware 传递给os)

3、Driver模块

Driver可以依赖Library,Driver可以生产protocols,主要用于支持硬件。

4、Application和Driver的区别

Application相当于是一次性的,一执行完就结束,而Driver是一直存在的。App是被UEFI loader加载的,不会装protocols。

二、EDK II 实现UEFI Application

实现一个简单的HelloWorld应用程序

1)HelloWorld.inf

[Defines]INF_VERSION = 0x00010005BASE_NAME = HelloWorldFILE_GUID = 67A6DE6D-XXXX-XXXX-XXXX-XXXXXXXXXXXXMODULE_TYPE = UEFI_APPLICATIONVERSION_STRING = 1.0ENTRY_POINT = HelloWorldEntry[Sources]HelloWorld.c[Packages]MdePkg/MdePkg.dec[LibraryClasses]UefiApplicationEntryPointUefiLib[Guids][Ppis][Protocols]

2)HelloWorld.c

#include <Uefi.h>
#include <Library/UefiApplicationEntryPoint.h>
#include <Library/UefiLib.h>EFI_STATUS
EFIAPI
HelloWorldEntry(IN EFI_HANDLE        ImageHandle,IN EFI_SYSTEM_TABLE  *SystemTable
)
{Print (L" HelloWorld!\n");return EFI_SUCCESS;
}

三、EDK II 实现UEFI Driver

1)MyDriver.inf

实现一个简单的MyDriver驱动

[Defines]INF_VERSION = 0x00010005BASE_NAME = MyDriverFILE_GUID = XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXMODULE_TYPE = UEFI_DRIVERVERSION_STRING = 1.0ENTRY_POINT = MyDriverEntry[Sources]MyDriver.c[Packages]MdePkg/MdePkg.dec[LibraryClasses]UefiApplicationEntryPoint[Guids][Ppis][Protocols]

2)MyDriver.c

#include <Uefi.h>
#include <Library/UefiApplicationEntryPoint.h>EFI_STATUS
EFIAPI
MyDriverEntry(IN EFI_HANDLE        ImageHandle,IN EFI_SYSTEM_TABLE  *SystemTable
)
{//在此实现内容return EFI_SUCCESS;
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com