Linux內核開發特點:
- 內核編程時不能訪問標準C庫;
- 內核編程時必須使用GNU C;
- 內核編程時缺乏像用戶空間那樣的內存保護機制;
- 內核編程時浮點數很難使用;
- 內核只有一個很小的定長堆棧;
- 由於內核支持異步中斷,搶佔和SMP,因此必須時刻注意同步和併發控制;
- 內核編程要考慮可移植性。
沒有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內核設計與實現》,第二版