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

2024-06-07 05:18

本文主要是介绍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;.......

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

这篇关于UEFI原理与编程实践--UEFI驱动模型之显卡(UEFI方向)驱动分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1038262

相关文章

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

Java集成Onlyoffice的示例代码及场景分析

《Java集成Onlyoffice的示例代码及场景分析》:本文主要介绍Java集成Onlyoffice的示例代码及场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 需求场景:实现文档的在线编辑,团队协作总结:两个接口 + 前端页面 + 配置项接口1:一个接口,将o

qtcreater配置opencv遇到的坑及实践记录

《qtcreater配置opencv遇到的坑及实践记录》我配置opencv不管是按照网上的教程还是deepseek发现都有些问题,下面是我的配置方法以及实践成功的心得,感兴趣的朋友跟随小编一起看看吧... 目录电脑环境下载环境变量配置qmake加入外部库测试配置我配置opencv不管是按照网上的教程还是de

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File

电脑系统Hosts文件原理和应用分享

《电脑系统Hosts文件原理和应用分享》Hosts是一个没有扩展名的系统文件,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应... Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应

Dubbo之SPI机制的实现原理和优势分析

《Dubbo之SPI机制的实现原理和优势分析》:本文主要介绍Dubbo之SPI机制的实现原理和优势,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Dubbo中SPI机制的实现原理和优势JDK 中的 SPI 机制解析Dubbo 中的 SPI 机制解析总结Dubbo中

C#继承之里氏替换原则分析

《C#继承之里氏替换原则分析》:本文主要介绍C#继承之里氏替换原则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#里氏替换原则一.概念二.语法表现三.类型检查与转换总结C#里氏替换原则一.概念里氏替换原则是面向对象设计的基本原则之一:核心思想:所有引py

Vue 2 项目中配置 Tailwind CSS 和 Font Awesome 的最佳实践举例

《Vue2项目中配置TailwindCSS和FontAwesome的最佳实践举例》:本文主要介绍Vue2项目中配置TailwindCSS和FontAwesome的最... 目录vue 2 项目中配置 Tailwind css 和 Font Awesome 的最佳实践一、Tailwind CSS 配置1. 安

MyBatis分页插件PageHelper深度解析与实践指南

《MyBatis分页插件PageHelper深度解析与实践指南》在数据库操作中,分页查询是最常见的需求之一,传统的分页方式通常有两种内存分页和SQL分页,MyBatis作为优秀的ORM框架,本身并未提... 目录1. 为什么需要分页插件?2. PageHelper简介3. PageHelper集成与配置3.