linux核心綜述

2021-07-16 13:14:11 字數 1695 閱讀 3078

終於讀完了robert love大師《linux核心設計與實現》,儘管有多處一知半解,但是仍然收穫良多,不免想藉機記下來,供以後參考。

linux核心固然是個龐然大物,但是並非洪水猛獸,儘管其中充斥著各種精巧、複雜的資料結構以及別出心裁的演算法,但是它仍然是有跡可循的。整個核心可以分為七個部分:程序管理、中斷機制、同步機制、時鐘管理、記憶體管理、檔案管理、裝置管理。下面將分別敘述。

首先是程序管理。linux核心中為每個程序構造了大小為1.7kb的程序描述符,即駐留在記憶體中的結構體。結構體中包含準確無誤地描述乙個程序所需要的全部資訊,包括程序狀態、開啟檔案、記憶體位址空間等等重要資訊。系統中所有的程序的程序描述符組織為一條迴圈雙向鍊錶。核心也為程式提供了乙個獲得當前正在執行的程序描述符的介面,它實現為乙個巨集。核心中將程序分為五種狀態,分別是執行態(包括就緒態)、可中斷阻塞態、不可中斷阻塞態、僵死態、終止態。此處程序狀態的劃分與筆者在學習作業系統的時候稍有不同,作業系統學習的時候考慮的是核心管理的使用者空間的程序在正常工作情況下的三種狀態:執行態、就緒態、阻塞態,而沒有考慮僵死態、終止態。核心中將程序組織為一顆程序樹,init程序為樹根,它在系統啟動的時候建立,並且一直存在於系統中,它還負責收容孤兒程序以防系統中駐留僵死程序。linux通過系統呼叫clone實現fork函式,並且加入了寫時複製機制,即在fork子程序之後如果什麼多不做,並沒有改變位址空間表示的記憶體區域的值,那麼子程序和父程序是共享位址空間的,只有當子程序嘗試改變記憶體或者載入新的程式(本質上也是改變記憶體)時,核心會拷貝乙份父程序位址空間的副本,供子程序使用。程序執行完畢退出時,核心會停止程序的執行,但是不會馬上回首程序占用的系統資源,比如程序描述符,知道程序的父程序呼叫wait等系統呼叫獲取完子程序的終止狀態之後核心才會清楚子程序占用的系統資源,這樣做是為了提供子程序向上傳遞終止狀態的機制。已經執行退出操作但是父程序沒有獲取子程序狀態的程序會一直占用系統資源,這樣的程序我們稱之為僵死程序,一般來講在編寫多程序程式的時候需要特別注意,父程序要在子程序退出的時候獲取子程序的終止狀態,否則很容易就會造成系統資源洩漏。

linux程序排程採用實時排程和分時排程兩種方式,系統為程序設定了不同的優先順序,成為nice值,nice值越高,優先順序越低。每個優先順序都有乙個與之關聯的優先順序佇列,系統在不同的優先順序之間採用實時排程,保證高優先順序的程序總是能夠先執行,比如系統的互動式介面程式,以提供使用者使用系統的請求響應速度。在同一優先順序內部,系統採用分時排程,每個優先順序相同的程序分配到一致大小的時間片,實行輪轉排程。但是linux在輪轉排程的基礎上還加入了動態更改優先順序的機制,如果某個程序總是把時間片用完才釋放cpu,那麼系統將會降低此程序的優先順序,將它放到nice值更高的佇列中去。使用者空間的程序總是可以被搶占的,但是核心控制項就不一定了,有時候系統在執行某些中斷處理程式或者一些原子性操作,核心會暫時關閉中斷,直到目標程式執行完畢。當某個程序被優先順序更高的程序搶占的時候,核心會儲存程序的上下文到程序描述符,以便下一次排程此程序時能夠從正確的開始點執行。

為了能夠和使用者空間進行通訊,大部分時間都是在提供服務,核心提供了一組介面,供使用者空間的程式呼叫,這組介面我們一般稱之為系統呼叫。系統級程式開發人員通常會呼叫c庫的高階庫函式,高階庫函式由c庫函式實現,而在c庫函式裡面便呼叫了核心的系統呼叫。從庫函式裡面呼叫核心系統呼叫需要通過軟中斷實現。首先使用者空間發起系統呼叫,庫函式呼叫syscall函式設定正確的系統呼叫號以及引數,然後syscall根據系統呼叫號呼叫核心的函式實現系統呼叫,這樣一組核心函式我們稱之為系統呼叫處理程式。系統呼叫通常和每種作業系統有關,但是自從posxi標準問世以後,linux核心提供的系統呼叫有了乙個最小集規定。

Linux基礎 綜述

本教程的目標是使用c c 實現典型的資料結構。使用linux作業系統進行c c 開發。打個比方 linux等像乙個 桌子 c c 等程式語言像各種 鉗子,扳手 等工具 我們坐在桌子前面製作乙個叫做資料結構的 機器 這個 機器 能夠儲存資料,並且儲存的資料之間的關係也能通過這個 機器 觀察到。有很多 ...

LINUX外設開發綜述

樹莓派外設開發介面文件參考 wiringpi庫 linux動態庫 so 靜態庫 a api printf c標準庫 1.樹莓派的介面 驅動io口 input output 對主控來說 input 人體,煙霧,火焰,震動等 output 繼電器,蜂鳴器 pwm 電機調速,燈光調明亮度 語音識別模組,液...

linux程序間通訊綜述

linux程序間通訊綜述 linux程序間通訊主要分為以下4個領域 1 訊息傳遞 管道,fifo,訊息佇列 2 同步 互斥鎖,條件變數,讀寫鎖,訊號量 3 共享記憶體區 匿名共享記憶體區,有名共享記憶體區 4 過程呼叫 solaris門,sun rpc linux程序間的資訊共享可以分為 1 基於檔...