Bionic C 庫概述(Bionic Overview)

一、核心思想:簡單化

即C庫應該只提供對內核功能的輕量級封裝,不應該過於智能化,考慮太多的邊界條件。

Bionic這個詞表明它一部分來自BSD,一部分來自Linux。它的源碼主要是BSD C庫的代碼片段,加上一些Linux相關的比特位,用來處理線程、信號等問題。


二、架構

Bionic目前支持x86和arm指令集。理論上講,可以支持更多的架構,不過需要做一些工作。


三、Syscall stub

每個系統調用函數都是用一段小型彙編碼(即 syscall stub)實現的,這些 syscall stub 是由 tools/gensyscall.py 通過讀取 SYSCALL.html 生成的。

SYSCALL.html 包含要生成的 syscall stub ,相應的系統調用號(x86與arm不同),及相應的簽名。

如果你想修改SYSCALL.html,可以利用 tools/checksyscalls.py 來比較SYSCALL.html 和 Linux內核頭文件。當發現無效的系統調用號時,就會報告錯誤。


四、time_t 和 off_t

在32位CPU上,Linux內核定義 time_t 爲 32位。但是將 time_t 定義爲 64位或許更好,因爲可以解決 bug Y2038。但是Linux內核維護人員Y2038不緊急,所以time_t依然是32位。

但是,Bionic提供了time64.h 這個頭文件,定義了 time64_t 類型,和相應的函數 mktime64()、localtime64() 等。

off_t 也是 32 位的,Bionic中定義了 loff_t 類型(64位),從而做到兼容BSD, 它被typedef 爲 off64_t,兼容Linux。


五、時區管理

當前時區的名字取自 TZ 環境變量(如果定義了 TZ 變量)。

如果沒有定義 TZ 環境變量,則檢查名爲 persist.sys.timezone 的系統屬性。

時區信息數據庫和索引文件位於 /system/usr/share/zoneinfo, 而不是 /usr/share/zoneinfo(POSIX規範定義的)


六、Linux內核頭文件

七、pthread實現

八、多核支持

九、Android相關特性

十、二進制兼容性

十一、動態鏈接器

十二、C++異常

十三、System V IPC

十四、include 路徑

Android 編譯系統會自動提供C庫頭文件的include路徑。如果想自己指定,可以把這些路徑加入C庫的include路徑:

      libc/arch-$ARCH/include
      libc/include
      libc/kernel/common
      libc/kernel/arch-$ARCH




發佈了68 篇原創文章 · 獲贊 5 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章