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内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

Golang的CSP模型简介(最新推荐)

《Golang的CSP模型简介(最新推荐)》Golang采用了CSP(CommunicatingSequentialProcesses,通信顺序进程)并发模型,通过goroutine和channe... 目录前言一、介绍1. 什么是 CSP 模型2. Goroutine3. Channel4. Channe

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

四种简单方法 轻松进入电脑主板 BIOS 或 UEFI 固件设置

《四种简单方法轻松进入电脑主板BIOS或UEFI固件设置》设置BIOS/UEFI是计算机维护和管理中的一项重要任务,它允许用户配置计算机的启动选项、硬件设置和其他关键参数,该怎么进入呢?下面... 随着计算机技术的发展,大多数主流 PC 和笔记本已经从传统 BIOS 转向了 UEFI 固件。很多时候,我们也

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Linux中Curl参数详解实践应用

《Linux中Curl参数详解实践应用》在现代网络开发和运维工作中,curl命令是一个不可或缺的工具,它是一个利用URL语法在命令行下工作的文件传输工具,支持多种协议,如HTTP、HTTPS、FTP等... 目录引言一、基础请求参数1. -X 或 --request2. -d 或 --data3. -H 或

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

Docker集成CI/CD的项目实践

《Docker集成CI/CD的项目实践》本文主要介绍了Docker集成CI/CD的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录一、引言1.1 什么是 CI/CD?1.2 docker 在 CI/CD 中的作用二、Docke