
概览, 安装和基本编程步骤
级别: 中级
Jonathan Bartlett [johnnyb@eskimo.com], 技术总监, New Medio
原文: Programming high-performance applications on the Cell BE processor, Part 1: An introduction to Linux on the PLAYSTATION 3
译: 赵珂 cn.zhaoke.com
http://blog.zhaoke.com/65.html
2007年1月21日
Sony® PLAYSTATION 3 (PS3)是程序员为Cell BE处理器开发程序最方便和最经济的途径. 我们可以了解如何使用PS3, 如何为PS3安装Linux, 如何开始为Cell BE处理器开发程序.
PLAYSTATION 3不是一款普通的游戏主机, 两个原因: 第一, 很难相信它比以往任何一款游戏主机都要开放. 其它游戏主机总是想方设法来阻止未授权用户使用他们的系统. PS3没有这么做, 甚至你还可以直接安装和引导其它的操作系统. 当然很多游戏相关的功能比如视屏加速不能在第三方的操作系统上运行. 本系列文章更多关注于科学和通常的应用程序.
图一: Cell Be芯片

PS3的核心部件是处理器 -- Cell宽带引擎芯片(通常叫做Cell BE芯片, 见图一). Cell BE架构采用了全新的设计. 处理器是一个内置9个处理单元的芯片(注: PS3关闭了其中一个, 另一个保留给系统, 剩下的7个可用). 核心处理单元是一个十分标准的通用处理器, 基于PowerPC的双核单元, 叫作主处理单元, 或简称PPE. 其它8个处理单元有它们各自的用途.
图二: Cell Be架构

补充: PS3上的Linux内核

Cell BE处理器的其它处理单元叫做协处理单元, 或SPE, 每一个SPE包括:
. 一个向量处理器, 叫做协处理单元, 或SPU(见图二)
. 一个位于SPU的私有内存区域, 叫做本地存储(PS3上该区域的大小为256K)
. 一套用于外部连接的通信通道
. 一套寄存器, 共128个, 每个128位宽(每个寄存器同时能存储4个32位值)
. 一个内存流控制器(MFC), 用于管理SPU本地存储与主内存之间的DMA传输(见图二).
SPE缺少处理器大多常用的功能. 它根本不适合执行通常的操作系统任务, 不支持虚拟内存, 不能直接访问计算机的内存, 中断方面也有特别的限制. SPE处理器专用于尽可能快的处理数据.
因此, PPE用作资源管理器, SPE用作数据处理. 在PPE上, 程序被分成多个任务, 接着由SPE来处理, 然后它们互相交换数据.
SPE和PPE通过EIB总线(见图二)相互连接. EIB是数据传输的主要通道.
最令人惊讶的设计部分是SPE的LS(LS全称为Local Store, 即本地存储, 大小为256K. 见图二)不是缓存. -- 事实上SPE把所有的内存都用于程序和数据. 这似乎是一个缺点, 但实际上有以下几个好处:
.LS内存的访问速度比主内存快很多.
.访问LS内存可以减少时钟周期.
.可以异步请求从内存移进和移出数据.
基本上, LS拥有缓存所有的速度优势. 然而, 自从程序可以直接使用它, LS采用了更好的管理方式. 有需要的时候请求载入数据, 在等待数据加载的时候执行其它的任务.
为专门硬件设计的Cell BE处理器推出已有一段时间, PS3是第一个买的起而且正在出售的Cell BE设备, 安装Linux后, 你可以为Cell BE开发应用程序.
它可以运行Linux吗? 如何配置?
游戏主机允许安装其它的操作系统是很不平常的. 为了减少销售下滑, 厂商通常会通过锁定系统来防止运行没有向自己交纳许可费用的游戏. Sony开放了PS3游戏主机的少数几个地方, 可以安装第三方操作系统, 但不能使用图形加速功能.
现在你可以在PS3上安装Linux, 虽然需要跳过几个限制, 但是最终linux系统能够工作. Terra Soft Solutions与Sony协作开发了可在PS3上运行的Yellow Dog Linux 5系统, 甚至还提供专属功能. Yellow Dog Linux(也称做YDL)最初是一个基于PowerPC的发行版, 所以你不会惊讶Sony为什么会跟Terra公司协作开发专门的YDL for PS3版本.
图三: Yellow Dog Linux for PS3

下面介绍如何在PS3上安装YDL 5 Linux系统.
准备工作
开始安装Linux前, 你需要如下附件:
.显示器和显示连接线
.USB键盘
.USB鼠标
.USB闪存盘
图四: 20G硬盘的Sony PS3

视屏显示有一些麻烦. 首先, 20GB的PS3(见图四)只提供模拟合成RCA插口, 可用于连接TV类的输出设备. 当然也可以通过专门接口转换成VGA信号(请查阅参考资源栏目). 令人遗憾的是, 屏幕只支持576x384显示分辨率. 如果你需要更高的显示分辨率, 你不得不使用HDMI端口. 然而, 这会引起其它的问题. 虽然HDMI可以简单地通过专属接口转换成DVI格式. 这样一来我们就可以使用DVI兼容的显示器了吗? 不能. PS3内有一个叫做HDCP的内容保护协议. 当输出数据通过HDMI端口的时候, PS3将不会向非HDCP兼容的设备输出任何数据. 因此, 除非你的显示器是HDCP兼容的, 否则你将不能获得数字输出信息. 我想你会继续使用576x384模式(虽然一些报道说可以使用视屏输出组件获得更高的显示分辨率).
PLAYSTATION 3准备工作, 执行下面步骤:
1. 连接以太网线到PS3, 确认网络上至少有一台运行的DHCP服务器.
2. 如果你的PS3购买后没有使用过, 继续下面步骤, 屏幕提示首次启动, 包括安装, 时间, 和PS3系统的用户名.
3. 选择设置(Settings), 然后系统设置(System Settings), 选择格式化工具(Format Utility).
4. 选择格式硬盘(Format Hard Disk), 两次确认你的选择.
5. 选择你需要自定义(Custom)的分区.
6. 选择你需要分配10GB给其它操作系统(Allot 10GB to the Other OS). 这将会自动保留剩下的磁盘空间给PS3游戏操作系统. 完成后, 重启系统.
7. 当系统重启后, 选择设置(Settings)然后更新系统(System Update).
8. 选择通过互连网更新(Update via Internet).
9. 按照屏幕提示通过下载和安装最新的系统更新软件包来完成系统更新. 一些屏幕只有取消按钮, 没有直接提供任何选项告诉你如何继续安装. 为了继续下面的安装, 在你的控制器上按下X按钮.
10. PS3重启后, 接下来可以安装Linux操作系统了.
准备安装
现在你可以为安装linux做一些准备. 下面是你的计算机上需要做的一些准备工作:
1. 下载和刻录YDL 5 DVD ISO. PS3没有CD设备, 只支持DVD.
2. 从Sony(查阅资源栏目)网站下载PS3其它系统安装程序, 保存为otheros.self. 该文件运行在PS3游戏操作系统上, 用于安装其它系统的bootloader(引导加载程序).
3. 从Terra Soft网站下载YDL bootloader(再次, 查阅资源栏目), 保存为otheros.bld. Sony installer(安装程序)将安装此bootloader.
4. 接入USB闪存盘到你的计算机.
5. 在你USB闪存盘的根目录, 创建一个PS3目录. 然后马上在PS3目录下创建otheros目录.
6. 拷贝先前下载的两个文件, 分别是otheros.self和otheros.bld到你刚在USB闪存盘内创建的PS3/otheros目录.
现在你可以开始安装Linux了.
执行安装
在PS3上执行下面步骤安装Linux:
1. 从计算机上移去USB闪存盘然后接入到PS3上.
2. 选择设置(Settings), 然后系统设置(System Settings), 然后选择安装其它操作系统(Install Other OS).
3. 确认安装程序(installer)的位置, 然后继续屏幕安装提示. 注意现在仅安装了bootloader(引导加载程序), 没有安装操作系统.)
4. 安装程序完成后, 选择设置(Settings), 然后系统设置(System Settings), 然后选择缺省系统(Default System). 然后选择其它操作系统(Other OS)和按下X按钮.
5. 放入YDL 5 DVD光盘.
6. 连接上你的USB键盘和鼠标.
7. 现在重启系统. 你可以通过按注控制器上的PS按钮或选择关闭系统(Turn off the system), 或简单按下电源(power)按钮5秒钟. 然后系统重启.
8. 重新引导后, 系统应该开始引导linux系统, 因为bootloader实际上开始载入kboot来引导linux内核.
9. kboot引导后: 提示, 如果你的输出是通过HDMI端口, 输入install. 如果是模拟模式, 输入installtext. 下面步骤假设你使用了installtext选项, 否则其它选择会有一些不同.
10. 媒介确认完后, 屏幕的蓝色区域提示Trackback错误. 直接忽略继续下面安装步骤.
11. 当询问分区的时候, 不要在意删除PS3游戏操作系统. PS3的其它操作系统模式只允许客户操作系统看到自己的分区. 甚至低级工具也不看到硬盘上的其它分区. 所以使用YDL删除硬盘上的所有数据, 然后移去所有的分区和创建新的分区.
12. 当开始安装软件包的时候, 大概持续1个小时. 然而, 系统不会安装所有DVD上的软件包.
13. 当重新启动的时候, 如果你选择的是模拟输出, 你需要在kboot提示时输入ydl480i. 否则系统会输出不适合于模拟显示的分别率.
14. 开始引导后, 进入到安装工具窗口. 你真的不需要做任何事情. 如果你没有做任何时候, 一定时间后将继续引导直到完成引导过程.
现在YDL 5已经安装到你的PS3上!
后续安装
不幸的是, 安装程序不会注意到所有的细节, 特别是模拟显示. 仍有一些步骤需要完成, 如果你希望在正确的分辨率下自动引导系统, 你需要在模拟设备上配置X Windows System和安装Cell BE SDK软件开发工具包. 为了完成所有的这些工作, 返回到上面的步骤确认光驱放入YDL 5 DVD, 像下面一样加载光盘:
mount /dev/dvd /mnt
接下来所有的命令将假设安装光盘以上面的方式加载, 注意你需要用root登陆系统.
为了使模拟系统能够在启动后进入到正确的分辨率, 你需要编辑/etc/kboot.conf文件, 然后修改default=ydl为default=ydl480i, 保存文件.
如果你希望模拟设备运行X Windows System, 你需要安装和运行Xautoconfig软件包:
rpm -i /mnt/YellowDog/RPMS/Xautoconfig-*
Xautoconfig
现在你可以通过运行startx启动X Window System. 虽然在模拟设备模式下你的屏幕显示区域很小. 这里有一个快速提示可以帮助你移动屏幕: 同时按住alt+左鼠标按钮, 你将可以在桌面上拖动屏幕, 甚至你看不到的主题区域.
如果你希望的系统在启动后进入图形登陆界面, 你需要编辑/etc/inittab文件, 修改id:3:initdefault:为id:5:initdefault:, 然后保存文件. 然后当你再次重新启动系统后, 你将进入到图形登陆界面. 记住重新启动系统后, DVD光驱还是以上面的方式加载. 注: Nautilus会加载DVD到其它的目录, 所以如果你使用Nautilus加载你的DVD, DVD被加载后, 目录将不是/mnt而是/media/CDROM.
现在开始安装Cell BE SDK V2.0软件开发工具包. 首先确认系统是否已经安装, 简单输入spu-gcc. 如果系统上没有发现该程序, 显然SDK还没有安装. 请按下面步骤安装SDK:
cd /mnt/YellowDog/RPMS
rpm -i spu-binutils-* spu-gcc-* spu-gdb-* spu-utils* libspe-devel-*
然而, DVD安装光盘没有包含一套重要的软件包 -- 64位版本的libspe. 不过, 这个问题很容易解决. 直接到DVD网站(或原DVD)下载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安装和配置完毕, 你可以使用YDL Linux系统了!
一些用户可能回疑惑: 如何返回到游戏操作界面, 当你想玩PS3游戏. 按下面步骤操作, 在kboot提示符或从命令行运行boot-game-os. 如果由于某些原因Linux引起一些错误或者不能进入到游戏操作系统, 你还可以通过关闭PS3进入到游戏操作系统, 按住电源(Power)键5分钟(直到听到一声嘟嘟响)系统会重新启动. 或者上面的方法都不能进入游戏操作系统. 你还可以在linux环境下设置游戏操作系统为缺省操作系统: 重新引导进入Linux, 然后设置缺省引导为其它操作系统(Other OS).
我已经安装好Linux, 现在做什么?
现在你已经安装了Linux和Cell BE SDK. 接下来介绍如何使用PS3进行程序开发. 然而, 对于初学者来说, 首先了解一下如何通过C程序使用PPE和SPE.
在了解工作原理之前, 看一下开发Cell BE程序需要使用到的一些常用工具:
.gcc
我们信赖的编译器, 可以为PPE生成PPC Linux binaries(二进制文件). 使用-m64选项生成64位的可执行文件.
.spu-gcc
这也是我们信赖的编译器, 专为SPE生成代码.
.embedspu
这是一个特别的工具, 它把SPE程序转换成目标文件, 然后目标文件用于生成PPE执行程序. 它也可以为SPE程序创建一个全局变量, 因此PPE能够把程序加载到SPE中, 然后程序在需要的时候运行. 你还可以使用-m64标志嵌入64位的PPC程序.
如果没有SPE, Cell BE处理器上的编程跟其它基于PowerPC的系统一样. 当然你也可以假装它们不存在, 代码也能很好的工作. 然而这会影响到计算能力. 为了更好地利用SPE, 你需要的深入地了解SPE编程.
如果你不清楚Cell BE技术, 记住PPE是系统资源管理器. 它用于处理操作系统任务, 控制内存访问和SPE. PPE代码用于初始化程序, 为任务建立单个或更多的SPE, 执行输入和输出. 当然, PPE也能够执行处理任务, 但是通常SPE来处理所有任务.
现在我们来看一个简单的程序, 如何在SPE上执行处理任务. 程序非常初级 -- 它将计算在指定的速度(每小时英里)和时间(小时)计算旅行的距离. 下面是PPE代码(文件名输入为ppe_distance.c):
列表1. 方程组求解 - PPE代码
#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_create_thread函数返回SPE任务的ID号, 然后你可以把返回的任务ID号作为参数给spe_wait. 当SPE任务终止, spe_wait返回.
下面是SPE代码(文件名输入为spe_distance.c):
列表2. SPE计算实例
#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程序, 上面内容只是一个大致的介绍. 指针作为第三参数传输给spe_create_thread, 在程序中它作为program_data_ea, EA的意思是有效地址, 从主PPE程序来看, 它是主内存地址. 自从SPE不能直接访问主内存, 你不能以指针的方式来释放它. 替代的是, 你必须启动一个传输请求来拷贝数据到你的本地存储(LS). 一旦数据传输到你的本地存储, 你将能够通过本地存储地址访问数据, 本地存储地址有时候也缩写为LSA.
mfc_get把数据传输到本地存储. 注意PPE和SPE的struct被排列成16个字节和填充为16个字节. 我们将在下面章节更加深入地了解, 但是对于大多的DMA传输必须被排列成16个字节宽和多个16字节大小. tag_id允许你获得DMA操作的状态. 数据传输完后, 下面的两个函数引起程序等待直到传输结束.
主要的处理十分简单 -- 不过是速度乘上时间. 数据处理完后, mfc_put把数据传送到主内存, 下面的两个函数引起等待直到传输结束. 当所有的工作完成后, 程序退出.
现在你可以编译和运行程序. 过程上十分简单:
#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程序成功运行. 你已经知道如何写简单的Cell BE程序.
结论
虽然你不能在PS3上直接开发程序, 但是PS3支持第三方的操作系统, 你可以在PS3上安装Linux. 安装Linux会耽误你的一点时间, 但是最终你获得一个经济可用的Cell Broadband Engine处理器. 下一篇文章, 我们将深入了解Cell BE的编程和利用SPE来提高数据的处理速度.
参考资料
.您可以参阅本文在 developerWorks 全球站点上的 英文原文 。
.购买Yellow Dog Linux 5, 请访问Terra Soft Solution公司的网站.(你也可以从他们的网站镜像获得)
.你可以从YDL网站下载bootloader, 请确认文件名为"otheros.bld".
.你可以从Sony网站下载其它操作系统安装程序. 请确认文件名为"otheros.self".
.如果你的显示器需要使用模拟输出方式连接到PS3. 这款电缆声称支持, 价格也非常实惠. (我没有亲自测试过该电缆, 所以无法告诉你它的质量如何.)
. YDL安装手册.
. YDL网站上有关PS3视屏支持的网页.
. Fedora Core 5可以在PS3上运行, 虽然没有官方支持. 安装Fedora, 你需要Fedora Core 5 PPC DVD安装光盘和FC5 PS3 AddOn DVD和安装手册(中文版). 另外注意AddOn DVD已经包含Cell SDK, 而且AddOn DVD还包括ppu-gcc(PPE上的gcc编译器)和ppu-embedspu(embedspu工具).
.Gamasutra网站有另一篇在Linux上为PS3开发应用程序的文章. 然而, 它使用的函数copy_from_ls没有包含在SDK中, 它是一段来自于Cell BE模拟器的代码实例程序.
. IBM Cell BE资源中心包含了许多有关部门PPE, SPE, EIB等更多的相关链接.
. IBM也收集了整套Cell BE文档.
关于作者
Jonathan Bartlett 是 Programming from the Ground Up 一书的作者,这本书对使用 Linux 汇编语言的编程进行了简介。他是 New Medio 的开发主管,为客户开发 Web 应用程序、视频应用程序、kiosk 应用程序和桌面应用程序。
相关文章
在Sony PS3游戏机上安装Fedora Core 5
备注
转载请保持文章完整性, 欢迎到blog.zhaoke.com网站与赵珂交流.
Islab





赵珂网志 :: 两个开放的游戏平台 | 2007-01-24 20:37 | 固定链接
[…] 相关文章 为Cell BE处理器开发高性能的应用程序, 第一部分: PLAYSTATION 3上的Linux介绍(附图) Second Life(第二生命)的开源状况 […]