有关hacking PS3 RSX的一些感想和记录

时间:2024-04-02 14:56:45

托几个大黑客的福,firmware 2.0及以下的PS3可以使用“部分”GPU(Nvidia RSX)的功能。最近花不少时间在这上面,也让自己对GPU底层和工具链有个大概了解。

 

在PS3里,在最底层有个提供硬件功能接口的操作系统,姑且称之为Level 1。其上的任何操作系统都使用需要通过Level 1的API和硬件接口进行交互,姑且称之为Level 2。以这个概念,目前PS3上运行的默认操作系统(GameOS)和其他第三方可提供的操作系统(OtherOS)都是Level 2 OS。SONY出于很复杂的目的,在一定程度上开发了第三方操作系统的可能性,称之为OpenPlatform。具体来说它是安排了一个自己的职员,专门为PS3维护linux内核。由于内核必须是开放的,尽管其中只有很少对于Level 1 OS的系统调用且没有注释,还是给了黑客们机会,这里有一个收集并描述Level 1 API的wiki:http://wiki.ps2dev.org/ps3:hypervisor

 

一切的hacking都从这些API开始。通过摸索、试验、****分析dump,并利用nouveau开源驱动项目,最终黑客们找到了一些解决办法来驾驭GPU。

 

Nvidia系列GPU都有一个FIFO的环形队列(command buffer)供存放GPU指令。这块存在于系统内存的区域大约是64KB(还是2MB记不清?)。有一个类似于程序指针PC的指针(寄存器),指向FIFO。而另一个指针(寄存器)则标注着目前GPU的队列尾。一旦这两个指针不匹配,前者就会一个个将队列中的指令DMA到GPU,直到和后者重合。所以我们要做的就是把正确的指令填入这个FIFO,以期待最后GPU会把我们的指令一一执行。

 

由于实现一套driver和图形API的代价太大,几乎很难以个人力量完成。所以没有driver,没有图形API,没有任何资源管理,所有的一切都只有FIFO和指令。这有点类似官方SDK中的libgcm库,可以绕过PSGL的下层,对command buffer进行一些操作,如传入预编译的指令队列等。

 

其实最令人感到不适的还不是图形API的缺失。由于硬件指令是不公开的,所以这里需要通过nouveau的项目资源,以及一些dump来分析NV40系列的指令。有些可以正常使用,另一些则不然(如vp中的ADD和fp中的MOVR,总是无法正确输出float4的色彩)。还没完,即使完全掌握了这些硬件指令,没有一个assembler或高级语言编译器的话,写shader会变得无比痛苦。所以目前的工具链是这样的:在PC上写完Cg,使用Cg编译器输出vp20和fp30的汇编代码。在PS3 Linux上已经有写好的assembler,可以将汇编代码翻译成硬件指令。所以写一个shader会在两个平台上来回切换,忙的不亦乐乎。

 

我想以后的工作可以包括一些简单的资源管理和队列管理的工作,包括显存分配、资源缓存和换出,这样一个简单的"driver"可以大大增强目前的创造能力,以及今后对于Cell的开发的可视化能力。

 

最后放一张screenshot,利用SDL可以近乎完美使用SIXAXIS进行操纵。

有关hacking PS3 RSX的一些感想和记录

转载于:https://www.cnblogs.com/eygneph/archive/2008/07/24/1250087.html