有關hacking PS3 RSX的一些感想和記錄

2022-05-17 16:01:14 字數 1347 閱讀 5658

託幾個大黑客的福,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:

一切的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進行操縱。

Python學習(3)有關函式

1.函式定義 def 名字 arg1,arg2,arg3 語句 return 值 可以沒有return,進行到末尾自動退出 2.作用域 大多數 作用於查詢從區域性 全域性 內建 global把名字對映到包含它的模組的作用域中,即 可在函式內部宣告乙個作用在全域性的變數global x x 99 全域...

3Dmax 匯入 Ogre 有關文章

ogremax匯出的.scene到底要如何才能被nxogre順利載入,並且能解析.scene裡面的mesh模型呢?scene直接用ogre載入並解析就可以.nxogre如果要載入動態的模型直接使用mesh載入,並在程式裡面設定碰撞模型,如果是靜態模型,則需要將mesh轉換成nxogre指定的nxs格...

W3C尋求有關CSS3的反饋

css3已經使用了很多年,具有許多新功能和改進,因此該規範必須分解為30個模組 這些模組中的大多數計畫在明年一年半內完成。按照路線圖 背景和邊框模組是最長的模組之一 該模組負責從多個背景影象到基於影象的邊框的全部增強功能,該模組負責克服目前視覺設計的許多侷限性,這些侷限性目前存在於應用於語義正確 x...