黑不溜秋的
GPU全栈博主-程序哥。
展开
-
驱动开发系列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 · 279 阅读 · 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 · 361 阅读 · 0 评论 -
驱动开发系列31 - Linux Graphics 调试 mesa 的 glDrawArrays (三)
接着前面驱动开发系列26 - Linux Graphics 调试 mesa 的 glDrawArrays (二)-CSDN博客的文章继续分析下glDrawArrays的实现,本文介绍一下在Gallium3D HW Driver中,驱动如何将绘制命令提交给GPU执行。看下驱动层的执行逻辑:即 draw_vbo 的过程。原创 2024-12-25 23:44:15 · 205 阅读 · 0 评论 -
驱动开发系列30 - Linux Graphics DRM光标绘制分析
本文分析了 Linux 直接渲染管理器 (DRM) 绘制光标的过程,目的是将 OpenGL 与 DRM 连接,弄清楚整个调用逻辑。本文将详细描述这一过程,介绍如何在图形软件栈中实现光标渲染。整体软件栈的架构图也将展示其中的各个组成部分及其相互关系。drm-cursor是 JeffyCN 提供的一个实现,旨在通过 Linux 的直接渲染管理器 (DRM) 子系统处理硬件光标。它的核心目的是简化光标的加载、移动和更新过程,并优化性能,特别适用于开发人员在处理 DRM 或图形驱动时。代码仓库。原创 2024-12-15 13:05:10 · 180 阅读 · 0 评论 -
驱动开发系列29 - Linux Graphics Kernel 内核内存管理子系统介绍
Linux 内核的内存管理子系统是操作系统内核的一个核心部分,负责有效地管理和分配系统内存(包括物理内存和虚拟内存)。内存管理的目标是保证系统能够高效且稳定地分配、使用和回收内存,同时提供隔离和保护,以确保不同进程不会相互干扰。虚拟内存(Virtual Memory)虚拟内存是操作系统提供给每个进程的一个抽象内存模型,它让每个进程都认为自己拥有一个连续且独立的内存空间,而实际的物理内存是由操作系统进行管理的。虚拟内存的核心目的是使得多个进程可以共享物理内存资源,同时避免相互干扰。分页(Paging)原创 2024-11-23 23:08:05 · 489 阅读 · 0 评论 -
驱动开发系列28 - Linux Graphics DRM代码分析 - 内部机制
本文介绍DRM的内部机制,这些特性与驱动程序作者和为现有驱动程序添加新功能的开发人员息息相关。首先,我们将介绍一些典型的驱动程序初始化要求,如设置命令缓冲区,创建初始化输出配置和初始化核心服务。随后将更详细介绍核心内部结构,并提供实施说明和示例。DRM层为图形驱动程序提供了多种服务,其中许多服务是由它通过libdrm提供的应用程序接口驱动的。而libdrm是一个封装了大多数DRM ioctls的库。原创 2024-11-22 22:47:26 · 624 阅读 · 0 评论 -
驱动开发系列27 - Linux Graphics Kernel 内核调试环境配置
在驱动开发系列02 - 在ubuntu20.04 上配置 qemu/kvm linux kernel调试环境中我介绍过内核调试环境搭建,但这种方法在调试内核时不是很方便。特别是想调试启动过程,以及调试内核模块时比较困难,下面介绍另外一种内核调试的方法。即 busybox + initramfs + qemu + kernel 的方式,俗称内核调试环境四件套,这个调试环境可以较方便的调试内核启动过程,以及内核模块。BusyBox是一个轻量级的工具集程序,专为嵌入式 Linux 环境设计,但在其他系统中也常见。原创 2024-11-05 23:44:54 · 467 阅读 · 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 · 559 阅读 · 0 评论 -
驱动开发系列25 - Linux Graphics 调试 mesa 的 glDrawArrays (一)
Mesa 是一个开源的图形库,提供对 OpenGL、Vulkan 和其他图形 API 的实现,从本文开始会分析OpenGL API的实现,调试Mesa的方法参见: 驱动开发01 - 编译与调试mesa库-CSDN博客 先从 glDrawArrays 开始,这个函数实现有些复杂,可能需要几篇文章参能分析完,在Mesa中,它的入口函数是 mesa_DrawArrays,先从这个函数开始:原创 2024-10-20 22:22:51 · 482 阅读 · 0 评论 -
驱动开发系列24 - Linux Graphics DRM代码分析 - 主要数据结构
本文简要分析下linux drm (direct rendering manager) 的主要数据结构,一个显卡通常要使用其中的哪些数据结构来配置和管理显示输出、以及管理缓冲区和纹理。原创 2024-10-12 00:05:20 · 451 阅读 · 0 评论 -
驱动开发系列23 - Linux Graphics DRM代码分析 - 整体介绍
Linux 的框架是一个管理图形硬件的子系统,主要用于在 Linux 内核中处理图形设备的显式渲染。DRM 允许用户空间应用程序直接与显卡交互,并在 GPU 上进行图形渲染,避免了传统的图形用户界面(GUI)库(如 X11 或 Wayland)对显卡的控制。原创 2024-10-10 22:09:05 · 617 阅读 · 0 评论 -
驱动开发系列22 - Linux Graphics GBM 和 DRM 的关系(扫盲)
DRM(Direct Rendering Manager)是 Linux 内核的一部分,负责管理图形硬件的访问,包括设备驱动程序、显示模式设置、缓冲区分配等。DRM 提供底层硬件交互和资源管理。DRM运行在内核空间,它是 Direct Rendering Manager (DRM) 的一部分,它以内核头文件的形式该头文件提供了底层接口,允许设备驱动程序与 DRM 系统交互,包括缓冲区管理、模式设置和其他硬件操作。原创 2024-10-08 15:49:37 · 499 阅读 · 0 评论 -
驱动开发系列21 - Linux Graphics DRM和KMS内核模块介绍
直接渲染管理器”(DRM)和“内核模式设置”(KMS)API 是 Linux 图形系统的重要组成部分。然而,关于它们具体是什么的文档非常难以找到——而谷歌搜索到的大部分内容都是完全过时的。看起来在这个领域工作的人们太忙了,无法进行文档编写。这篇文章提供了关于 DRM 内核模块内部实现细节的更详细信息。原创 2024-09-01 14:50:46 · 689 阅读 · 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 · 338 阅读 · 0 评论 -
驱动开发系列19 - Linux Graphics Xorg 详解
这篇文章简要概述了在Linux系统上生成图形的过程。原创 2024-09-01 08:11:22 · 1126 阅读 · 0 评论 -
驱动开发系列18 - Linux Graphics Wayland 详解
Wayland 是一种通信协议,规定了显示服务器与其客户端之间的通信,以及该协议的 C 语言库实现。使用 Wayland 协议的显示服务器称为 Wayland 合成器,因为它还执行合成窗口管理器的任务。Wayland 由一组志愿者开发,最初由 Kristian Høgsberg 领导,作为一个自由和开源的社区驱动项目,旨在用一个安全且更简单的窗口系统取代 X Window System,以适用于 Linux 和其他类 Unix 操作系统。原创 2024-08-29 19:05:07 · 855 阅读 · 0 评论 -
驱动开发系列17 - Linux Graphics 图形驱动概述(二)
多年来,Linux图形堆栈经历了无数次演变。本节将详细介绍这段历史,并给出更改背后的理由。原创 2024-08-23 00:04:19 · 358 阅读 · 0 评论 -
驱动开发系列16 - Linux Graphics 图形驱动概述(一)
图形加速是一门复杂的艺术,常常受到不公正的“巫术”声誉的困扰。本书旨在介绍Linux下图形驱动程序的内部工作原理和开发。整本书都需要具备C语言编程知识,并对图形处理器有一定的了解。尽管其主要读者是图形驱动开发者,但本文详细介绍了完整的Linux图形栈的内部结构,因此对希望增强对Linux图形世界理解的应用程序开发者也很有帮助:人们可以通过更好地理解Linux图形栈来提高应用程序的性能。在当今这个3D图形和GPU计算普及的时代,深入理解图形是必不可少的。本文以相关硬件概念的介绍开始(第2节)。原创 2024-08-22 23:25:32 · 526 阅读 · 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 · 467 阅读 · 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 · 563 阅读 · 0 评论 -
驱动开发系列13 - Linux tasklet用法介绍
Tasklet 是 Linux 内核中的一种轻量级任务调度机制,通常用于在中断上下文中执行短小的任务。它们在软中断处理过程中被调用,允许将较长的处理工作延后到一个较低优先级的上下文中,以减少中断处理的延迟。Tasklet 的使用可以帮助开发者更好地管理系统资源,提高性能,同时也简化了中断处理的复杂性。原创 2024-10-23 22:34:40 · 343 阅读 · 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 · 377 阅读 · 0 评论 -
驱动开发系列11 - Linux PAGE_SHIFT 解释
PAGE_SHIFT是一个在内核开发中常用的宏,通常用于计算与内存页面大小相关的值。它定义了页的大小通过位移(shift)的方式进行转换。PAGE_SHIFTPAGE_SHIFT是一个内核中用于与内存页面管理相关的位移常量。通过位移操作,可以高效地进行内存地址与页号之间的转换,避免了浮点或复杂乘除法运算。这使得内存管理相关的代码更加简洁且性能更好。原创 2024-09-26 11:05:48 · 196 阅读 · 0 评论 -
驱动开发系列10 - Linux 设备模型之设备,驱动和总线
Linux 设备模型(LDM)是 Linux 内核中引入的一个概念。用于管理内核对象(那些需要引用计数的对象、例如文件、设备、总线甚至驱动程序),以及描述它们之间的层次结构,以及这些内核对象之间绑定关系。Linux 设备模型引入了对象生命周期管理、引用计数、以及面向对象(OO)编程风格、 以及资源自动释放等底层特性,在此不再赘述。我们将在后续文章中详细介绍。原创 2024-08-05 21:24:22 · 932 阅读 · 0 评论 -
驱动开发系列09 - 驱动程序中的并发编程
并发编程是驱动编程中的核心问题之一。与并发相关的bug最容易产生,也很难找到。即使是专业的Linux内核程序员,有时也会产生与并发相关的bug。现代Linux操作系统,为了满足现代硬件和应用程序需求,其Linux内核已经发展到可以同时处理很多事情的程度,这一进化使得性能和可扩展性都得到了极大的提升。然而,这也大大增加了内核编程的复杂性。所以设备驱动开发人员必须从一开始就要开始考虑并发问题,并且必须充分了解内核提供的并发编程接口。原创 2024-07-28 16:46:36 · 582 阅读 · 0 评论 -
驱动开发系列08 - 驱动程序如何分配内存
Linux 内核提供了丰富的内存分配函数、在本文中,我们将介绍在设备驱动程序中分配和使用内存的方法,以及如何优化系统的内存资源。由于内核为驱动程序提供了统一的内存管理接口。所以我们不会去讨论不同架构是如何管理内存的,文本不涉及分段、分页等问题,此外在本文中,我们也不会描述Linux内存管理的内部细节,这在驱动开发系列06 - 内存映射和DMA已经介绍过了,感兴趣的读者可以前往了解。kmalloc 是一个功能强大的内存分配函数,由于它与 malloc 相似,因此很容易学习。原创 2024-07-22 20:08:56 · 1965 阅读 · 0 评论 -
驱动开发系列07 - 内存映射和DMA
本文深入探讨 Linux 内存管理子系统,重点介绍对设备驱动程序编写者有用的技术。许多类型的驱动程序编程都需要对虚拟内存子系统的工作原理有一定的了解;当我们编写一些更复杂、对性能要求更高的驱动时,本文所涉及的内容就会派上用场。虚拟内存子系统也是 Linux 核心内核中非常有趣的一部分,因此值得一看。本文内容分为三节:第一节涉及 mmap 系统调用的实现,该调用允许将设备内存直接映射到用户进程的地址空间。将设备内存直接映射到用户进程的地址空间。原创 2024-07-20 20:16:43 · 708 阅读 · 0 评论 -
驱动开发系列06 - PCI总线
PCI(外设计算机互连)或PCIe总线是现代计算机的主要组成部分,了解它的工作原理对于理解许多Linux设备驱动程序非常重要。关于PCI总线本身有很多好的信息(在维基百科和其他地方),而Linux内核中也有关于PCI处理子系统实际实现的文档。然而,这两种现有来源之间存在一个空白,本文希望填补这个空白。虽然我在这里的重点是理解x86环境下的PCI/PCIe,但这些内容对其他操作系统和非x86硬件也应该是相关的。因为这是对PCI的概述,而不是教科书,所以这里有许多简化和省略。原创 2024-09-01 20:22:47 · 489 阅读 · 0 评论 -
驱动开发系列05 - PCI驱动
在前面一文我们介绍了最底层的硬件控制,而本文将介绍总线结构。总线由电气接口和编程接口两部分组成。在本文中,我们将讨论编程接口部分。本文涉及多种总线结构。不过,本文的主要重点是介绍PCI(Peripheral Component Interconnect)总线结构,以及访问外设组件的内核函数。PCI 总线是目前台式机和大型计算机上最常用的外设总线。PCI 总线是内核支持最好的总线。ISA 仍是电子爱好者的常用工具,将在后面介绍。原创 2024-07-02 19:15:54 · 574 阅读 · 2 评论 -
驱动开发系列04 - 中断处理
虽然有时候只需使用I/O端口就能控制设备了,但大多数实际的设备都要更复杂一些。设备必须与外界交互,通常包括磁盘旋转、磁带移动、跨电缆的远距离数据传输等。很多外界事件需要花费多个处理器周期才能完成,速度要比处理器慢得多。让处理器等待外部事件完成几乎总是不可取的,因此必须有一种方式,让设备在发生事件时,或事件处理完成时通知处理器。而这种通知的方式就是中断。中断是设备给处理器发送的一个信号,意思是想让处理器留意处理。Linux处理中断的方式与其用户空间处理信号的方式基本相同。原创 2024-07-13 23:14:42 · 653 阅读 · 0 评论 -
驱动开发系列03 - 如何与硬件通信
驱动程序是软件与硬件之间的抽象层;因此,它需要与这两者对话,本文将向你展示驱动程序如何与硬件对话。并介绍I/O端口和I/O内存的概念。原创 2024-07-05 15:58:58 · 1305 阅读 · 0 评论 -
驱动开发系列02 - 在ubuntu20.04 上配置 qemu/kvm linux kernel调试环境
(1): 在宿主机上运行gdb需要内核二进制文件,我们可以将虚拟机的/usr/src/linux-source-5.4.148整个目录都拷贝到宿主机上,比如拷贝到/path/to/linux-build目录下。(2): 在宿主机上配置gdb环境,为了能够让gdb在启动时能够加载 Linux helper 脚本,需要在~/.gdbinit 文件中添加如下内容: /path/to/linux-build 就是上一步拷贝过来的linux源码目录。(2):源码下载下来,将其解压到/usr/src 目录下。原创 2024-02-19 18:27:18 · 1866 阅读 · 0 评论 -
驱动开发系列01 - Ubuntu20.04 编译与调试 OpenGL驱动(mesa库)
介绍如何编译并调试 opengl 驱动原创 2023-04-23 19:46:39 · 2135 阅读 · 0 评论
分享