黑不溜秋的
GPU全栈博主-程序哥。
展开
-
驱动开发系列21 - 编译内核模块的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 · 41 阅读 · 0 评论 -
驱动开发系列20 - Linux DRM代码分析 - 主要数据结构
本文简要分析下linux drm (direct rendering manager) 的主要数据结构,一个显卡通常要使用其中的哪些数据结构来配置和管理显示输出、以及管理缓冲区和纹理。原创 2024-10-12 00:05:20 · 317 阅读 · 0 评论 -
驱动开发系列19 - Linux DRM代码分析 - 整体介绍
Linux 的框架是一个管理图形硬件的子系统,主要用于在 Linux 内核中处理图形设备的显式渲染。DRM 允许用户空间应用程序直接与显卡交互,并在 GPU 上进行图形渲染,避免了传统的图形用户界面(GUI)库(如 X11 或 Wayland)对显卡的控制。原创 2024-10-10 22:09:05 · 358 阅读 · 0 评论 -
驱动开发系列19 - GBM 和 DRM 的关系(扫盲)
DRM(Direct Rendering Manager)是 Linux 内核的一部分,负责管理图形硬件的访问,包括设备驱动程序、显示模式设置、缓冲区分配等。DRM 提供底层硬件交互和资源管理。DRM运行在内核空间,它是 Direct Rendering Manager (DRM) 的一部分,它以内核头文件的形式该头文件提供了底层接口,允许设备驱动程序与 DRM 系统交互,包括缓冲区管理、模式设置和其他硬件操作。原创 2024-10-08 15:49:37 · 185 阅读 · 0 评论 -
驱动开发系列18 - PAGE_SHIFT 解释
PAGE_SHIFT是一个在内核开发中常用的宏,通常用于计算与内存页面大小相关的值。它定义了页的大小通过位移(shift)的方式进行转换。PAGE_SHIFTPAGE_SHIFT是一个内核中用于与内存页面管理相关的位移常量。通过位移操作,可以高效地进行内存地址与页号之间的转换,避免了浮点或复杂乘除法运算。这使得内存管理相关的代码更加简洁且性能更好。原创 2024-09-26 11:05:48 · 107 阅读 · 0 评论 -
驱动开发系列17 - PCI总线
PCI(外设计算机互连)或PCIe总线是现代计算机的主要组成部分,了解它的工作原理对于理解许多Linux设备驱动程序非常重要。关于PCI总线本身有很多好的信息(在维基百科和其他地方),而Linux内核中也有关于PCI处理子系统实际实现的文档。然而,这两种现有来源之间存在一个空白,本文希望填补这个空白。虽然我在这里的重点是理解x86环境下的PCI/PCIe,但这些内容对其他操作系统和非x86硬件也应该是相关的。因为这是对PCI的概述,而不是教科书,所以这里有许多简化和省略。原创 2024-09-01 20:22:47 · 452 阅读 · 0 评论 -
驱动开发系列16 - Linux Graphics DRM和KMS内核模块介绍
直接渲染管理器”(DRM)和“内核模式设置”(KMS)API 是 Linux 图形系统的重要组成部分。然而,关于它们具体是什么的文档非常难以找到——而谷歌搜索到的大部分内容都是完全过时的。看起来在这个领域工作的人们太忙了,无法进行文档编写。这篇文章提供了关于 DRM 内核模块内部实现细节的更详细信息。原创 2024-09-01 14:50:46 · 444 阅读 · 0 评论 -
驱动开发系列15 - Linux Graphics Xorg 详解
这篇文章简要概述了在Linux系统上生成图形的过程。原创 2024-09-01 08:11:22 · 903 阅读 · 0 评论 -
驱动开发系列14 - Linux Graphics Wayland 详解
Wayland 是一种通信协议,规定了显示服务器与其客户端之间的通信,以及该协议的 C 语言库实现。使用 Wayland 协议的显示服务器称为 Wayland 合成器,因为它还执行合成窗口管理器的任务。Wayland 由一组志愿者开发,最初由 Kristian Høgsberg 领导,作为一个自由和开源的社区驱动项目,旨在用一个安全且更简单的窗口系统取代 X Window System,以适用于 Linux 和其他类 Unix 操作系统。原创 2024-08-29 19:05:07 · 618 阅读 · 0 评论 -
驱动开发系列13 - Linux Graphics 图形驱动概述(二)
多年来,Linux图形堆栈经历了无数次演变。本节将详细介绍这段历史,并给出更改背后的理由。原创 2024-08-23 00:04:19 · 314 阅读 · 0 评论 -
驱动开发系列12 - Linux Graphics 图形驱动概述(一)
图形加速是一门复杂的艺术,常常受到不公正的“巫术”声誉的困扰。本书旨在介绍Linux下图形驱动程序的内部工作原理和开发。整本书都需要具备C语言编程知识,并对图形处理器有一定的了解。尽管其主要读者是图形驱动开发者,但本文详细介绍了完整的Linux图形栈的内部结构,因此对希望增强对Linux图形世界理解的应用程序开发者也很有帮助:人们可以通过更好地理解Linux图形栈来提高应用程序的性能。在当今这个3D图形和GPU计算普及的时代,深入理解图形是必不可少的。本文以相关硬件概念的介绍开始(第2节)。原创 2024-08-22 23:25:32 · 429 阅读 · 0 评论 -
驱动开发系列11 - 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 · 360 阅读 · 0 评论 -
驱动开发系列10 - 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 · 432 阅读 · 0 评论 -
驱动开发系列09 - Linux设备模型之设备,驱动和总线
Linux 设备模型(LDM)是 Linux 内核中引入的一个概念。用于管理内核对象(那些需要引用计数的对象、例如文件、设备、总线甚至驱动程序),以及描述它们之间的层次结构,以及这些内核对象之间绑定关系。Linux 设备模型引入了对象生命周期管理、引用计数、以及面向对象(OO)编程风格、 以及资源自动释放等底层特性,在此不再赘述。我们将在后续文章中详细介绍。原创 2024-08-05 21:24:22 · 892 阅读 · 0 评论 -
驱动开发系列08 - 驱动程序中的并发编程
并发编程是驱动编程中的核心问题之一。与并发相关的bug最容易产生,也很难找到。即使是专业的Linux内核程序员,有时也会产生与并发相关的bug。现代Linux操作系统,为了满足现代硬件和应用程序需求,其Linux内核已经发展到可以同时处理很多事情的程度,这一进化使得性能和可扩展性都得到了极大的提升。然而,这也大大增加了内核编程的复杂性。所以设备驱动开发人员必须从一开始就要开始考虑并发问题,并且必须充分了解内核提供的并发编程接口。原创 2024-07-28 16:46:36 · 553 阅读 · 0 评论 -
驱动开发系列07 - 驱动程序如何分配内存
Linux 内核提供了丰富的内存分配函数、在本文中,我们将介绍在设备驱动程序中分配和使用内存的方法,以及如何优化系统的内存资源。由于内核为驱动程序提供了统一的内存管理接口。所以我们不会去讨论不同架构是如何管理内存的,文本不涉及分段、分页等问题,此外在本文中,我们也不会描述Linux内存管理的内部细节,这在驱动开发系列06 - 内存映射和DMA已经介绍过了,感兴趣的读者可以前往了解。kmalloc 是一个功能强大的内存分配函数,由于它与 malloc 相似,因此很容易学习。原创 2024-07-22 20:08:56 · 1866 阅读 · 0 评论 -
驱动开发系列06 - 内存映射和DMA
本文深入探讨 Linux 内存管理子系统,重点介绍对设备驱动程序编写者有用的技术。许多类型的驱动程序编程都需要对虚拟内存子系统的工作原理有一定的了解;当我们编写一些更复杂、对性能要求更高的驱动时,本文所涉及的内容就会派上用场。虚拟内存子系统也是 Linux 核心内核中非常有趣的一部分,因此值得一看。本文内容分为三节:第一节涉及 mmap 系统调用的实现,该调用允许将设备内存直接映射到用户进程的地址空间。将设备内存直接映射到用户进程的地址空间。原创 2024-07-20 20:16:43 · 624 阅读 · 0 评论 -
驱动开发系列05 - PCI驱动
在前面一文我们介绍了最底层的硬件控制,而本文将介绍总线结构。总线由电气接口和编程接口两部分组成。在本文中,我们将讨论编程接口部分。本文涉及多种总线结构。不过,本文的主要重点是介绍PCI(Peripheral Component Interconnect)总线结构,以及访问外设组件的内核函数。PCI 总线是目前台式机和大型计算机上最常用的外设总线。PCI 总线是内核支持最好的总线。ISA 仍是电子爱好者的常用工具,将在后面介绍。原创 2024-07-02 19:15:54 · 452 阅读 · 2 评论 -
驱动开发系列04 - 中断处理
虽然有时候只需使用I/O端口就能控制设备了,但大多数实际的设备都要更复杂一些。设备必须与外界交互,通常包括磁盘旋转、磁带移动、跨电缆的远距离数据传输等。很多外界事件需要花费多个处理器周期才能完成,速度要比处理器慢得多。让处理器等待外部事件完成几乎总是不可取的,因此必须有一种方式,让设备在发生事件时,或事件处理完成时通知处理器。而这种通知的方式就是中断。中断是设备给处理器发送的一个信号,意思是想让处理器留意处理。Linux处理中断的方式与其用户空间处理信号的方式基本相同。原创 2024-07-13 23:14:42 · 622 阅读 · 0 评论 -
驱动开发系列03 - 如何与硬件通信
驱动程序是软件与硬件之间的抽象层;因此,它需要与这两者对话,本文将向你展示驱动程序如何与硬件对话。并介绍I/O端口和I/O内存的概念。原创 2024-07-05 15:58:58 · 1216 阅读 · 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 · 1741 阅读 · 0 评论 -
驱动开发系列01 - Ubuntu20.04 编译与调试 OpenGL驱动(mesa库)
介绍如何编译并调试 opengl 驱动原创 2023-04-23 19:46:39 · 1943 阅读 · 0 评论