EFI Driver Model(上)

主要参考UEFI_SPEC,再加上自己的理解总结

1、Driver 与Application 的区别

   Application :可以被Boot Manager和其它UEFI应用加载,要加载UEFI应用程序,固件分配足够的内存来保存映像,将UEFI应用程序映像中的部分复制到分配的内存。一旦完成,所分配的内存将被设置为针对图像的代码和数据的适当类型。然后,控件被转移到UEFI应用程序的入口点。当应用程序从其入口点返回时,或当它调用引导服务EFI_BOOT_SERVICES.exit()后,UEFI应用程序从内存中卸载,控件返回到加载UEFI应用程序的UEFI组件。
  Drivers:由引导管理器、符合本规范的固件或其他UEFI应用程序加载。要加载UEFI驱动程序,固件分配足够的内存来保存映像,将UEFI驱动程序映像中的部分复制到分配的内存,并应用所需的重定位修复。一旦完成,所分配的内存将被设置为针对图像的代码和数据的适当类型。如果UEFI驱动程序返回EFI_SUCCESS的状态代码,则不会从内存中卸载。如果UEFI驱动程序的返回代码是一个错误状态代码,则该驱动程序将从内存中卸载。

2、EFI驱动模型目标

  UEFI驱动程序模型被设计为通用的,可以适用于任何类型的总线或设备。UEFI规范描述了如何编写PCI总线驱动程序、PCI设备驱动程序、USB总线驱动程序、USB设备驱动程序和SCSI驱动程序。提供了其他细节,允许UEFI驱动程序存储在PCI选项ROM中,同时保持与遗留选项ROM映像的兼容性
  • 不需依赖Dependency来决定执行顺序
  • 必须可以被重复执行 (ex.FAT, USBKBD)
  • 不需要实时启动 (ex.USBKBD)
  • 支持硬件的热插拔(Hot-Plug) (ex.USBKBD)
  • 支持软件的热插拔(Unload) (Unload Driver)
  • 所有的Function都是Device(Handle)结合Driver(Protocol)所达成

3、EFI驱动模型

3.1 Legacy Option ROM Issues

  Legacy Rom有许多限制和限制,这些限制限制了平台设计者和适配器供应商的创新。为了改进传统rom,
  •UEFI驱动程序模型的设计注意事项:
  • 驱动程序需要平面内存模式,系统可以完全访问组件。
 . •驱动程序需要用C语编写,以便它们可以在处理器架构之间进行可移植。
 . •驱动程序可以编译成虚拟机可执行文件,允许单个二进制驱动程序在使用不同处理器架构的机器上工作。

3.2 驱动初始化

  驱动程序映像的文件必须从某种类型的媒体中加载。这可能包括ROM、闪存、硬盘驱动器、软盘驱动器、CD-ROM,甚至是网络连接。一旦找到了驱动程序映像,就可以通过引导服务EFI_BOOT_SERVICES.LoadImage().将其加载到系统内存中。驱动程序的句柄被创建,并在该句柄上放置一个已加载的图像协议实例。此时,驱动程序存在内存中等待被启动。通过EFI_BOOT_SERVICES.StartImage()启动Image.

3.3Host Bus Controllers

  驱动程序不允许触摸驱动程序入口点中的任何硬件.因此,驱动程序将被加载并启动,但它们都将等待被告知管理系统中的一个或多个控制器。一个平台组件,如Boot Manager,负责管理驱动程序与控制器的连接.然而,在建立第一个连接之前,必须有一些初始的控制器集合供驱动程序管理。这个控制器集合称为主机总线控制器.主机总线控制器提供的I/O抽象是由UEFI驱动程序模型范围之外的固件组件产生的。例如,一个PCI主机总线控制器支持一个或多个由PCI根桥I/O协议抽象出来的PCI根桥。
  • 管理部分 Core Chipset
  • 直接操作硬件
  • 创建一个或多个 Root Bridge Handles
  • Produces Root Bridge I/O Protocols
  • Installed onto new Root a Bridge Handles

3.4 Device Drivers

  设备驱动程序不允许创建任何新的设备句柄。相反,它会在现有的设备句柄上安装其他的协议接口。最常见的设备驱动程序类型将I/O抽象附加到总线驱动程序创建的设备句柄。一些示例I/O抽象将包括简单文本输出、简单输入、块I/O和简单网络协议。连接设备句柄的设备驱动程序必须在其自己的映像句柄上安装了驱动程序绑定协议.。

  • Initialize
    • 安装DriverBindingProtocols到DXE Core
      -+ Support
      -+ Start
      -+ Stop
  • Support
    • 询问是否可以支持传入的Handle
  • Start
    • 连接Driver与Handle
  • Stop
    • 断开Driver跟Handle之间的连结

3.5 Bus Drivers

  从UEFI驱动程序模型的角度来看,总线驱动程序和设备驱动程序实际上是相同的。唯一的区别是,总线驱动程序为总线驱动程序在其总线上发现的子控制器创建了新的设备句柄。因此,总线驱动程序比设备驱动程序稍微复杂一些,但这反过来又简化了设备驱动程序的设计和实现.总线驱动主要有两种类型。第一个是在第一次调用Start()时为所有子控制器创建句柄。另一种类型Start()创建多个调用创建子控制器的句柄。
  • 管理或枚举总线控制器
  • Start() 创建一个或多个 Child Handles
  • Start() Produces Bus Specific I/O Protocols • Installed onto the Bus’s Child Handles

3.6 Platform Components

  在UEFI驱动程序模型下,连接和切断驱动程序与平台控制器的行为受平台固件的控制。这通常将作为UEFI引导管理器的一部分来实现,但也可以实现其他实现.启动服务EFI_BOOT_SERVICES.ConnectController() 和
EFI_BOOT_SERVICES.DisconnectController()可以被平台固件用来确定哪些控制器启动,哪些不启动。

3.7 热插拔事件

  以前系统固件不需要处理预启动环境中的热插拔事件,然而,随着像USB这样的总线的出现,终端用户可以在任何时候添加和删除设备,确保能够在UEFI驱动程序模型中描述这些类型的总线是很重要的。总线驱动程序支持热添加和删除设备,从而为此类事件提供支持。例如,当键盘被热添加到平台上的USB总线时,最终用户会期望键盘处于活动状态。USB总线驱动程序可以检测到热添加事件,并为键盘设备创建一个子句柄.但是,只有当EFI_BOOT_SERVICES.ConnectController()被调用,驱动连接到控制器,键盘才能变成活跃设备。使用EFI_BOOT_SERVICES.DisconnectController() 断开控制器,删除热插拔。

3.8 EFI Services Binding

  UEFI驱动程序模型可以很好地映射到硬件设备、硬件总线控制器和叠加在硬件设备之上的软件服务的简单组合上。
EFI – Start

EFI_STATUS
SataControllerStart ( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath ) { EFI_STATUS Status; EFI_PCI_IO_PROTOCOL *PciIo; EFI_SATA_CONTROLLER_PRIVATE_DATA *SataPrivateData; Status = gBS->OpenProtocol ( Controller, &gEfiPciIoProtocolGuid, (VOID **)&PciIo, This->DriverBindingHandle,Controller, EFI_OPEN_PROTOCOL_BY_DRIVER); //// Allocate SATA private data structure //Status = gBS->AllocatePool ( EfiBootServicesData, sizeof (EFI_SATA_CONTROLLER_PRIVATE_DATA), (VOID**)&SataPrivateData );if (EFI_ERROR(Status)) { return EFI_OUT_OF_RESOURCES;}//// Initialize SATA private data //EfiZeroMem (SataPrivateData, sizeof(EFI_SATA_CONTROLLER_PRIVATE_DATA)); SataPrivateData->Signature = SATA_CONTROLLER_SIGNATURE; SataPrivateData->PciIo = PciIo;SataPrivateData->IdeInit.GetChannelInfo = IdeInitGetChannelInfo; SataPrivateData->IdeInit.NotifyPhase = IdeInitNotifyPhase;SataPrivateData->IdeInit.SubmitData = IdeInitSubmitData; SataPrivateData->IdeInit.DisqualifyMode = IdeInitDisqualifyMode;SataPrivateData->IdeInit.CalculateMode = IdeInitCalculateMode;SataPrivateData->IdeInit.SetTiming = IdeInitSetTiming;SataPrivateData->IdeInit.EnumAll = ICH_SATA_ENUMER_ALL; SataPrivateData->IdeInit.ChannelCount = ICH_SATA_MAX_CHANNEL; //// Enable SATA controller working in appropriate mode //Status = EnableSataController (PciIo);if (EFI_ERROR(Status)) { return EFI_DEVICE_ERROR; }//// Install IDE_CONTROLLER_INIT protocol & private data to this instance //Status = gBS->InstallMultipleProtocolInterfaces (&Controller, &gSataControllerDriverGuid,SataPrivateData, &gEfiIdeControllerInitGuid, &(SataPrivateData->IdeInit), NULL );

EFI – STOP

EFI_STATUS
SataControllerStop (IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN UINTN NumberOfChildren, IN EFI_HANDLE *ChildHandleBuffer ) { EFI_STATUS Status; EFI_SATA_CONTROLLER_PRIVATE_DATA *SataPrivateData; Status = gBS->OpenProtocol ( // Open Protocol and Get Private Data Controller, &gSataControllerDriverGuid, (VOID**)&SataPrivateData, This->DriverBindingHandle, Controller, EFI_OPEN_PROTOCOL_GET_PROTOCOL ); ASSERT_EFI_ERROR (Status);Status = gBS->CloseProtocol ( // Close Protocol Controller, &gEfiPciIoProtocolGuid, This->DriverBindingHandle, Controller ); gBS->UninstallMultipleProtocolInterfaces ( // Uninstall Protocol Controller, &gSataControllerDriverGuid, SataPrivateData, &gEfiIdeControllerInitGuid, &(SataPrivateData->IdeInit), NULL ); gBS->FreePool (SataPrivateData); // Free Private Data

EFI Driver Model(上)相关推荐

  1. UEFI Drivers UEFI Driver Model

     1. UEFI Drivers UEFI Drivers是UEFI Image的一种,UEFI Drivers与UEFI Applications的区别: Objects managed by UE ...

  2. New Linux2.6 I2C Driver Model Example

    闲话不说,先给出完整的示例代码,加好注释,后面再进一步解释. // //  COPYRIGHT NOTICE //  Copyright (c) 2012, 华中科技大学 卢俊(版权声明) //  A ...

  3. EF从数据库更新模型时保留Model上的属性设定

    使用EF框架从数据库产生实体类模型后,我们可以向这些数据模型添加数据注释,以指定验证要求及显示格式.如果不希望数据库发生更改,则直接将验证属性添加到模型类会起作用;但是,如果数据库发生更改,并且需要重 ...

  4. Linux设备驱动模型概述(Linux device driver model overview)

    平台(platform)设备和平台驱动是连接到平台总线(bus)的linux驱动模型接口,总线将设备和驱动绑定,这个伪总线(platform bus)以最小的基础结构被用来连接设备到总线上.在系统每注 ...

  5. gpt efi win7 linux,在EFI+GPT硬盘上利用grub2实现Linux/Win7/win8等多重启动

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 接上文啊,本人电脑,Lenovo Y410P的笔记本,主板UEFI+GPT硬盘,预装的Windows 8,至于如何安装Linux,请参见空间其他文章,里面 ...

  6. EDK2设备驱动模型

    UEFI设备驱动模型 1. UEFI Drivers UEFI Drivers是UEFI Image的一种,UEFI Drivers与UEFI Applications的区别: Objects man ...

  7. BIOS的BDS阶段解析

    1.概述 BDS全称:Boot Dev Select(启动设备选择) 主要功能是加载并连接驱动程序,管理并启动引导项.在引导操作系统之前会初始化设备(USB键盘鼠标,VGA设备等),然后通过Varia ...

  8. UEFI Build file

    Mouble 一个模块,有.inf的文件编译 Package 有0个或许多个Mouble组成,有.dsc和.dec文件 Platform 一个特殊的Package文件一定包含一个.dec文件EDK I ...

  9. 关于EFI的一点介绍

    本文主要分为如下几个部分: 1, EFI Overview :主要从整体上去描述一下什么是EFI.以及应用EFI对我们可能带来的好处. 2, Framework : 从原理,架构等几个方面重点介绍了E ...

  10. VC++获取屏幕大小第二篇 物理大小GetDeviceCaps 上

    上一篇< VC++获取屏幕大小第一篇像素大小GetSystemMetrics >中介绍了使用GetSystemMetrics函数来获取屏幕的像素大小,本篇将介绍使用GetDeviceCap ...

最新文章

  1. 线下门店场景化互动类产品浅析
  2. Mysql当前模式让不记录日志_终于有人把MySQL 三大日志讲清楚了
  3. 阿里云Redis混合存储典型场景:如何轻松搭建视频直播间系统
  4. 中国电信天翼云进入4.0阶段,打造一朵无处不在的分布式云
  5. 模糊匹配查询_必须掌握的6个查询函数应用技巧,办公必备,收藏备用!
  6. 转——深度学习之BN算法(Batch Normailization)
  7. 《AIOps在360的落地实践》分享实录
  8. android 打开SD卡文件夹,并获得选中文件的路径怎么实现?
  9. 第三回 基类中的方法,应该根据实际情况,虚的虚,抽象的抽象!
  10. 【Jmeter自学】Linux环境下Jmeter运行
  11. 《深入理解Java虚拟机:JVM高级特性与最佳实践》 (第3版)周志明 著
  12. 凹凸性和Jensen不等式
  13. VOC2007-2012数据集
  14. python从键盘输入一个数、计算出大于n的最小素数_请问,可以帮忙做下这个题吗?--从键盘输入一个数,求大于该数的最小素数....
  15. [渝粤教育] 西南交通大学 土木工程试验与量测技术 参考 资料
  16. 为什么要研究游戏AI呢?
  17. 微信小程序直播有哪些推广技巧?
  18. ABAP 新特性 - COND SWITCH 操作符
  19. Unsupervised Domain Adaption of Object Detectors : A Survey
  20. Java的Random练习~~生成1~n之间的随机数

热门文章

  1. 西安交通大学电子图书站点被黑
  2. eclipse中格式自动调整的问题
  3. android 打apk文件怎么打开方式,apk文件怎么打开,详细教您打开apk文件的方法
  4. 解决 VMware 无法复制粘贴问题
  5. DiskGenius格式化磁盘、U盘
  6. 谈业务流程全生命周期管理支撑业务流程再造(2)
  7. 深耕教学 常研常新——海门市高二历史教研活动掠影
  8. 《空间分析》——思维导图
  9. play商店 小米_小米应用商店和Google Play商店的简单对比
  10. 百度 linux格式c盘指令,Dos指令直接将gho文件还原到C盘的指令怎么写