UEFI原理与编程实践--UEFI驱动模型之显卡(UEFI方向)驱动分析

拆开一台国产电脑,会发现,很多重要芯片,其实已经国产化了,CPU、GPU、电源管理芯片等等,刚做了一下GOP的笔记,回头想想,之前包入厂商的显卡驱动一直没怎么关注他们的运行逻辑是什么,那么,这篇文章就来探讨深入一下,这个显卡驱动是怎么做的

国产显卡,属于前列的当属景嘉微显卡,那么这次就来分析一下JM7200的驱动是怎么做的。

UEFI驱动模型

驱动总的分为两种,一种是符合驱动模型的,一种就是不符合的了,UEFI驱动模型的核心是通过EFI Driver Binding Protocol管理驱动程序。作为一个用户友好的驱动程序,通常它还包含一个EFI Component Name Protocol,在UEFI驱动的入口函数,安装EFI Driver Binding Protocol的位置通常为自身的Handle,这个实例会常驻内存,用于驱动的安装与卸载。直接贴代码是违反保密协议的,所以就用USB的驱动代码来解释了。

UEFI驱动加载过程

UEFI 会调用 gBS->Startimage(..)执行 Driverimage的入口函数,在入口函数里,Driver Binding Protocol被加载到 Handle 上(Driver Imagehandle 或者其他的 Controller Handle),然后 UEFI 会遍历所有的控制器,为每个控制器调用 CoreConnectSingleController 函数,在CoreConnectSingleController 中会调用EDBP的Supported 函数测试这个驱动是否支持该控制器,如果支持,则调用 Start( )安装驱动。

EFI Component Name Protocol 的作用和构成

通常每个驱动都还有一个可打印的名字,便于向用户显示驱动的信息。这个可打印名字是由 EFI Component Name Protocol(ECNP)或 EFI Component Name2 Protocol(ECN2P)提供的。ECNP 和 ECN2P 不是驱动必需的 Protocol,但建议驱动开发者提供这个 Protocol

EFI_STATUS
EFIAPI
UsbBusDriverEntryPoint (
  IN EFI_HANDLE           ImageHandle,
  IN EFI_SYSTEM_TABLE     *SystemTable
  )
{
   EFI_STATUS              Status;

  Status = EfiLibInstallDriverBindingComponentName2 (
           ImageHandle,
           SystemTable,
           &mUsbBusDriverBinding,
           ImageHandle,
           &mUsbBusComponentName,
           &mUsbBusComponentName2
           );
}
ASSERT_EFI_ERROR (Status);

 Status = gBS->InstallMultipleProtocolInterfaces (
                  &ImageHandle,
                  &gEfixxxxxGuid,
                  &xxxxxxx,
                  NULL
                  );
  ASSERT_EFI_ERROR (Status);

return Status;
}

上面的代码就是入口函数的基本操作流程,安装EDBP以及ECNP,然后还会安装所需的protocol,比如显卡驱动自己的protocol。

EDBP有三个函数,咱们就开始进入VideoControllerDriverSupported,对于显卡,它是一个PCI设备,这里就需要用到PciIoProtocol,咱们打开这个protocol,然后获取这个PCI设备的VID与DID,是否符合,如果符合,则开始实现Start服务。

//
  // Open the PCI I/O Protocol
  //
  Status = gBS->OpenProtocol (
                  Controller,
                  &gEfiPciIoProtocolGuid,
                  (VOID **) &PciIo,
                  This->DriverBindingHandle,
                  Controller,
                  EFI_OPEN_PROTOCOL_BY_DRIVER
                  );
  
  if (EFI_ERROR (Status)) 
  {
    return Status;
  }
//
  // Read the PCI Configuration Header from the PCI Device
  //
  Status = PciIo->Pci.Read ( PciIo, EfiPciIoWidthUint32, 0, sizeof (Pci) / sizeof (UINT32), &Pci );


Pci.Hdr.VendorId==?
Pci.Hdr.DeviceId==?

进入Start服务后,一般先进行显卡专有的数据设置与获取,然后就是构建video模块缓冲区了,其实就是设置video的一些相关数据

VideoMode = &JM5400VideoVideoModes[0];
  for (Index = 0; Index < JM5400_VIDEO_MODE_COUNT; Index ++) 
  {
    ModeData->ModeNumber = Index;
    ModeData->HorizontalResolution          = VideoMode->Width;
    ModeData->VerticalResolution            = VideoMode->Height;
    ModeData->ColorDepth                    = VideoMode->ColorDepth;
    ModeData->RefreshRate                   = VideoMode->RefreshRate;
    DEBUG ((EFI_D_INFO, "Adding Video Mode %d: %dx%d, %d-bit, %d Hz\n",
      ModeData->ModeNumber,
      ModeData->HorizontalResolution,
      ModeData->VerticalResolution,
      ModeData->ColorDepth,
      ModeData->RefreshRate
      ));
。。。。。。。

现在数据什么的都有且已经准备好了,那么当然就是图像的构造啦:

 GraphicsOutput            = &Private->GraphicsOutput;
  GraphicsOutput->QueryMode = JM5400VideoGraphicsOutputQueryMode;
  GraphicsOutput->SetMode   = JM5400VideoGraphicsOutputSetMode;
  GraphicsOutput->Blt       = JM5400VideoGraphicsOutputBlt;
 .......

具体内容怎么构造的,这就是核心内容,当然,这一节只是熟悉一下显卡驱动是怎么做的

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: UEFI(Unified Extensible Firmware Interface)是一种固件接口标准,用于用于替换传统的BIOS(Basic Input/Output System)固件,旨在提高系统启动速度、安全性和可靠性。 UEFI原理编程完整版PDF是一份详细的技术指南,提供了UEFI开发所需的全部信息,包括如何设计UEFI驱动程序、应用程序和固件,以及如何使用UEFI的各种功能。 这份PDF文件将UEFI划分为四个主要模块:启动服务、管理服务、硬件抽象层和UEFI Shell。每个模块都有详细的描述和示例代码,此外还包含了UEFI的系统架构、数据结构、驱动程序与应用程序的开发方法等内容。 此外,UEFI原理编程完整版PDF还介绍了UEFI与安全性、多核技术、嵌入式系统等方面的关系,并为读者提供了关键的UefiSpec和UefiDebugTools库文档。 总之,UEFI原理编程完整版PDF是一份权威的技术指南,涵盖了UEFI方方面面的内容,非常适合开发人员和工程师学习和参考。 ### 回答2: UEFI(Unified Extensible Firmware Interface)是一种新型的启动编程接口,它替代了旧版的BIOS(基本输入输出系统)。UEFI原理编程可以帮助开发人员理解UEFI的工作原理编程技巧。 UEFI拥有完善的安全性和可靠性,其编程方式也十分灵活。与BIOS相比,UEFI可以支持更多的硬件平台和更大的硬盘容量,同时也可以优化启动速度和程序的执行效率。 UEFI原理编程pdf完整版可以帮助开发人员更好地了解UEFI的概念和架构,并提供丰富的代码示例,帮助开发人员快速掌握UEFI编程技能。除此之外,该书还介绍了UEFI的启动流程、安全策略、UEFI应用的开发和调试等内容,对于想要深入学习UEFI编程的开发人员来说是一本很有价值的参考书。 总之,UEFI原理编程pdf完整版是一本优秀的技术参考书,其内容涵盖了UEFI的方方面面,对于想要深入了解和运用UEFI的开发人员来说具有很高的参考价值。 ### 回答3: UEFI(Unified Extensible Firmware Interface)是一种新型的系统固件接口,它为操作系统与硬件之间提供了一种标准的接口。相比传统的BIOS,UEFI可以支持更多的硬件功能,同时也更加安全和灵活。 UEFI原理主要包括以下几个方面:1、UEFI接口包括了启动管理器,硬件抽象层,运行环境和应用层等模块;2、UEFI支持模块化设计和驱动加载,可以动态地加载和卸载硬件驱动,提高了系统灵活性和安全性;3、UEFI使用GUID Partition Table(GPT)替代MBR分区表,支持更大的硬盘容量和更稳定的系统启动;4、UEFI还支持Secure Boot功能,可以防止恶意程序篡改启动软件和系统文件,提高了系统安全性。 关于UEFI编程,需要掌握以下几个核心内容:1、UEFI开发环境的搭建,需要熟悉UEFI规范以及系统固件接口的程序编写;2、UEFI应用程序的设计和开发,可以利用UEFI提供的应用程序接口(API)或者开发自定义的应用程序;3、UEFI驱动程序的编写,需要掌握UEFI驱动程序的架构和编程模型;4、UEFI启动管理器的开发,需要熟悉UEFI启动管理器的设计和实现。 总之,UEFI是一种新型的系统固件接口,可以为操作系统和硬件提供一个标准的接口,提高系统的安全性和灵活性。对于UEFI编程的学习和掌握,则需要对UEFI规范和程序设计有深入的了解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值