糟糕的 OpenGL 调用如何导致整个系统崩溃?

糟糕的 OpenGL 调用如何导致整个系统崩溃?

我正在开发OpenGL游戏,我复制了部分具有类似功能的代码,代码对其新功能进行了部分修改,但仍然存在一些错误。该代码使用错误的数据、参数调用 OpenGL 渲染函数。

使用错误的数据/参数调用 OpenGL 函数后,整个系统冻结,我什至无法切换到 console CtrlAltF1

这让我很失望,因为 Linux 应该是稳定的软件/操作系统。然后,为什么有缺陷的 OpenGL 程序会使整个系统崩溃?

答案1

考虑到 Linux 内核的“整体”性质,在 CPU 最高权限级别运行的代码中出现错误,通常称为“内核模式”,使整个系统崩溃。

原因有以下三个:

  • 此类代码可以直接访问任何其他代码的内存空间。因此,此类代码有可能破坏内核本身、运行驱动程序等。
  • 这样的代码可以直接访问I/O设备。很有可能在 I/O 设备上错误配置或在错误时间设置错误位,从而导致整个系统锁定。无错误的设备驱动程序不会让用户代码对硬件执行任何可能导致系统不稳定的操作,但有错误、测试版或编写不当(或错误)的驱动程序可能会这样做。
  • 遇到无法处理的问题或异常的代码没有更高级别的“抛出”。所以内核异常会导致系统崩溃。

所以我不知道 OpenGL 在内核或图形驱动程序中的工作程度如何,但我希望这会有所帮助。

答案2

现代用户界面环境(Windows、OSX、Linux、移动设备等)在很大程度上依赖于图形管道的性能。

系统有一个**图形管道。所有图形程序(桌面、浏览器、游戏等)都是单独的线程,它们必须共享这个单一的图形上下文。

这就为多线程问题创造了必要的条件。线程可能会出现死锁、活锁、争用等情况。

您的线程可能无法与桌面图形线程“很好地配合”,并且它正在锁定。可能正在等待不再可用的资源(您是否正确释放了所有资源?)

OpenGL 的开发非常积极,并将硬件推向极限。您可能会发现其他硬件上不会出现该错误。

但是,如果您的整个系统关闭,则管道的实际芯片组可能过热和/或过压。大多数硬件都有传感器,如果出现有害的负载峰值,它们会切断电源。制造商对其硬件进行负载测试并相应地设置截止值。

**单个图形管道正在被多个管道(可以“拥有”屏幕上独立的较小区域)所取代。这就是OpenGL的伏尔甘都是如此,并且需要特殊的 GPU 芯片组。

在此输入图像描述

相关内容