有没有把显存作为系统内存使用的技术?
很巧,前几天还和同事讨论这件事,今天就看到有人问。实际上,技术早就有,而且我也实操过,尽管性能很糟糕,但光就可行性而论,显存当内存用,一点问题也没有,就是麻烦一点。
我之前在老东家,做服务器芯片的Power On(PO,国内很多公司叫做Bring Up),内存子系统的初始化Training,往往是关键的阻塞点。毕竟,没有内存,不仅是操作系统跑不起来,连我的老本行,BIOS,也跑不过PEI阶段。刚出炉的CPU,往往有很多bug,内存子系统问题更多。这样,BIOS跑不起来,芯片的大多数功能就没有办法初始化,也不能芯片功能验证,Power On Exit的条件就不能满足,如果拖的太久,整个Power On任务就失败了。
为了避免失败,如何让内存子系统带病工作,甚至内存系统不工作,也能让BIOS跑下去,成了PO的Plan C甚至是Plan D。除了让内存降速工作这种常规手段之外,如何找到实际内存的替代品,成了一个难题。
当时还没有CXL,所以显卡的内存,就寄托了全村人的希望。从原理上来讲,这没有问题。大家都知道,内核的寻址decode,实际上是将地址放在内部总线上,寻求响应的一个过程。这个过程是,从内部总线到外部总线,甚至到LPC反向译码,这样一个从内到位,从中心到外围的一个地址信号寻求响应的一个传播过程。CPU内部的内存子系统没有响应,就会放在IO子系统中,如果它们响应了,寻址就完成了。从这个角度看,mmio和实际的memory,没有本质上的区别(当然性能差远了)。
所以,作为初始化整个系统的抓手,BIOS这边只要这样修改就可以了:
- 在内存系统初始化失败之后,hard code代码找到显卡所在的root port。
- 手动给root port设置bus和decode区间。
- 因为显卡的显存往往暴露在显卡的PCIE bar(ecam)上,所以手动设置这个BAR,把想要用作这种操作的地址设置上去。
- 就像实际内存一样,把这块内存汇报给BIOS中的GCD,当做紧急内存,系统就可以跑下去了
- 别忘了在BIOS的PCI枚举的时候,把这个root port摘出来,要不被重新初始化后就不能用了。
- BIOS会正常在报OS的时候,memory map中将它标记为传统内存(毕竟自己前面也被骗了)
- OS注意驱动不能加载这个显卡的驱动
这样可以整个跑通,不过性能非常非常糟糕,毕竟内存寻址绕了一大圈。
最后说一下发散一下,其实可以考虑在内存可用的时候,把不用的显存也设置可用,只是把显存作为远端内存,内存作为近端内存,就像2LM、CXL这种用法,可能更好。
欢迎大家关注本专栏和用微信扫描下方二维码加入微信公众号"UEFIBlog",在那里有最新的文章。关注公众号,留言“资料”,有一些公开芯片资料供下载。
