從Linux內核出發

一、內核源碼數linux

內核源碼樹由不少目錄組成,而大多數目錄又包含更多的子目錄,源碼樹的根目錄及其子目錄以下:編程

 目錄  描述
arch 特定體系結構的源碼
crypto crypto API
ducumention 內核源碼文檔
drivers 設備驅動程序
fs VFS和各類文件系統
include 內核頭文件
init 內核引導和初始化
ipc 進程間通訊代碼
kernel 像調度程序這樣的核心子系統
lib 調用內核函數
mm 內存管理子系統和VM
net 網絡子系統
scripts 編譯內核所用的腳本
security linux安全模塊
sound 語音子系統
usr 早期用戶空間代碼

 

二、內核開發的特色安全

  • 內核編程時不能訪問C庫
  • 內核編程時必須使用GNU C
  • 內核編程時卻反像用戶空間那樣的內存保護機制
  • 內核編程時浮點數很難使用
  • 內核只有一個很小的定長堆棧
  • 因爲內核支持異步中斷、搶佔和SMP,所以必須時刻注意同步和併發
  • 要考慮可移植性的重要性

三、內核代碼使用到的C語言擴展網絡

  • 內聯函數

  GNU的C編譯器支持內聯函數,inline反應它的工做方式,函數會在它調用的位置上展開,這麼作能夠消除函數點永和返回所帶來的開銷。內聯函數必須在使用以前就定義好,不然編譯器就無法把這個函數展開。實踐中通常在頭文件中定義內聯函數。因爲使用了static做爲關鍵字進行限制,因此編譯器不會爲內聯函數單獨創建一個函數體。併發

  • 內聯彙編

  gcc編譯器支持在C函數中嵌入彙編指令。Linux內核混合使用了C和彙編語言。在偏近體系結構的底層或對執行時間要求嚴格的地方,通常使用的是彙編語言,而內核其餘部分的大部分代碼是C語言編寫的。異步

  • 分支說明

  對於條件選擇語句,gcc內奸了一條指令用於優化,在一個條件常常出現,或者該條件不多出現的時候,編譯器能夠根據這條指令對條件分支選擇進行優化。函數

四、沒有內存保護機制oop

  若是一個用戶程序試圖進行一次非法的內存訪問,內核會發現這個錯誤,發送SIGSEGV,並結束整個進程。然而,若是是內核本身非法訪問了內存,那後果就很難控制了。內核中發生的內存錯誤會致使oops,這是內核中出現的最多見的錯誤。並且,內核中的內存都不分頁,沒用掉一個字節,物理內存就減小一個字節。優化

五、不要輕易在內核中使用浮點數操作系統

  在用戶空間的進程內進行浮點操做的時候,內核會完成從證書操做到浮點數操做的模式轉換。

六、容積小而固定的棧

  內核站的準確大小隨體系結構而變。

七、同步和併發

  內核和容易產生競爭條件。和單線程的用戶空間程序不一樣,內核的許多特性都要求可以冰法的訪問共享數據,這就要求由同步機制保證不會出現競爭條件。

  • Linux是搶佔多任務操做系統。內核的進程調度程序即興對進程進行調度和從新調度。內核必須對這些任務同步。
  • Linux內核支持多處理器系統。因此,若是沒有適當的保護,在兩個或兩個以上的處理器上運行的代碼可能會同時訪問共享的同一個資源。
  • 中斷時異步到來的,徹底不顧及當前正在執行的代碼。也就是說,若是不加以適當的保護,終端徹底有可能在代碼放翁共享資源的當中到來,這樣,中斷處理程序就有可能訪問同一資源。
  • Linux內核能夠搶佔。

八、可移植性的重要性

相關文章
相關標籤/搜索