黑不溜秋的
GPU全栈博主
展开
-
驱动开发系列49 - 搭建 Vulkan 驱动调试环境(编译 mesa 3D)- Ubuntu24.04
10. 对于intel驱动,如想调试 vkCreateInstance 函数,则到Mesa库中找 anv_CreateInstance 方法,设置断点。2. cd mesa-24.2.8 #比如下载的是mesa-24.2.8。1. apt source mesa #下载mesa代码。原创 2025-03-29 08:48:43 · 289 阅读 · 0 评论 -
驱动开发系列48 - Linux 显卡KMD驱动代码分析(九)- 送显过程(扫盲)
在 Linux 图形栈中,从 Framebuffer(帧缓冲)到最终显示在屏幕上的过程涉及多个关键组件。这些组件共同协作,负责图像的存储、处理、合成以及输出,确保图形数据能够正确渲染到显示器上。Framebuffer 是 GPU 内存中的一块区域,存储了像素数据(RGB、YUV等),本质可以理解为一张“图片”,最终会被显示到屏幕上;由用户空间程序(如 Xorg、Wayland)分配创建。在内核中由 drm_framebuffer 结构体管理。原创 2025-03-13 18:32:24 · 504 阅读 · 0 评论 -
驱动开发系列47 - Linux 显卡KMD驱动代码分析(八)- 使用bpftrace 来调试内核驱动
经过前面七节的学习,我们对显卡 KMD(Kernel Mode Driver)驱动的实现有了初步认识,其中未涉及 GPU 内部实现细节(因这些内容通常由 GPU 厂商保密)。接下来的章节将继续深入学习 KMD 显卡驱动的实现。在此之前,先介绍一种强大的显卡内核驱动调试工具——bpftrace,以便更好地了解显卡的内部运行机制。bpftrace是基于 eBPF(Extended Berkeley Packet Filter) 的高级内核跟踪工具,用于分析和调试 Linux 内核及应用程序的行为。原创 2025-03-11 23:47:12 · 215 阅读 · 0 评论 -
驱动开发系列46 - Linux 显卡KMD驱动代码分析(七)- 显存管理
显存管理是图形驱动程序中至关重要的一部分,涉及到从用户空间(UMD,User Mode Driver)到内核空间(KMD,Kernel Mode Driver)的显存分配和管理。本文将首先梳理从一个 OpenGL 应用程序到 UMD,再到 KMD 的显存分配过程,然后介绍 KMD 在显存管理方面的角色和工作原理。原创 2025-03-09 09:07:12 · 153 阅读 · 0 评论 -
驱动开发系列45 - Linux 显卡KMD驱动代码分析(六)- 显卡驱动与OS接口
在显卡驱动中,为了实现与操作系统内核功能的解耦和抽象,通常会采用一套专门的接口层。显卡驱动所有其他模块在调用与内核交互的底层功能时,都通过这个接口进行调用,而不用直接依赖具体的内核实现。本文介绍下一般驱动程序都需要哪些操作系统的接口。延时与计时接口在操作系统中,精确的延时和计时是保证硬件操作同步的重要手段。接口层中提供了诸如mdelayudelaymsleep等延时函数,它们分别实现毫秒级和微秒级的延时操作,而计时函数则利用 CPU 的时间戳计数器(如和rdtscll)来获取高精度的时间基准。原创 2025-03-08 18:41:01 · 273 阅读 · 0 评论 -
驱动开发系列44 - Linux 显卡KMD驱动代码分析(五)- GPU和CPU的任务同步
在 GPU 的执行过程中,GPU 与 CPU 之间的同步非常关键,特别是在异步执行的场景中,GPU 需要完成某些任务(如渲染、计算)后,CPU 才能接收结果或进行后续操作。Linux 提供了一种Fence用于实现 GPU 与 CPU 或 GPU 之间同步的机制,特别适用于异步执行环境。原创 2025-03-06 23:17:17 · 182 阅读 · 0 评论 -
驱动开发系列43 - Linux 显卡KMD驱动代码分析(四)- DRM设备操作
DRM(Direct Rendering Manager)是Linux内核中的一个子系统,主要负责图形硬件的管理与图形渲染的加速。它为图形驱动提供了一个统一的接口,可以使用户空间程序与图形硬件进行直接交互,而无需通过X服务器或Wayland等显示管理器。DRM不仅用于管理显卡,还处理视频输出、显示缓冲区管理和硬件加速渲染等任务。在Linux内核中,所有与图形硬件相关的操作都是通过DRM来完成的,这包括显卡的初始化、驱动加载、上下文切换、内存分配、缓冲区管理等功能。原创 2025-03-05 23:19:18 · 378 阅读 · 0 评论 -
驱动开发系列42 - Linux 显卡KMD驱动代码分析(三) - 中断注册和读写PCI设备配置信息
中断是一种计算机硬件机制,允许设备(GPU)向CPU发出信号,表示它需要CPU的注意。中断可以提高系统相应速度,避免CPU轮询等待设备状态。在Linux中将中断抽象为IRQ(中断硬件请求),用中断号(IRQ Number)标识每个中断源。当设备发送中断时,CPU进入中断上下文,暂停当前任务,执行中断处理程序,完成设备状态处理。返回原任务或调度新任务。原创 2025-03-04 22:32:43 · 281 阅读 · 0 评论 -
驱动开发系列41 - Linux 显卡KMD驱动代码分析(二) - 设备电源管理
Linux的电源管理(Power Management),主要用于优化设备功耗,在保证系统稳定性的同时,降低能耗,提升续航。本文将介绍下显卡设备的电源管理。Linux的电源管理主要包含系统电源管理(System Power Management)和运行时电源管理(Runtime Power Management)两个部分。系统电源管理控制整个系统的电源状态,影响所有设备的运行,典型状态有S3(Suspend-to-RAM),S4(Hibernate);原创 2025-03-03 21:12:50 · 377 阅读 · 0 评论 -
驱动开发系列40 - Linux 显卡KMD驱动代码分析(一) - 设备初始化过程
显卡内核态驱动(KMD)负责与GPU硬件直接交互,提供底层接口、管理显存、任务调度、硬件初始化等功能,KMD运行在内核态,通常做为Linux内核模块运行;本文介绍下显卡设备初始化过程。原创 2025-03-01 15:50:51 · 302 阅读 · 0 评论 -
驱动开发系列39 - Linux Graphics 3D 绘制流程(二)- 设置渲染管线
Intel 的 Iris 驱动是 Mesa 中的 Gallium 驱动,主要用于 Intel Gen8+ GPU(Broadwell 及更新架构)。它负责与 i915 内核 DRM 驱动交互,并通过 Vulkan(ANV)、OpenGL(Iris Gallium)、或 OpenCL(Clover)来提供 3D 加速。在 Iris 驱动中,GPU Pipeline 设置 涉及多个部分,包括 编译和上传着色器、设置渲染目标、绑定缓冲区、配置固定功能单元 等。原创 2025-02-23 22:50:37 · 247 阅读 · 0 评论 -
驱动开发系列38 - Linux Graphics 3D 绘制流程(一)- 创建画布
当应用程序创建 OpenGL 上下文时,它通常需要申请帧缓冲(Framebuffer)。在 X11 体系下,应用程序不会直接向内核的 DRM 模块请求创建帧缓冲,而是通过 X 服务器进行申请。虽然从技术上讲,应用程序可以直接使用 DRM 接口创建帧缓冲对象(BO),但为了将其与 X 窗口系统管理的窗口进行关联,应用程序仍然需要通过 GLX 或 EGL 进行间接交互,让 X 服务器管理这些缓冲区。这使得 X 服务器能够掌握窗口的帧缓冲信息,并在需要时将其内容显示到屏幕上。原创 2025-02-16 22:00:06 · 192 阅读 · 0 评论 -
驱动开发系列37 - Linux Graphics 2D 绘制流程(二)- 画布创建和窗口关联
前面介绍Pixmap表示一块画布,是绘制发生的地方,本节看看驱动程序如何为画布分配内存/显存,以及如何与窗口关联的。原创 2025-02-16 11:23:56 · 390 阅读 · 0 评论 -
驱动开发系列36 - Linux Graphics 2D 绘制流程(一)- 画笔和画布介绍
在Linux中,2D绘制流程是操作系统、图形库、显示协议、驱动程序等多个组件协调工作的结果。整体流程如下步骤所示:1. 客户端请求:客户端程序(如GTK、Qt应用程序)通过X11协议与Xorg-Server通信(或通过Wayland协议与Wayland合成器通信)、请求绘制2D图形,比如绘制点、线、矩形、文本等。2. 图形协议层,X11 或 Wayland:客户端的绘制请求最终通过显示服务器协议传递给显示服务器。原创 2025-02-10 23:37:52 · 15353 阅读 · 0 评论 -
驱动开发系列35 - Linux Graphics GEM Buffer Object 介绍
在 Linux 内核中,DRM(Direct Rendering Manager)模块 是用于管理显示硬件和图形渲染的核心框架。它负责协调用户空间应用程序(例如 X Server、Wayland Compositors、Mesa 等)和 GPU 硬件之间的通信,是 Linux 图形子系统的重要组成部分。 GEM (Graphics Execution Manager) 是 Linux 内核 DRM (Direct Rendering Manager) 子系统中用于管理显存的核心组件。它为 GP原创 2025-02-09 20:46:04 · 326 阅读 · 0 评论 -
驱动开发系列34 - Linux Graphics Intel 动态显存技术的实现
动态显存技术(Dynamic Video Memory Technology, DVMT)是一种由 Intel 提出的内存分配技术,主要用于整合显卡(集成显卡)系统中,以便动态地调整显存大小,从而在不同的负载场景下优化内存使用和系统性能。动态显存技术的核心在于共享系统内存。集成显卡没有独立的显存(如独显那样的专用显存),而是与 CPU 共享系统内存。DVMT 根据实际的图形任务需求动态分配内存,以避免资源浪费。静态分配:在系统启动时为显卡分配固定大小的显存,即使任务需求低,也无法减少显存占用。原创 2025-02-08 23:11:48 · 468 阅读 · 0 评论 -
驱动开发系列33 - Linux Graphics mesa Intel驱动介绍
mesa 中的 Intel 驱动体系是为支持 Intel GPU 提供图形 API 的硬件实现部分,主要包括 OpenGL、Vulkan等图形接口,Intel驱动实现整体上分为四层:第一层:API 层, 实现 OpenGL 和 Vulkan 接口, src/mesa/main、src/vulkan。第二层:驱动层,实现 OpenGL 和 Vulkan 驱动,连接API和硬件, src/gallium/drivers/iris、src/intel/vulkan/anv。原创 2025-01-12 00:47:58 · 505 阅读 · 0 评论 -
驱动开发系列32 - Linux Graphics mesa 源码整体介绍
Mesa 由Brian Paul于 1993 年创建,最初是一个基于软件的 OpenGL 实现,目的是提供跨平台的 3D 图形功能。从那时起,Mesa 逐渐发展成为一个功能强大的项目,支持现代图形 API 和硬件。引入Gallium3D框架(2008 年)。支持Vulkan API(2016 年,RADV 驱动)。通过zink驱动实现 OpenGL 和 Vulkan 的互操作。项目代码。原创 2024-12-28 14:30:52 · 491 阅读 · 0 评论 -
驱动开发系列31 - Linux Graphics 调试 mesa 的 glDrawArrays (三)
接着前面驱动开发系列26 - Linux Graphics 调试 mesa 的 glDrawArrays (二)-优快云博客的文章继续分析下glDrawArrays的实现,本文介绍一下在Gallium3D HW Driver中,驱动如何将绘制命令提交给GPU执行。看下驱动层的执行逻辑:即 draw_vbo 的过程。原创 2024-12-25 23:44:15 · 272 阅读 · 0 评论 -
驱动开发系列30 - Linux Graphics DRM光标绘制分析
本文分析了 Linux 直接渲染管理器 (DRM) 绘制光标的过程,目的是将 OpenGL 与 DRM 连接,弄清楚整个调用逻辑。本文将详细描述这一过程,介绍如何在图形软件栈中实现光标渲染。整体软件栈的架构图也将展示其中的各个组成部分及其相互关系。drm-cursor是 JeffyCN 提供的一个实现,旨在通过 Linux 的直接渲染管理器 (DRM) 子系统处理硬件光标。它的核心目的是简化光标的加载、移动和更新过程,并优化性能,特别适用于开发人员在处理 DRM 或图形驱动时。代码仓库。原创 2024-12-15 13:05:10 · 235 阅读 · 0 评论 -
驱动开发系列29 - Linux Graphics Kernel 内核内存管理子系统介绍
Linux 内核的内存管理子系统是操作系统内核的一个核心部分,负责有效地管理和分配系统内存(包括物理内存和虚拟内存)。内存管理的目标是保证系统能够高效且稳定地分配、使用和回收内存,同时提供隔离和保护,以确保不同进程不会相互干扰。虚拟内存(Virtual Memory)虚拟内存是操作系统提供给每个进程的一个抽象内存模型,它让每个进程都认为自己拥有一个连续且独立的内存空间,而实际的物理内存是由操作系统进行管理的。虚拟内存的核心目的是使得多个进程可以共享物理内存资源,同时避免相互干扰。分页(Paging)原创 2024-11-23 23:08:05 · 534 阅读 · 0 评论 -
驱动开发系列28 - Linux Graphics DRM代码分析 - 内部机制
本文介绍DRM的内部机制,这些特性与驱动程序作者和为现有驱动程序添加新功能的开发人员息息相关。首先,我们将介绍一些典型的驱动程序初始化要求,如设置命令缓冲区,创建初始化输出配置和初始化核心服务。随后将更详细介绍核心内部结构,并提供实施说明和示例。DRM层为图形驱动程序提供了多种服务,其中许多服务是由它通过libdrm提供的应用程序接口驱动的。而libdrm是一个封装了大多数DRM ioctls的库。原创 2024-11-22 22:47:26 · 685 阅读 · 0 评论 -
驱动开发系列27 - Linux Graphics Kernel 内核调试环境配置
在驱动开发系列02 - 在ubuntu20.04 上配置 qemu/kvm linux kernel调试环境中我介绍过内核调试环境搭建,但这种方法在调试内核时不是很方便。特别是想调试启动过程,以及调试内核模块时比较困难,下面介绍另外一种内核调试的方法。即 busybox + initramfs + qemu + kernel 的方式,俗称内核调试环境四件套,这个调试环境可以较方便的调试内核启动过程,以及内核模块。BusyBox是一个轻量级的工具集程序,专为嵌入式 Linux 环境设计,但在其他系统中也常见。原创 2024-11-05 23:44:54 · 520 阅读 · 0 评论 -
驱动开发系列26 - Linux Graphics 调试 mesa 的 glDrawArrays (二)
众所周知,Mesa 的 Gallium3D 是一个图形驱动框架,它将图形管线分层,以便支持多种硬件驱动和 API 实现。Gallium3D 通过抽象 GPU 驱动层,简化了 OpenGL、Vulkan 等图形 API 在不同硬件上的实现,提升了 Mesa 的可扩展性和硬件兼容性。Gallium3D 将 Mesa3D 分为几个主要层次,每一层都有特定的职责。这种分层设计将图形 API 的实现和底层硬件驱动逻辑分开,从而可以更高效地支持不同的 GPU 硬件。原创 2024-10-25 00:41:35 · 619 阅读 · 0 评论 -
驱动开发系列25 - Linux Graphics 调试 mesa 的 glDrawArrays (一)
Mesa 是一个开源的图形库,提供对 OpenGL、Vulkan 和其他图形 API 的实现,从本文开始会分析OpenGL API的实现,调试Mesa的方法参见: 驱动开发01 - 编译与调试mesa库-优快云博客 先从 glDrawArrays 开始,这个函数实现有些复杂,可能需要几篇文章参能分析完,在Mesa中,它的入口函数是 mesa_DrawArrays,先从这个函数开始:原创 2024-10-20 22:22:51 · 525 阅读 · 0 评论 -
驱动开发系列24 - Linux Graphics DRM代码分析 - 主要数据结构
本文简要分析下linux drm (direct rendering manager) 的主要数据结构,一个显卡通常要使用其中的哪些数据结构来配置和管理显示输出、以及管理缓冲区和纹理。原创 2024-10-12 00:05:20 · 517 阅读 · 0 评论 -
驱动开发系列23 - Linux Graphics DRM代码分析 - 整体介绍
Linux 的框架是一个管理图形硬件的子系统,主要用于在 Linux 内核中处理图形设备的显式渲染。DRM 允许用户空间应用程序直接与显卡交互,并在 GPU 上进行图形渲染,避免了传统的图形用户界面(GUI)库(如 X11 或 Wayland)对显卡的控制。原创 2024-10-10 22:09:05 · 721 阅读 · 0 评论 -
驱动开发系列22 - Linux Graphics GBM 和 DRM 的关系(扫盲)
DRM(Direct Rendering Manager)是 Linux 内核的一部分,负责管理图形硬件的访问,包括设备驱动程序、显示模式设置、缓冲区分配等。DRM 提供底层硬件交互和资源管理。DRM运行在内核空间,它是 Direct Rendering Manager (DRM) 的一部分,它以内核头文件的形式该头文件提供了底层接口,允许设备驱动程序与 DRM 系统交互,包括缓冲区管理、模式设置和其他硬件操作。原创 2024-10-08 15:49:37 · 646 阅读 · 0 评论 -
驱动开发系列21 - Linux Graphics DRM和KMS内核模块介绍
直接渲染管理器”(DRM)和“内核模式设置”(KMS)API 是 Linux 图形系统的重要组成部分。然而,关于它们具体是什么的文档非常难以找到——而谷歌搜索到的大部分内容都是完全过时的。看起来在这个领域工作的人们太忙了,无法进行文档编写。这篇文章提供了关于 DRM 内核模块内部实现细节的更详细信息。原创 2024-09-01 14:50:46 · 831 阅读 · 0 评论 -
驱动开发系列20 - Linux Graphics Xorg-server 介绍
X.Org Server 是由 X.Org 基金会管理的 X Window System (X11) 显示服务器的自由开源实现。客户端 X Window System 协议的实现以 X11 库的形式存在,这些库作为与 X 服务器通信的有用 API。有两个主要的 X11 库。第一个库是 Xlib,它是最初的 C 语言 X11 API;而另一个 C 语言 X 库 XCB 则是在 2001 年后创建的。还有其他较小的 X 库,既作为其他语言中 Xlib 和 XCB 的接口,也作为独立的小型 X 库存在。原创 2024-10-24 22:51:31 · 405 阅读 · 0 评论 -
驱动开发系列19 - Linux Graphics Xorg 详解
这篇文章简要概述了在Linux系统上生成图形的过程。原创 2024-09-01 08:11:22 · 1244 阅读 · 0 评论 -
驱动开发系列18 - Linux Graphics Wayland 详解
Wayland 是一种通信协议,规定了显示服务器与其客户端之间的通信,以及该协议的 C 语言库实现。使用 Wayland 协议的显示服务器称为 Wayland 合成器,因为它还执行合成窗口管理器的任务。Wayland 由一组志愿者开发,最初由 Kristian Høgsberg 领导,作为一个自由和开源的社区驱动项目,旨在用一个安全且更简单的窗口系统取代 X Window System,以适用于 Linux 和其他类 Unix 操作系统。原创 2024-08-29 19:05:07 · 984 阅读 · 0 评论 -
驱动开发系列17 - Linux Graphics 图形驱动概述(二)
多年来,Linux图形堆栈经历了无数次演变。本节将详细介绍这段历史,并给出更改背后的理由。原创 2024-08-23 00:04:19 · 399 阅读 · 0 评论 -
驱动开发系列16 - Linux Graphics 图形驱动概述(一)
图形加速是一门复杂的艺术,常常受到不公正的“巫术”声誉的困扰。本书旨在介绍Linux下图形驱动程序的内部工作原理和开发。整本书都需要具备C语言编程知识,并对图形处理器有一定的了解。尽管其主要读者是图形驱动开发者,但本文详细介绍了完整的Linux图形栈的内部结构,因此对希望增强对Linux图形世界理解的应用程序开发者也很有帮助:人们可以通过更好地理解Linux图形栈来提高应用程序的性能。在当今这个3D图形和GPU计算普及的时代,深入理解图形是必不可少的。本文以相关硬件概念的介绍开始(第2节)。原创 2024-08-22 23:25:32 · 616 阅读 · 0 评论 -
驱动开发系列15 - Linux Graphics 图形栈概述(二)
1. 1993 年:外设组件互连(PCI), 32 位和 33.33 MHz ,最大传输速率 133 MB/s。2. 1996 年:加速图形端口(AGP),32 位和 66.66 MHz,最大传输速率:266 至 2133 MB/秒(1x 至 8x)。3. 2004 年:PCI Express(PCIe),1 条通道 0.25 - > 2 GB/秒(PCIe v1.x - > 4.0),高达 32 个通道(高达 64 GB/s),改善设备间通信(无仲裁)。原创 2024-08-23 01:40:56 · 534 阅读 · 0 评论 -
驱动开发系列14 - Linux Graphics 图形栈概述(一)
从前面的图中可以看到,Xorg在Linux图形栈中具有承上启下的作用。它有两部分组成 X-Client 以及 X-Server。它是人机交互的重要组成部分,X-Server 接受来自内核的输入事件(例如鼠标,键盘,触摸板等)并传递给 X-Client,X-Client相应用户操作,X-Server将客户端的画面,通过驱动输出到计算机的显示器上。X-Server 与 X-Client 通过 X11 协议通讯。原创 2024-08-10 11:29:13 · 626 阅读 · 0 评论 -
驱动开发系列13 - Linux tasklet用法介绍
Tasklet 是 Linux 内核中的一种轻量级任务调度机制,通常用于在中断上下文中执行短小的任务。它们在软中断处理过程中被调用,允许将较长的处理工作延后到一个较低优先级的上下文中,以减少中断处理的延迟。Tasklet 的使用可以帮助开发者更好地管理系统资源,提高性能,同时也简化了中断处理的复杂性。原创 2024-10-23 22:34:40 · 411 阅读 · 0 评论 -
驱动开发系列12 - Linux 编译内核模块的Makefile解释
6. 系统启动时自动加载 , 将模块名添加到 /etc/modules 文件中。5. 自动安装模块和依赖 sudo modprobe helloworld。1. 安装内核模块 sudo insmod helloworld.ko。7. 获取内核模块信息 modinfo helloworld.ko。2. 查看内核模块 lsmod |grep helloworld。4. 卸载内核模块 sudo rmmod helloworld。3. 查看内核日志 dmesg。8. 调试内核模块 printk。原创 2024-10-15 23:29:01 · 454 阅读 · 0 评论 -
驱动开发系列11 - Linux PAGE_SHIFT 解释
PAGE_SHIFT是一个在内核开发中常用的宏,通常用于计算与内存页面大小相关的值。它定义了页的大小通过位移(shift)的方式进行转换。PAGE_SHIFTPAGE_SHIFT是一个内核中用于与内存页面管理相关的位移常量。通过位移操作,可以高效地进行内存地址与页号之间的转换,避免了浮点或复杂乘除法运算。这使得内存管理相关的代码更加简洁且性能更好。原创 2024-09-26 11:05:48 · 250 阅读 · 0 评论 -
驱动开发系列10 - Linux 设备模型之设备,驱动和总线
Linux 设备模型(LDM)是 Linux 内核中引入的一个概念。用于管理内核对象(那些需要引用计数的对象、例如文件、设备、总线甚至驱动程序),以及描述它们之间的层次结构,以及这些内核对象之间绑定关系。Linux 设备模型引入了对象生命周期管理、引用计数、以及面向对象(OO)编程风格、 以及资源自动释放等底层特性,在此不再赘述。我们将在后续文章中详细介绍。原创 2024-08-05 21:24:22 · 966 阅读 · 0 评论