我最近学习了更多关于 OpenGL 的知识,关于检索本地驱动程序中 OpenGL 函数实现的函数指针,有一个方面我不太理解(https://learnopengl.com/Getting-started/Creating -一个窗口):
开发人员的任务是检索他/她需要的函数的位置并将它们存储在函数指针中以供以后使用。
获取指向设备驱动程序中某个内存位置的函数指针意味着什么?这样做有什么限制吗?看起来允许用户空间进程直接通过内存位置调用内核空间函数并不是很安全。另外,内存位置在进程的虚拟地址空间中的什么位置?
我的理解是,与驱动程序的交互通常是通过系统调用来完成的。那么也许 OpenGL 函数是指向系统调用函数的指针+参数?
如果我误解了该过程,我很想了解有关用户空间进程如何与驱动程序中的代码进行交互的更多信息。
您的理解是正确的:用户空间进程不应该能够直接调用内核空间函数,并且与驱动程序的接口是通过系统调用完成的。
(通常)很容易获取/创建指向内核空间中内存位置的函数指针。在 Linux 和 MS Windows 中,内核都是进程可见的线性地址空间的一部分:如果您好奇的话,任何好的系统编程指南都应该解释到底在哪里。应该发生的情况是,如果您通过函数指针调用,一旦代码尝试在内核空间中读取或写入任何内容,它就会失败,因为代码没有以内核权限执行。
因此 GLAD 或其他加载程序没有获取指向设备驱动程序的函数指针。它正在获取指向用户空间中的 OpenGL 库(libGL.so、OpenGL32.dll 等)函数的函数指针。这些 OpenGL 库函数依次对实际的设备驱动程序代码进行系统调用,将 CPU 切换到特权模式。
但从概念上讲,更容易将其视为“调用设备驱动程序”,因为 OpenGL 库代码通常只是通过系统调用传递未更改的参数。