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)