libc 是什麼意思?
在 Posix-y 系統上,程式會連結至名為 libc 的程式庫 (動態或靜態)。這個程式庫提供 C 標準定義的函式,以及 C 程式的執行階段環境。許多系統也會在同一個程式庫中定義其他平台專屬介面。其中許多介面都是建議使用者空間存取核心功能的方式。例如,Posix-y 系統的 libc 有 open
函式,而該函式會呼叫 open
系統呼叫。有時候這些是跨平台標準,例如 pthreads。有些則是核心特定功能的介面,例如 epoll
或 kqueue
。無論在何種情況下,這個程式庫都會出現在系統本身,也是穩定版的介面。相較之下,Windows 並未在其穩定的 Wind32 介面中提供全系統 libc。
Fuchsia 的故事與 Posix 系統稍有不同。首先,Zircon 核心 (Fuchsia 的核心) 不會提供一般的 Posix 系統呼叫介面。因此,open
之類的 Posix 函式無法呼叫 Zircon open
系統呼叫。其次,Fuchsia 會實作 Posix 的某些部分
但省略 Posix 模型的大部分但顯然缺少信號、分支和執行第三,Fuchsia 不需要
程式使用 libc 的 ABI程式皆可自由使用自身的程式庫,也能在不使用的情況下運作。然而,Fuchsia 提供了 libc.so,讓程式能夠以動態的方式連結,提供 C 標準程式庫和 Posix Fuchsia 支援的部分,如同一般 Posix 系統所支援。
逐件組
以下清單列出了 Fuchsia libc 中實作 (或不實作) 的內容。
C 標準程式庫
Fuchsia 的 libc 已實作 C11 標準。具體來說,這包括執行緒相關介面,例如執行緒 (thrd_t
) 和互斥鎖 (mtx_t
)。在這個系統中,少數擴充功能也包含將 C11 結構 (例如 thrd_t
) 與基礎核心結構連結,例如 zx_handle_t
的基礎結構。
Posix
Posix 可以定義多種介面。其中包括 (僅列舉部分內容):檔案 I/O、BSD 通訊端和 pthreads。
檔案 I/O 和 BSD 通訊端
先前提過,Zircon 是不在實作檔案 I/O 領域的核心。其他 Fuchsia 使用者空間服務則會提供檔案系統。libc 本身會定義 Posix 檔案 I/O 函式 (例如 open
、write
和 fstat
) 的弱符號。但這些呼叫都會失敗。除了 libc.so 以外,程式也可以連結 fdio.so 程式庫。fdio 知道如何透過管道 IPC 與這些 Fuchsia 服務交談,並提供類似 Posix 的層,讓 libc 公開。同理,通訊端是透過 fdio 與使用者空間網路堆疊進行通訊來進行實作。
pthreads
Fuchsia 的 libc 提供部分 pthread 標準。具體來說,系統會提供 pthread_t
的核心部分 (可直接對應至相應的 C11 概念) 和 pthread_mutex_t
等同步處理基本功能。系統不會實作部分詳細資料 (例如程序共用互斥鎖)。這次實作的子集無法涵蓋所有層面,
訊號
Fuchsia 沒有 Unix 樣式信號。Zircon 無法直接實作這些元件 (核心沒有任何方法能讓其他執行緒跳出其執行環境)。因此,Fusia 的 libc 沒有信號安全函式的概念,也不會在內部實作以掌握信號等機制。
因此,libc 函式並非 EINTR
,而且不需要 Fuchsia 專用程式碼也能考慮該情況。但可以非常安全。Fuchsia 仍會定義 EINTR
常數,而針對 Posix 和 Fuchsia 編寫的程式碼,可能仍有 EINTR
處理迴圈。
Fork and exec
Zircon 沒有分支或 exec。程序建立則是由 fdio 提供。雖然 Zircon 包含 Process 和 Thread 物件,但這些物件相當原始,但不會有 ELF 相關資訊。fdio_spawn
函式系列知道如何將 ELF 二進位檔和部分初始狀態轉換成執行中的程序。