假设我有一个用opengl做很多图形的游戏,我有一个32位的linux桌面,上面安装了4gb的ram和1g的nvidia显卡。我的游戏应用程序虚拟地址空间看起来怎么样?图形卡内存是否映射到此虚拟地址空间中?
另外,RAM和显卡存储器之间有什么关系吗?Linux是否为任何进程都不能使用的显卡分配相同的RAM?也就是说,它的结果是只有3GB的内存可用于我的游戏过程?
最佳答案
我的游戏应用程序虚拟地址空间看起来怎么样?
说不出来。opengl将这个细节完全留给供应商实现。任何符合规范的都是允许的。
图形卡内存是否映射到此虚拟地址空间中?
也许,也许不是。这取决于实际执行情况。
另外,RAM和显卡存储器之间有什么关系吗?
通常是的。就大多数opengl实现而言,图形卡的ram本质上是系统内存(cpu-ram+swap-space+stuff-memory-mapped-from-storage)中的缓存。但是,这并不是由规范决定的,任何满足opengl规范的东西都是允许的。
Linux是否为任何进程都不能使用的显卡分配相同的RAM?
不,因为linux(内核)不关心这些事情。不过,你的显卡驱动程序是。司机可以按他认为合适的方式做。它可以通过物理地址扩展(pae)将opengl上下文数据映射到一个单独的地址空间,或者将其放在不同的进程中,或者将其保存在游戏的地址空间中,或者…,或者…。没有写下来的计划。
也就是说,它的结果是只有3GB的内存可用于我的游戏过程?
如果是这样,则更像(3GB - 1GB) - x
其中的0 < x
,因为进程的前1gb地址空间是为内核保留的,当然程序的文本(由cpu执行的二进制文件)和它使用的库的文本也会占用一些地址空间。