級別: 中級
Jonathan Bartlett ([email protected]), 技術總監, New Media Worx
2007 年 2 月 05 日
Sony® PLAYSTATION® 3(PS3)對於程序員來說是嘗試使用新 Cell Broadband Engine™(Cell BE)處理器進行開發最簡單也是最經濟的方法。本文將探索這個領域中的內容,介紹如何在 PS3 上安裝 Linux®,如何開始在 PS3 上針對 Cell BE 處理器進行開發。PLAYSTATION 3 是一款不同凡響的游戲機,原因有二。首先,與以往任何游戲機相比,它的開放性要好很多。大部分控制台都通過執行所有可能的操作來防止未經授權的游戲在其系統上運行,而 PS3 卻反其道而行之,甚至為安裝並引導其他操作系統提供直接支持。當然,很多與游戲相關的特性,例如視頻加速,並不對第三方操作系統開放,不過本系列關注的只是一些通用和科學計算用應用程序(所以這些游戲特性並不重要)。
PS3 的中心是它的處理器 —— Cell Broadband Engine 芯片(通常稱為 Cell BE 芯片)。Cell BE 體系結構與傳統處理器的設計有根本的區別。Cell BE 處理器是由 9 個處理元素 構成的芯片(注意 PS3 上禁用了其中的一個,另外一個保留給系統使用,其他 7 個處理單元可用)。主處理元素是一個非常標准的通用處理器。這是一個雙核的基於 PowerPC® 的元素,稱為 Power Processing Element,或簡稱為 PPE。不過,另外 8 個處理元素與此完全不同。
Cell BE 中的其他處理元素稱為 Synergistic Processing Elements,或簡稱為 SPE。每個 SPE 包括:
一個向量處理器,稱為 Synergistic Processing Unit,或 SPU SPU 中的一個私有內存區域,稱為本地存儲(PS3 上這個區域的大小是 256K) 用來聯系外部世界的一組通信通道 一組 128 個寄存器,每個 128 位寬(每個寄存器通常都可以用來同時保存 4 個 32 位的值) 一個 Memory Flow Controller(MFC),它負責管理 SPU 的本地存儲和主存之間的 DMA 傳輸不過,SPE 缺少一般處理器中的大部分通用特性。它們根本不能執行常見的操作系統任務。它們沒有虛擬內存的支持,不能直接訪問計算機的 RAM,中斷支持也非常有限。SPE 處理器只專注於盡快處理數據。
因此,PPE 可以作為資源管理器使用,SPE 可以作為數據處理器使用。PPE 上的程序可以將任務分解到 SPE 上完成,然後相互傳輸數據。
將 SPE、PPE 和主存控制器連接在一起的是一個名為 Element Interconnect Bus 的總線。這是數據傳輸的主要通道。
這種設計最令人驚訝的地方是 SPE 的 256K 本地存儲並不是緩存 —— 它實際上是 SPE 在給定時間為程序和數據提供的全部內存。這看起來似乎是個缺點,但是它實際上卻具有以下幾個好處:
對本地存儲內存的訪問與主存訪問相比速度更快。 對本地存儲內存的訪問的預測可以精確到時鐘周期級別上。 可以異步請求將數據移入/移出內存,並可提前進行預測。基本上,它具有緩存的全部速度優點。由於程序可以直接、顯式地使用該內存,因此管理方式更加智能。它可以請求數據在需要之間就被加載,然後可以在等待加載數據的同時繼續執行其他任務。
盡管 Cell BE 處理器作為一種專用硬件已經存在很長一段時間了,但 PS3 是第一個較為經濟並能可靠使用的基於 Cell BE 的設備。使用 Linux,任何人都可以在上面進行編程。
在 PS3 上運行 Linux?如何安裝呢?
對於游戲機來說,允許在上面安裝其他操作系統並不常見。由於控制台銷售價格都很低,因此它們通常都對系統進行了加鎖以防止未向控制台開發者支付版稅的游戲在上面運行。Sony 決定使自己的 PS3 控制台開放一些,允許在上面安裝第三方操作系統,並同時警告這樣做將不能獲得圖形加速。
由於這個原因,您現在才可以在 PS3 上安裝 Linux。不過,需要費些周折,不過這的確可行。Terra Soft Solutions 已經與 Sony 公司合作特別為 PS3 開發了 Yellow Dog Linux 5。它甚至還為 PS3 上的發行版提供目前為止的獨家支持。Yellow Dog Linux(也稱為 YDL)從最初開始就是一個專用的基於 PowerPC 的發行版,因此 Sony 與它簽約開發專用於 PS3 的下一個 YDL 版本也不足為奇。
下面介紹在 PS3 上安裝 YDL 5 的操作步驟。
准備 PS3
要安裝 Linux,需要幾個額外硬件:
顯示設備和適當的電纜 USB 鍵盤 USB 鼠標 USB 閃盤在顯示設備上,有幾個問題要格外注意。首先,20GB PS3 只提供了一個模擬復合 RCA 插口,用來連接電視之類的模擬輸出設備。您可以通過一條專用的電纜將其轉換成 VGA (更多信息請參看 參考資料)。不幸的是,分辨率只能達 576x384。如果您希望獲得更好的分辨率,就只能使用 HDMI 端口。然而,這會導致其他問題。通過一條電纜可以很容易地將 HDMI 轉換成 DVI。因此它應該能夠輸入到兼容 DVI 的顯示器上,對嗎?但事實並非如此。這是因為有一種內容保護協議,稱為 HDCP,當通過 HDMI 端口輸出數據時,PS3 不會輸出任何數據到不兼容 HDCP 的設備。因此,除非您的監視器是 HDCP 兼容的,否則就無法使用它來獲得 PS3 上的數字輸出信號,您只能使用 576x384 的分辨率(不過,據說使用組件視頻輸出而不是復合輸出可以實現更高的分辨率)。
要准備 PLAYSTATION 3,請執行下面的步驟:
將以太網線連接到 PS3 上。請確保網絡上已存在一個 DHCP 服務器。 如果這是一個新出廠的 PS3,請按照首次引導時的提示來進行設置,包括設置語言、時間和 PS3 系統使用的用戶名。 轉到 Settings,然後選擇 System Settings,再選擇 Format Utility。 選擇 Format Hard Disk,並再次確認您的選擇。 選擇您希望使用的 Custom 分區模式。 選擇希望 Allot 10GB to the Other OS。這會自動保留剩余的磁盤空間給 PS3 的游戲操作系統。在完成之後,就會重新啟動系統。 當系統重新啟動時,選擇 Settings,然後再選擇 System Update。 選擇 Update via Internet。 根據系統更新屏幕提示下載並安裝最新的系統更新包。有些屏幕只有取消按鈕,而沒有提示如何進一步操作。要在這些屏幕上繼續向前運行,請使用控制器上的 X 按鈕。 當 PS3 重新啟動之後,接下來就可以在上面安裝 Linux 了。准備安裝
現在可以開始准備 Linux 這邊的東西了。下面是為了准備安裝而需要在計算機上(而不是 PS3 上)執行的操作步驟:
下載並刻錄 YDL 5 DVD ISO 文件。不能使用 CD 盤安裝,PS3 只支持 DVD。 從 Sony 網站上下載 PS3 OtherOS 安裝程序(請參看 參考資料),並將其保存為 otheros.self。該文件在 PS3 游戲操作系統上運行來安裝其他引導程序。 從 Terra Soft(同樣請參看 參考資料)上下載 YDL 引導程序,並將其保存為 otheros.bld。這是 Sony 安裝程序要安裝的引導程序。 將一個 USB 閃盤安裝到計算機上。 在閃盤根目錄中,創建一個名為 PS3 的目錄。在這個 PS3 目錄中,創建另外一個名為 otheros 的目錄。 將所下載的另外兩個文件(otheros.self 和 otheros.bld)復制到剛才在閃盤上創建的 PS3/otheros 目錄中。現在可以安裝 Linux 系統了。
執行安裝
執行以下步驟,將 Linux 安裝到 PS3 上。
將閃盤從計算上拔出,並將其插入到 PS3 上。 轉換到 Settings,然後選擇 System Settings,再選擇 Install Other OS。 請確認安裝程序的位置,並按照屏幕提示執行後面的安裝過程。請注意這只安裝了引導程序,而沒有安裝操作系統。 當安裝程序完成時,切換到 Settings,然後選擇 System Settings,再選擇 Default System。然後選擇 Other OS,再按 X 按鈕。 插入 YDL 5 DVD。 插入 USB 鍵盤和鼠標。 現在重新啟動系統。您可以通過按控制器上的 PS 按鈕然後選擇 Turn off the system 來重新啟動系統,或者通過按電源按鈕 5 秒鐘來重新啟動系統。之後系統就又啟動起來了。 它重新引導時,看起來就像是在引導 Linux。這是因為這個引導程序實際上是一種裸 Linux 內核,稱為 kboot。 在出現 kboot: prompt 時,如果您是通過 HDMI 端口輸出的,就輸入 install;如果是通過模擬方式輸出的,就輸入 installtext。下述步驟假設您選用的是 installtext,不過區別不大。 在驗證媒體之後,它可能會在屏幕上的藍色區域顯示一個 Traceback 錯誤。我們只需要忽略這個錯誤並按照安裝屏幕的提示繼續進行即可。 在看到詢問分區問題時,不要擔心它會刪除 PS3 游戲操作系統。PS3 的 Other OS 模式只允許客戶操作系統看到磁盤上自己使用的部分。即使是底層工具也看不到磁盤的其他部分。因此可以繼續並讓 YDL 刪除磁盤上的所有數據,然後讓它刪除所有的分區並創建默認的分區布局。 在軟件包的安裝階段,可能需要大約 1 個小時來安裝軟件包。然而,這不會安裝整個 DVD。 在它重新引導時,如果您使用的是模擬輸出,就需要在 kboot: boot 提示符後面輸入 ydl480i。否則它就很可能會將輸出更改為模擬輸出所不能支持的分辨率。 在它引導時,它會啟動一個設置工具。現在您不需要做任何操作。如果您不進行任何操作,它就會超時,然後完成引導過程。現在一切就緒!YDL 5 已經安裝到 PS3 上了!
安裝後的設置安裝程序並不會關注所有細節,尤其是對於模擬顯示設備來說更是如此。如果您希望實現一些功能,例如自動使用正確的分辨率來引導系統,則需要再執行幾個步驟,在模擬設備上配置 X Window System,安裝 Cell BE SDK。要執行這些步驟,需要確保 YDL 5 DVD 已經在驅動器中,並這樣掛載它:
mount /dev/dvd /mnt
後面所有的操作都假設安裝 DVD 是這樣掛載的,而且您是以 root 用戶身份登錄的。
要讓模擬系統在啟動時就引導到正確的分辨率,請編輯文件 /etc/kboot.conf,將 default=ydl 這行內容修改為 default=ydl480i 並保存文件。
如果您希望為自己的模擬設備配置 X Window System,就需要按照下面的方式來安裝並運行 Xautoconfig 包:
rpm -i /mnt/YellowDog/RPMS/Xautoconfig-* Xautoconfig
現在您可以通過運行 startx 來啟動 X Window System,不過在模擬設備上您的屏幕就會顯得有些太小了。下面是可以幫助您在這樣小的設備上進行操作的一個快速提示:即使看不到標題條,按下 alt+鼠標左鍵 也可以讓您在桌面上拖動屏幕。
如果您希望自己的系統在系統引導時就有一個圖形化的登錄界面,就需要編輯 /etc/inittab 文件。將 id:3:initdefault: 行的內容修改為 id:5:initdefault: 並保存文件。現在當重新啟動系統時,就會出現一個很好的圖形化登錄界面。記住在重新啟動系統之後,還要像前面一樣掛載 DVD 才能完成其余的步驟。注意 Nautilus 實際上會將其掛載到一個不同的位置,因此如果您使用了 Nautilus 來掛載自己的 DVD,它會掛載到 /media/CDROM 上,而不是 /mnt 處。
現在讓我們來安裝 Cell BE SDK V2.0。要查看它是否已經被安裝程序安裝了,可以簡單地執行 which spu-gcc。如果找不到這個程序,那麼 SDK 就沒有安裝。要安裝它,需要執行下面的命令:
cd /mnt/YellowDog/RPMS rpm -i spu-binutils-* spu-gcc-* spu-gdb-* spu-utils* libspe-devel-*
然而,有一組重要的包在 DVD 中並沒有包括,它就是 64 位版本的 libspe。這個問題很容易解決。可以從資源 DVD 或 Web 站點上下載 libspe 的 SRPM(名為 libspe-1.1.0-1.src.rpm)。然後到下載目錄中執行下面的步驟:
rpm -i libspe-*.src.rpm cd /usr/src/yellowdog/SPECS rpmbuild -bb --target ppc64 libspe.spec cd ../RPMS/ppc64 rpm -i elfspe-* libspe-*
現在您已經做好所有的准備了。YDL 已經安裝、配置好並且可以運行了!
您可能會疑惑如何回到游戲操作系統中呢?因為您可能會希望玩 PS3 上的一兩個游戲。要回到游戲操作系統,請在 kboot: 提示符或命令行上輸入 boot-game-os 。如果由於某些原因 Linux 產生了錯誤,或者沒有加載,那麼您可以通過關閉 PS3 來加載游戲操作系統,然後在啟動系統時長按開關鍵 5 秒鐘(直到聽到一聲蜂鳴)。這兩種方法都可以加載游戲操作系統,但是這也會將默認操作系統設置為游戲操作系統。因此,要恢復到 Linux 系統,需要回到前面的設置過程,並設置它默認從 Other OS 引導。
好的,我們已經安裝好 Linux 了。接下來應該做什麼呢?
現在您已經完全安裝好 Linux 和 Cell BE SDK 了,本系列文章接下來的部分是關於它的編程和使用的。為了對這些內容有個初步的了解,請參看下面這個用 C 編寫的演示程序,該程序利用了 PPE 和 SPE。
在了解這是如何工作的之前,請先來看一下編譯 Cell BE 程序所使用的一些通用工具:
gcc可信賴的編譯器,用來為 PPE 生成 PPC Linux 二進制程序。使用 -m64 開關可以生成 64 位可執行程序。 spu-gcc這也是 可信賴的一個編譯器,它可以為 SPE 生成代碼。 embedspu這是一個特殊工具,可以將 SPE 程序轉換成一個能被鏈接進 PPE 可執行程序的對象文件。它還會創建一個引用 SPE 程序的全局變量,這樣 PPE 就能夠將程序加載到 SPE 中並根據需要來運行程序了。要嵌入到 64 位 PPC 程序中,請使用 -m64 標記。如果沒有 SPE,Cell BE 處理器的編程與其他基於 PowerPC 系統會十分類似。實際上,您可以假裝 SPE 不存在,代碼依然可以很好地工作。不過,這樣就會導致有很多計算能力沒有被充分利用。要充分利用 SPE 的優點,您只能多費點精力。
如果您是新接觸 Cell BE 技術,請記住 PPE 是系統的資源管理器。它負責處理操作系統任務、管理對內存的訪問並控制 SPE 的工作。PPE 的代碼會負責對程序進行初始化、給一個或多個 SPE 設置任務並執行輸入輸出操作。當然,PPE 也可以執行處理任務,不過通常都是將任務合理地分配給 SPE 執行。
因此,讓我們來了解一下簡單程序是如何構造來在 SPE 上執行處理任務的。這個程序非常基本 —— 它計算在給定速度(單位為每小時英裡數)和時間(單位為小時)情況下的旅行距離。下面是 PPE 的代碼(請將其輸入到 ppe_distance.c 中):
清單 1. 方程求解的 PPE 代碼
#include <stdio.h> #include <libspe.h> //This global is for the SPE program code itself. It will be created by //the embedspu program. extern spe_program_handle_t calculate_distance_handle; //This strUCt is used for input/output with the SPE task typedef struct { float speed; //input parameter float num_hours; //input parameter float distance; //output parameter float padding; //pad the struct a multiple of 16 bytes } program_data; int main() { program_data pd __attribute__((aligned(16))); //aligned for transfer //GATHER DATA TO SEND TO SPE printf("Enter the speed at which your car is travelling in miles/hr: "); scanf("%f", &pd.speed); printf("Enter the number of hours you have been driving at that speed: "); scanf("%f", &pd.num_hours); //USE THE SPE TO PROCESS THE DATA //Create SPE Task speid_t spe_id = spe_create_thread(0, &calculate_distance_handle, &pd, NULL, -1, 0); //Check For Errors if(spe_id == 0) { fprintf(stderr, "Error creating SPE thread!\n"); return 1; } //Wait For Completion spe_wait(spe_id, NULL, 0); //FORMAT THE RESULTS FOR DISPLAY printf("The distance travelled is %f miles.\n", pd.distance); return 0; } 正如前面介紹的一樣,Cell BE 處理器中的 PPE 的主要任務是處理輸入和輸出任務。真正有趣的部分是 spe_create_thread。第一個參數是一個線程組 ID(0 表示應該為這個線程創建一個新組),第二個參數是 SPE 程序的句柄,第三個參數是指向要傳輸的數據的指針,第四個參數是一個可選的環境指針,第五個參數是運行程序希望使用的 SPE 的掩碼(-1 表示可以使用任何可用的 SPE),最後一個參數是希望采用的選項的列表(在本例中,未使用任何選項)。這個函數返回 SPE 任務的 ID 號,然後您可以將它作為 spe_wait 的參數使用。spe_wait 在 SPE 任務結束時返回。
下面是 SPE 的代碼(請將其輸入到 spe_distance.c 中):
清單 2. SPE 計算的例子
//Pull in DMA commands #include <spu_mfcio.h> //Struct for communication with the PPE typedef struct { float speed; //input parameter float num_hours; //input parameter float distance; //output parameter float padding; //pad the struct a multiple of 16 bytes } program_data; int main(unsigned long long spe_id, unsigned long long program_data_ea, unsigned long long env) { program_data pd __attribute__((aligned(16))); int tag_id = 0; //READ DATA IN //Initiate copy mfc_get(&pd, program_data_ea, sizeof(pd), tag_id, 0, 0); //Wait for completion mfc_write_tag_mask(1<<tag_id); mfc_read_tag_status_any(); //PROCESS DATA pd.distance = pd.speed * pd.num_hours; //WRITE RESULTS OUT //Initiate copy mfc_put(&pd, program_data_ea, sizeof(program_data), tag_id, 0, 0); //Wait for completion mfc_write_tag_mask(1<<tag_id); mfc_read_tag_status_any(); return 0; }
後續文章將更加深入地介紹 SPU 編程的知識,這裡只簡單介紹一下。作為第 3 個參數傳遞到 spe_create_thread 的指針會以 program_data_ea 的形式進入這個程序。EA 表示有效地址,這是從主 PPE 程序中看到的主存地址。 由於 SPE 不能直接訪問主存,所以無法直接將其作為一個指針廢棄。相反,您必須發起一個傳輸請求將數據復制到本地存儲中。一旦數據保存到本地存儲中,就可以通過 本地存儲地址(local store address,有時簡寫為 LSA) 來訪問這些數據。
mfc_get 發起到本地存儲的傳輸。注意在 PPE 和 SPE 中,這個結構被對齊為 16 字節,並填充成 16 個字節。在下一篇文章中我們將更詳細地介紹這方面的內容,但是對於大部分 DMA 傳輸來說,都必須 按照 16 字節邊界對齊,並且大小應該是 16 字節的整數倍。tag_id 讓您可以檢索 DMA 操作的狀態。在傳輸之後,接下來的兩個函數可以導致程序等待,直到傳輸完成為止。
主要的處理過程非常簡單 —— 只需用速度乘以時間即可。在數據處理完之後,mfc_put 會發起一個傳輸,傳回主存,接下來的兩個函數會讓您等待 DMA 操作完成。當所有這些操作完成之後,程序退出。
現在您需要編譯並運行這個程序。這實際上非常簡單:
#Compile the SPE program spu-gcc spe_distance.c -o spe_distance #Embed the SPE program into an ELF object file, and eXPose it #through the global variable: calculate_distance_handle embedspu calculate_distance_handle spe_distance spe_distance_csf.o #Compile the PPE program together with the SPE program gcc ppe_distance.c spe_distance_csf.o -lspe -o distance #Run the program ./distance 現在您就擁有了一個可以良好運行的 Cell BE 程序。
結束語
盡管您不能直接在 PS3 上編程,但是 PS3 支持第三方的操作系統,這就讓您可以將 Linux 安裝到 PS3 上。將 Linux 安裝到 PS3 上需要您付出一點努力,但這很值得,因為最終您將獲得一個低成本並能良好運行的 Cell BE 處理器。本系列的後續文章將深入介紹 Cell BE 編程以及如何充分利用可從 SPE 獲得的每一點速度。
參考資料
您可以參閱本文在 developerWorks 全球網站上的 英文原文。 要購買 Yellow Dog Linux 5,請訪問 Terra Soft Solution 的 Web 站點(您也可以在公共鏡像網站上獲得)。 從 YDL 的 Web 站點上獲得 bootloader。請確保將這個文件命名為 “otheros.bld”。 從 Sony 的 Web 站點上獲取 Other OS Installer。請確保將這個文件命名為 “otheros.self”。 對於那些希望通過模擬輸出將 PS3 連接到顯示器上的用戶來說,這條線纜 聲稱可以實現這種功能,而且價格很低(我自己還沒有測試這個線纜,因此無法評論它的品質)。 簡短的 YDL 安裝手冊 也可以供您參考。 YDL Web 站點上有一個關於 PS3 上的視頻支持 的頁面。 Fedora Core 5 也可以安裝到 PS3 上,不過還沒有官方的支持。要安裝 Fedora,您需要 Fedora Core 5 PPC Install DVD、FC5 PS3 AddOn DVD 以及 安裝說明。還需要注意 AddOn DVD 所提供的 Cell SDK 有針對 PPE 的 gcc(名為 ppu-gcc)及 embedspu 實用工具(名為 ppu-embedspu)。 Gamasutra 還有另外一個 introduction to programming the PS3 on Linux。不過,它使用了函數 copy_from_ls,這個函數並未包括在 SDK 中,只能在 IBM 與 Cell BE 模擬器一起銷售的代碼樣例中找到。 IBM Cell BE 資源中心 包括了很多有關 PPE、SPE、EIB 以及更多內容的文章的鏈接。 IBM 還專設了一個空間來放置 全部 Cell BE 文檔。關於作者
Jonathan Bartlett 是 Programming from the Ground Up 一書的作者,這本書介紹的是 Linux 匯編語言編程。Jonathan Bartlett 是 New Media Worx 的技術總監,負責為客戶開發 Web、視頻、kiosk 和桌面應用程序。可以通過 [email protected] 與 Jonathan 聯系。