Linux 编写 GPU 驱动程序以从内核端打印任意输出
Linux writing GPU drivers to print arbitrary outputs from kernel side
我对 linux 内核的 GPU 驱动程序有疑问。
1-) 是否可以使用 GPU over PCI express 编写自定义内核模块来像 VGA 一样在屏幕上打印文字或颜色?
2-) 如果是,它是通用的还是 device/chip 依赖的?
3-)如果是,写MMIO可以吗space?
我的想法是,我想编写一个简单的内核模块来通过 PCI Express 总线打印一些任意值。我的 GPU 只有 mDP 和 DVI-D 输出,它在 linux 内核中有一个大内核驱动程序。
首先;让我们将视频卡分成多个不同的部分:
视频 RAM(可能还有一些用于 BIOS and/or UEFI 的 ROM,在启动期间使用,我们可以忽略它,因为它在启动后就没用了)
控制视频 RAM、将物理访问转换为 VRAM 访问的东西,可能包括 "stealing of system RAM"(用于集成视频),并且可能包括某种 DMA 引擎(以加速系统 RAM 和视频 RAM 之间的数据)
控制发送到监视器的视频信号(视频模式时序)并将像素数据从帧缓冲区泵送到(VGA、DVI、HDMI、...)插座的东西,并且是能够从监视器获取信息(EDID/Extended 显示标识数据)。请注意,如果视频卡支持多个显示器,则所有这些都必须复制多次。
各种固定功能加速器 - 例如MPEG 解码器。
a "processor unit" 执行某种机器代码并执行某些操作。这是 GPU;并且通常用于执行从更便携的语言(HLSL、GLSL、C)在别处编译(例如通过视频驱动程序)并用于着色器和 GPGPU 的程序。
1-) Is it possible to write a custom kernel module to print words or colors on screen like VGA using a GPU over PCI express ?
理论上;是的。在实践中,不使用 GPU(只需使用 CPU 将像素数据直接写入视频 RAM/frame 缓冲区)会容易得多,部分原因是使用 GPU 是不必要的矫枉过正,部分原因是"portability to different GPUs" 所需的编译器在 user-space 中,而不在内核中。然而,这在很大程度上是愚蠢的——不能保证实际使用帧缓冲区的任何东西(例如,可能是全屏游戏)都不会覆盖内核在发送到监视器之前所做的任何事情,也不能保证用户永远能够看看内核做了什么。
2-) If it is, is it generic or device/chip dependent?
非常device/chip依赖;并且非常 "situation dependent"(例如,取决于用户 space 中的其他软件,如 Gnome 或 KDE 或 Wine 或...,当前正在使用视频卡)。
3-) If it is, is it possible with writing MMIO space?
是(但 "MMIO" 包括帧缓冲区、用于纹理的内存以及视频卡所有部分的所有内部控制寄存器)。也可能通过用 needles/electrodes 刺伤他们的大脑来教某人弹钢琴 - "possible" 并不意味着 "easy" 或 "sensible"。
做我认为你的目标是正确的;您可能想要修改所有 "video card drivers"(其中 Linux 中的 "video card driver" 散落在各处,部分在内核中,部分在用户 space 库中; 其中有些部分可能是 proprietary/closed 来源);因此视频卡驱动程序负责设置一个 "reserved for kernel only" 覆盖层(对于每个不同的监视器,它叠加在用户 space 想要显示的任何内容之上)。但是,即使在那种情况下,它也可能无法在某些情况下工作(旧的 and/or 低端视频卡通常在不支持覆盖的服务器中找到,远程桌面使用 RDP 或 X 之类的东西通过网络而不是视频卡,视频卡被 hyper-visors/virtual 机器用于 "PCI passthrough"。
我对 linux 内核的 GPU 驱动程序有疑问。
1-) 是否可以使用 GPU over PCI express 编写自定义内核模块来像 VGA 一样在屏幕上打印文字或颜色?
2-) 如果是,它是通用的还是 device/chip 依赖的?
3-)如果是,写MMIO可以吗space?
我的想法是,我想编写一个简单的内核模块来通过 PCI Express 总线打印一些任意值。我的 GPU 只有 mDP 和 DVI-D 输出,它在 linux 内核中有一个大内核驱动程序。
首先;让我们将视频卡分成多个不同的部分:
视频 RAM(可能还有一些用于 BIOS and/or UEFI 的 ROM,在启动期间使用,我们可以忽略它,因为它在启动后就没用了)
控制视频 RAM、将物理访问转换为 VRAM 访问的东西,可能包括 "stealing of system RAM"(用于集成视频),并且可能包括某种 DMA 引擎(以加速系统 RAM 和视频 RAM 之间的数据)
控制发送到监视器的视频信号(视频模式时序)并将像素数据从帧缓冲区泵送到(VGA、DVI、HDMI、...)插座的东西,并且是能够从监视器获取信息(EDID/Extended 显示标识数据)。请注意,如果视频卡支持多个显示器,则所有这些都必须复制多次。
各种固定功能加速器 - 例如MPEG 解码器。
a "processor unit" 执行某种机器代码并执行某些操作。这是 GPU;并且通常用于执行从更便携的语言(HLSL、GLSL、C)在别处编译(例如通过视频驱动程序)并用于着色器和 GPGPU 的程序。
1-) Is it possible to write a custom kernel module to print words or colors on screen like VGA using a GPU over PCI express ?
理论上;是的。在实践中,不使用 GPU(只需使用 CPU 将像素数据直接写入视频 RAM/frame 缓冲区)会容易得多,部分原因是使用 GPU 是不必要的矫枉过正,部分原因是"portability to different GPUs" 所需的编译器在 user-space 中,而不在内核中。然而,这在很大程度上是愚蠢的——不能保证实际使用帧缓冲区的任何东西(例如,可能是全屏游戏)都不会覆盖内核在发送到监视器之前所做的任何事情,也不能保证用户永远能够看看内核做了什么。
2-) If it is, is it generic or device/chip dependent?
非常device/chip依赖;并且非常 "situation dependent"(例如,取决于用户 space 中的其他软件,如 Gnome 或 KDE 或 Wine 或...,当前正在使用视频卡)。
3-) If it is, is it possible with writing MMIO space?
是(但 "MMIO" 包括帧缓冲区、用于纹理的内存以及视频卡所有部分的所有内部控制寄存器)。也可能通过用 needles/electrodes 刺伤他们的大脑来教某人弹钢琴 - "possible" 并不意味着 "easy" 或 "sensible"。
做我认为你的目标是正确的;您可能想要修改所有 "video card drivers"(其中 Linux 中的 "video card driver" 散落在各处,部分在内核中,部分在用户 space 库中; 其中有些部分可能是 proprietary/closed 来源);因此视频卡驱动程序负责设置一个 "reserved for kernel only" 覆盖层(对于每个不同的监视器,它叠加在用户 space 想要显示的任何内容之上)。但是,即使在那种情况下,它也可能无法在某些情况下工作(旧的 and/or 低端视频卡通常在不支持覆盖的服务器中找到,远程桌面使用 RDP 或 X 之类的东西通过网络而不是视频卡,视频卡被 hyper-visors/virtual 机器用于 "PCI passthrough"。