一个进程的显卡内存和虚拟地址space

Graphics card memory and virtual address space of a process

假设我有一个游戏,在 openGL 方面有很多图形,我有一个安装了 Linux 32 位、4GB RAM 和 1G Nvidia 显卡的桌面。我的游戏应用程序虚拟地址 space 是什么样子的?显卡显存是否映射到这个虚拟地址space?

另外,RAM和显卡显存之间有什么关系吗? linux 是否为不能被任何进程使用的显卡分配相等的 RAM?也就是说,它会导致我的游戏进程只能使用 3GB 的 RAM?

How does my game application virtual address space look like?

无从得知。 OpenGL 将此细节完全开放给供应商实现。任何满足规范的东西都是允许的。

Is graphics card memory mapped in this virtual address space?

也许,也许不是。那要看实际执行了。

Also, is there some relation between RAM and graphics card memory?

通常是的。就目前和大多数 OpenGL 实现而言,显卡的 RAM 本质上是缓存实际存在于系统内存中的东西(CPU RAM + swap space + 从存储映射的内存)。然而,这并没有固定到规范中,任何满足 OpenGL 规范的东西都是允许的。

Does Linux allocate equal RAM for graphics card which can not be used by any process?

不,因为Linux(内核)不关心这些事情。不过,您的显卡驱动程序是。驱动程序可以按照它认为合适的任何方式进行操作。它可以通过物理地址扩展 (PAE) 将 OpenGL 上下文数据映射到一个单独的地址 space 或将其放置在不同的进程中或将其保存在您的游戏地址 space 中,或者……,或者……,或者……没有关于此的书面方案。

That said, it results then into only 3GB of RAM available to my game process?

如果是这样,那么更像是 (3GB - 1GB) - x 其中 0 < x 因为进程地址的前 1GB space 保留给内核,当然还有程序的文本(二进制由 CPU) 执行,它所使用的库的文本也需要一些地址 space。