spufs

名称

spufs - SPU文件系统

描述

SPU文件系统用于实现Cell Broadband Engine架构的PowerPC机器上,以便访问协同处理器单元(SPU)。

该文件系统提供了一个类似于POSIX共享内存或消息队列的命名空间。 拥有文件系统写入权限的用户可以使用spu_create(2)在spufs根目录中建立SPU上下文。

每个SPU上下文都由一个包含预定义文件集的目录表示。 这些文件可用于操作逻辑SPU的状态。 用户可以更改这些文件的权限,但实际上不能添加或删除文件。

挂载选项

uid=<uid>

设置挂载点的用户,默认为0(root)。

gid=<gid>

设置挂载点的用户组,默认为0(root)。

文件

spufs中的文件主要遵循常规系统调用的标准行为,如read(2)或write(2),但通常仅支持常规文件系统上支持的操作子集。 此列表详细说明了支持的操作以及与相应手册页中行为的偏差。

所有支持read(2)操作的文件也支持readv(2),所有支持write(2)操作的文件也支持writev(2)。 所有文件都支持access(2)和stat(2)系列操作,但struct stat的st_mode,st_nlink,st_uid和st_gid字段仅包含可靠信息。

所有文件都支持chmod(2)/fchmod(2)和chown(2)/fchown(2)操作,但将无法授予与可能的操作相矛盾的权限,例如wbox文件的读取访问权限。

当前的文件集是

/mem

SPU的本地存储器的内容。 可以像访问常规共享内存文件一样访问它,并且包含SPU地址空间中的代码和数据。 可对打开的mem文件执行的操作包括

read(2), pread(2), write(2), pwrite(2), lseek(2)

这些操作的文档有说明,但seek(2), write(2)和pwrite(2)不支持超出文件末尾的位置。 文件大小是SPU本地存储的大小,通常为256 KB。

mmap(2)

将mem映射到进程地址空间可以访问进程地址空间中的SPU本地存储。 仅允许MAP_SHARED映射。

/mbox

第一个SPU到CPU通信邮箱。 该文件是只读的,可以32位为单位读取。 该文件只能在非阻塞模式下使用,甚至poll()也不会阻塞它。 可对打开的mbox文件执行的操作包括

read(2)

如果请求的计数小于4,则read返回-1并将errno设置为EINVAL。 如果邮箱中没有可用数据,则返回值设置为-1,errno变为EAGAIN。 成功读取数据后,将四个字节放入数据缓冲区中,并返回数值4。

/ibox

第二个SPU到CPU通信邮箱。 该文件类似于第一个邮箱文件,但是可以在阻塞I/O模式下读取,并且可以使用poll系列系统调用来等待它。 可对打开的ibox文件执行的操作包括

read(2)

如果请求的计数小于4,则read返回-1并将errno设置为EINVAL。 如果邮箱中没有可用数据,并且文件描述符已使用O_NONBLOCK打开,则返回值设置为-1,errno变为EAGAIN。

如果邮箱中没有可用数据,并且文件描述符已在没有O_NONBLOCK的情况下打开,则该调用将阻塞,直到SPU写入其中断邮箱通道为止。 成功读取数据后,将四个字节放入数据缓冲区中,并返回数值4。

poll(2)

只要有数据可供读取,对ibox文件进行的Poll就会返回(POLLIN | POLLRDNORM)。

/wbox

CPU到SPU的通信邮箱。 它是只写的,可以32位为单位写入。 如果邮箱已满,则write()将阻塞,并且可以使用poll来等待其再次变为空。 可对打开的wbox文件执行的操作包括:write(2) 如果请求的计数小于4,则write返回-1并将errno设置为EINVAL。 如果邮箱中没有可用空间,并且文件描述符已使用O_NONBLOCK打开,则返回值设置为-1,errno变为EAGAIN。

如果邮箱中没有可用空间,并且文件描述符已在没有O_NONBLOCK的情况下打开,则该调用将阻塞,直到SPU从其PPE邮箱通道读取为止。 成功读取数据后,将四个字节放入数据缓冲区中,并返回数值4。

poll(2)

只要有可用空间可写,对ibox文件进行的Poll就会返回(POLLOUT | POLLWRNORM)。

/mbox_stat, /ibox_stat, /wbox_stat

只读文件,其中包含当前队列的长度,即可以从mbox或ibox读取多少个字或可以写入wbox多少个字而不会阻塞。 这些文件只能以4字节为单位读取,并返回一个大端二进制整数。 可对打开的 *box_stat 文件执行的操作包括

read(2)

如果请求的计数小于4,则read返回-1并将errno设置为EINVAL。 否则,一个四字节值会放入数据缓冲区中,其中包含可以从(对于mbox_stat和ibox_stat)或写入(对于wbox_stat)相应邮箱的元素数量,而不会阻塞或导致EAGAIN。

/npc, /decr, /decr_status, /spu_tag_mask, /event_mask, /srr0

SPU的内部寄存器。 该表示形式是一个ASCII字符串,其中包含要执行的下一个指令的数值。 这些可以在读/写模式下用于调试,但是程序的正常操作不应依赖于它们,因为访问除npc之外的任何寄存器都需要保存SPU上下文,因此效率非常低。

这些文件的内容是

npc

下一个程序计数器

decr

SPU减量器

decr_status

减量器状态

spu_tag_mask

SPU DMA的MFC标签掩码

event_mask

SPU中断的事件掩码

srr0

中断返回地址寄存器

可对打开的npc,decr,decr_status,spu_tag_mask,event_mask或srr0文件执行的操作包括

read(2)

当提供给read调用的计数短于指针值加上换行符所需的长度时,从同一文件描述符进行的后续读取将导致完成字符串,而不管运行中的SPU任务对寄存器的更改如何。 读取完整的字符串后,所有后续的读取操作都将返回零字节,并且需要打开一个新的文件描述符才能再次读取该值。

write(2)

对文件执行写入操作会导致将寄存器设置为字符串中给定的值。 从字符串的开头到第一个非数字字符或缓冲区的末尾进行解析。 对同一文件描述符的后续写入会覆盖先前的设置。

/fpcr

此文件以四字节长的文件形式访问浮点状态和控制寄存器。 fpcr文件上的操作包括

read(2)

如果请求的计数小于4,则read返回-1并将errno设置为EINVAL。 否则,一个四字节值会放入数据缓冲区中,其中包含fpcr寄存器的当前值。

write(2)

如果请求的计数小于4,则write返回-1并将errno设置为EINVAL。 否则,将从数据缓冲区复制一个四字节值,以更新fpcr寄存器的值。

/signal1, /signal2

SPU的两个信号通知通道。 这些是读写文件,可以操作32位字。 写入其中一个文件会触发SPU上的中断。 写入信号文件的值可以通过通道读取从SPU中读取,也可以通过文件从主机用户空间中读取。 SPU读取该值后,将其重置为零。 可对打开的signal1或signal2文件执行的操作包括

read(2)

如果请求的计数小于4,则read返回-1并将errno设置为EINVAL。 否则,一个四字节值会放入数据缓冲区中,其中包含指定信号通知寄存器的当前值。

write(2)

如果请求的计数小于4,则write返回-1并将errno设置为EINVAL。 否则,将从数据缓冲区复制一个四字节值,以更新指定信号通知寄存器的值。 信号通知寄存器将被输入数据替换,或者将更新为旧值和输入数据的按位OR,具体取决于signal1_type或signal2_type文件的内容。

/signal1_type, /signal2_type

这两个文件更改了signal1和signal2通知文件的行为。 它们包含一个数字ASCII字符串,该字符串被读取为“1”或“0”。 在模式0(覆盖)中,硬件将信号通道的内容替换为写入其中的数据。 在模式1(逻辑OR)中,硬件累积随后写入其中的位。 可对打开的signal1_type或signal2_type文件执行的操作包括

read(2)

当提供给read调用的计数短于数字加上换行符所需的长度时,从同一文件描述符进行的后续读取将导致完成字符串。 读取完整的字符串后,所有后续的读取操作都将返回零字节,并且需要打开一个新的文件描述符才能再次读取该值。

write(2)

对文件执行写入操作会导致将寄存器设置为字符串中给定的值。 从字符串的开头到第一个非数字字符或缓冲区的末尾进行解析。 对同一文件描述符的后续写入会覆盖先前的设置。

示例

/etc/fstab 条目

none /spu spufs gid=spu 0 0

作者

Arnd Bergmann <arndb@de.ibm.com>, Mark Nutter <mnutter@us.ibm.com>, Ulrich Weigand <Ulrich.Weigand@de.ibm.com>

参见

capabilities(7), close(2), spu_create(2), spu_run(2), spufs(7)