摘要
開始在某個程序中執行。
宣告
#include <zircon/syscalls.h>
zx_status_t zx_process_start(zx_handle_t handle,
zx_handle_t thread,
zx_vaddr_t entry,
zx_vaddr_t stack,
zx_handle_t arg1,
uintptr_t arg2);
說明
zx_process_start()
與 zx_thread_start()
類似,但用於在程序中啟動第一個執行緒。
zx_process_start()
會使執行緒在 entry 指定的程式計數器開始執行,並將堆疊指標設為 stack。arg1 和 arg2 引數會配置為在執行緒啟動前函式呼叫前兩個引數使用的架構專屬暫存器。所有其他暫存器的註冊數一律為 0。
第一個引數 (arg1) 是控制代碼,該控點會從呼叫端的程序轉移到要啟動的程序,並在 arg1 中加入適當的處理值,用於新啟動的執行緒。如果 zx_process_start()
傳回錯誤,arg1 會關閉,而非轉移到正在啟動的程序。
此外,arg1 可以是 ZX_HANDLE_INVALID
而不是控制代碼。在這種情況下,程序會在第一個引數註冊時以 ZX_HANDLE_INVALID
(例如零) 開始,而非控制代碼。這表示程序中「沒有」帳號代碼,且「不得」對在程序外共用的任何物件使用任何控點。zx_process_start()
是將控制代碼傳輸到程序中的唯一方法,這個處理程序與使用本身已擁有的控制代碼進行部分系統呼叫的程序無關 (arg1 通常是「啟動」控制代碼)。沒有帳號的程序可能會做出一些不需要處理的系統呼叫,例如透過 vDSO 對應提供 zx_process_exit()
。這類 API 可以使用不需要控制代碼的系統呼叫 (例如 zx_vmo_create()
) 建立新的核心物件,但如要使用這些物件,必須提供更多控點,且無法在程序外部轉移這些物件。而只是透過其他人所對應至位址空間的記憶體通訊。
權限
handle 必須是 ZX_OBJ_TYPE_PROCESS
類型,且具有 ZX_RIGHT_WRITE
。
thread 類型必須為 ZX_OBJ_TYPE_THREAD
類型,且具有 ZX_RIGHT_WRITE
。
arg1 必須包含 ZX_RIGHT_TRANSFER
。
傳回值
zx_process_start()
會在成功時傳回 ZX_OK
。如果失敗,系統會傳回負值錯誤值。
錯誤
ZX_ERR_BAD_HANDLE
process、thread 或 arg1 不是有效的控制代碼。
ZX_ERR_WRONG_TYPE
程序不是程序控點,也不是執行緒處理常式;執行緒 不是執行緒處理常式。
ZX_ERR_ACCESS_DENIED
控制代碼執行緒缺少 ZX_RIGHT_WRITE
或執行緒不屬於程序,或者處理程序缺少 ZX_RIGHT_WRITE
或 arg1 缺少 ZX_RIGHT_TRANSFER
。
ZX_ERR_BAD_STATE
程序已在執行或已退出。
ZX_ERR_INVALID_ARGS
entry 不是使用者空間地址、並非標準地址,或並非 0
。
另請參閱
zx_handle_close()
zx_handle_duplicate()
zx_object_wait_async()
zx_object_wait_many()
zx_object_wait_one()
zx_process_create()
zx_thread_create()
zx_thread_exit()
zx_thread_start()