您的位置:首页 > 其它

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

2008-07-24 00:34 155 查看
托几个大黑客的福,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进行操纵。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: