libc

libc 是什麼意思?

在 Posix-y 系統上,程式會連結至名為 libc 的程式庫 (動態或靜態)。這個程式庫提供 C 標準定義的函式,以及 C 程式的執行階段環境。許多系統也會在同一個程式庫中定義其他平台專屬介面。其中許多介面都是建議使用者空間存取核心功能的方式。例如,Posix-y 系統的 libc 有 open 函式,而該函式會呼叫 open 系統呼叫。有時候這些是跨平台標準,例如 pthreads。有些則是核心特定功能的介面,例如 epollkqueue。無論在何種情況下,這個程式庫都會出現在系統本身,也是穩定版的介面。相較之下,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 函式 (例如 openwritefstat) 的弱符號。但這些呼叫都會失敗。除了 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 二進位檔和部分初始狀態轉換成執行中的程序。