[Linux內核設計與實現]Linux內核開發特點

Linux內核開發特點:

  1. 內核編程時不能訪問標準C庫;
  2. 內核編程時必須使用GNU C;
  3. 內核編程時缺乏像用戶空間那樣的內存保護機制;
  4. 內核編程時浮點數很難使用;
  5. 內核只有一個很小的定長堆棧;
  6. 由於內核支持異步中斷,搶佔和SMP,因此必須時刻注意同步和併發控制;
  7. 內核編程要考慮可移植性。

沒有libc庫

與用戶空間的應用程序不同,內核不能鏈接使用標準C函數庫,其他函數庫也不能使用。對於內核來說,完整的C庫太大了,即使從中抽取一個合適的子集,在大小和效率方面也不能接受。不過大部分常用的C庫函數在內核中都已經得到了實現。


GNU C

內核使用C語言編寫,但是內核不完全符合ANSI C標準。內核開發者總是要用到gcc提供的許多語言擴展部分。內核代碼中常使用的C語言擴展有下面幾點:

內聯(inline)函數,使用static inline來聲明;

內聯彙編,gcc編譯器支持在C中嵌入彙編語言;

分支聲明,gcc內建了一條指令來優化條件選擇語句,比如likely(),unlikely()。


沒有內存保護機制

用戶程序試圖進行一些非法內存訪問時,內核會發現這個錯誤,發送SIGSEGV,並結束用戶進程。然而,內核自己訪問了非法內存將會導致oops。所以內核開發時,對內存的操作一定要小心。此外,內核中的內存不能分頁。也就是說每用掉一個字節,物理內存就會減少一個字節。


容量小而固定的棧

內核棧的準確大小隨體系結構而變。在x86上,棧的大小在編譯時配置,可以是4kb也可以是8kb。從歷史上說,內核棧的大小是兩頁,這就意味着,32位機器的內核棧是8kb,而64位機器的內核棧大小是16kb。


同步和併發

內核很容易產生競爭條件。體現在以下方面:

Linux內核是搶佔多任務操作系統;

Linux內核支持多處理器系統;

中斷是異步到來,完全不顧及當前正在執行的代碼;

Linux內核可以搶佔。


可移植性的重要性

Linux是一個可以移植的操作系統,必須把體系結構相關的代碼從內核代碼樹的特定目錄中分離出來。



參考資料:

《Linux內核設計與實現》,第二版


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章