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。否则,将一个四字节的值放入数据缓冲区,其中包含在不阻塞或导致 EAGAIN 的情况下可以从(对于 mbox_stat 和 ibox_stat)或写入(对于 wbox_stat)相应邮箱读取的元素数量。

/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。否则,将从数据缓冲区复制一个四字节的值,从而更新指定信号通知寄存器的值。信号通知寄存器将替换为输入数据,或者将更新为旧值和输入数据的按位或,具体取决于 signal1_type 或 signal2_type 文件的内容。

/signal1_type, /signal2_type

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

read(2)

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

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)