摘要
在執行緒上啟動執行作業。
宣告
#include <zircon/syscalls.h>
zx_status_t zx_thread_start_regs(zx_handle_t handle,
uint64_t pc,
uint64_t sp,
uint64_t arg1,
uint64_t arg2,
uint64_t tp,
uint64_t abi_reg);
zx_status_t zx_thread_start(zx_handle_t handle,
zx_vaddr_t pc,
zx_vaddr_t sp,
uintptr_t arg1,
uintptr_t arg2);
說明
_TODO(https://fxbug.dev/478347581): The new signature with tp and
abi_reg arguments is the preferred ABI in Fucshia API level 31 and
later. 當系統不再支援 API 級別 31 之前的版本時,這個類別最終會重新命名為 zx_thread_start。舊簽章的行為完全相同,新引數則會使用零。
zx_thread_start() 會導致執行緒開始執行。初始暫存器設定如下:
- 程式計數器會設為 pc 引數。
- 堆疊指標會設為 sp 引數。
- 機器 C 呼叫慣例的前兩個引數暫存器分別設為 arg1 和 arg2。
- 機器的執行緒指標暫存器會設為 tp 引數。
- 機器 ABI 用於陰影呼叫堆疊指標的暫存器會設為 abi_reg。在沒有陰影呼叫堆疊 ABI 的 x86 上,這個值會進入
r15暫存器。 - 所有其他一般暫存器都是零。
- 所有浮點數和/或向量暫存器都處於機器的初始狀態 (通常大部分為零)。
提供的每個暫存器值都必須是正常程式碼可透過某種方式進入該暫存器的值。否則呼叫會失敗,並傳回 ZX_ERR_INVALID_ARGS。舉例來說,某些機器的 PC 只能設為「標準」位址,不一定要是有效位址,可以是會導致執行緒在該 PC 實際執行時發生錯誤的位址,就像一般跳躍指令會設定 PC,然後發生錯誤一樣;但不能是「非標準」位址,因為跳躍指令本身會發生錯誤,而不會變更 PC。同樣地,堆疊指標可能需要是具有有效機器必要對齊方式的指標 (即使不是實際有效的位址);或者執行緒指標可能需要是標準位址。在所有機器的所有這些暫存器中,零一律是有效的引數值。
當執行緒的最後一個控制代碼關閉時,執行緒就會遭到終結。
可以等待執行緒控制代碼,並在執行緒停止執行時 (因呼叫 zx_thread_exit() 而停止),判斷信號
ZX_THREAD_TERMINATED。
pc 應指向函式,該函式必須在抵達最後一個指令前呼叫 zx_thread_exit() 或 zx_futex_wake_handle_close_thread_exit() 或 zx_vmar_unmap_handle_close_thread_exit()。範例如下:
[[noreturn]] void thread_entry(uint64_t arg1, uint64_t arg2) {
// do work here.
zx_thread_exit();
}
如果未在函式結束前呼叫其中一個結束函式,就會導致架構 / 工具鍊專屬的例外狀況。
權限
handle 必須是 ZX_OBJ_TYPE_THREAD 類型,且具有 ZX_RIGHT_MANAGE_THREAD。
傳回值
成功時,zx_thread_start() 會傳回 ZX_OK。
如果失敗,系統會傳回負數錯誤值。
錯誤
ZX_ERR_BAD_HANDLE thread 不是有效的控制代碼。
ZX_ERR_WRONG_TYPE thread 不是執行緒控制代碼。
ZX_ERR_ACCESS_DENIED 控制代碼 thread 缺少 ZX_RIGHT_WRITE。
ZX_ERR_BAD_STATE thread 尚未準備就緒,或 thread 所屬的程序已停止運作。
ZX_ERR_INVALID_ARGS 其中一個暫存器值無法供機器使用。