1. Linux系統編程的三大基石:系統調用、C語言庫、C編譯器
系統調用:內核向用戶級程序提供服務的惟一接口。在i386中,用戶級程序執行軟件中斷指令 INT n 以後切換至內核空間
用戶程序經過寄存器告知內核執行系統調用的所需參數
2. API 和 ABI
API:application programming interface 定義源碼級接口,必須確保源碼級兼容
ABI:application binary interface 定義二進制接口,必須確保二進制兼容
ABI包括:調用約定、字節序、寄存器使用、系統調用、連接、二進制文件格式
調用約定:定義了 函數如何調用、參數如何傳遞、寄存器使用、調用者恢復返回值
ABI與機器體系結構密切相關,不一樣體系結構的機器具備不一樣的ABI
3. 文件
內核在併發文件訪問上沒有任何限制條件,多個進程能夠對同一個文件同時進行讀寫操做
用戶級程序必須相互協調以確保併發文件訪問獲得正確的同步
每一個文件在文件系統內都是經過惟一的inode編號來引用,
inode節點包含了文件絕大部分信息,對應於系統調用stat
經過inode編號來存取文件很是繁瑣,所以 用戶級程序都是經過文件名而不是文件的inode編號來訪問
目錄就是用來將人類可讀的文件名映射爲 文件系統內相應的inode編號,目錄項(dentry)就是存儲諸對映射的哈希表
目錄僅僅包括文件名到inode編號的映射,內核使用這個映射來執行 finename-to-inode 決議
例如打開 /home/blackbeard/concorde.png
內核順沿路徑名的目錄項(內核裏稱爲 dentry) 來查找 下一個entry的inode
內核首先從 / 開始,獲取 home 的inode,而後從home的目錄項獲取 blackbeard 的inode,最後從blackbeard的目錄項獲取concorde.png的inode,經過最後獲得的inode打開文件
內核一般使用 dentry cache (目錄項緩存) 來加速 目錄決議
硬連接:
多個不一樣的文件名映射到同一inode
硬連接容許咱們多個路徑名指向同一數據,每一個inode記錄一個指向它本身的連接數,只有當連接數減小至0時,才能從文件系統移除inode
硬連接不能跨文件系統,由於在inode自身的文件系統以外,inode編號是沒有意義的。
符號連接:能夠跨文件系統的連接
字符設備:相似字節隊列,按照隊列順序依次讀取字符,鍵盤就是字符設備
塊設備:相似字節數組
命名管道:進程間通訊機制
套接字:提供不一樣機器之間的進程間通訊
文件系統是組織文件和目錄造成的合理的層次體系。文件系統能夠獨自地從全局命名空間中添加或移除,稱爲 掛載 和 卸載
4. 進程
進程是正在執行的目標代碼。
進程開始於可執行目標代碼,Linux最經常使用的格式爲 ELF
ELF中最重要的是 文本段、數據段 和 bss段:
文本段包括 可執行代碼和只讀數據,好比 常量
數據段包括 初始化數據
bss段包括 未初始化的全局數據。
當bss段加載進內存時,內核會對該段映射 zero page(a page of all zero)
進程只能經過系統調用來請求和管理資源(包括計時器、信號、打開文件、網絡鏈接、硬件、IPC機制)
進程是虛擬化抽象,Linux內核經過 搶佔式多任務 和 虛擬內存 來提供 處理器虛擬化 和 內存虛擬化
從進程角度來看,進程獨佔cpu,每一個進程都有單一的線性地址空間
Linux中,進程遵循嚴格的層次體系,即 進程樹
進程樹的根節點是 init 進程,新進程經過fork建立, 若是父進程在子進程以前結束,那麼內核將該子進程掛在 init 父進程之下
一個子進程終止時,並不當即從內核移除,而是等待其父進程經過wait查詢其終止狀態。
只有父進程wait以後,該進程才徹底消亡。
一個已經終止,可是仍未被父進程wait的進程稱爲 僵死進程
5. 用戶權限
6. 信號
信號是一種異步通知機制
SIGKILL:always terminates the process
SIGSTOP:always stops the process