在嘗試核心開發之前,需要對核心有個整體的了解。
主要内容:
擷取核心源碼
核心源碼的結構
編譯核心的方法
核心開發的特點
核心是開源的,所有擷取源碼特别友善,參照以下的網址,可以通過git或者直接下載下傳壓縮好的源碼包。
<a href="http://www.kernel.org/">http://www.kernel.org</a>
目錄
說明
arch
特定體系結構的代碼
block
塊裝置I/O層
crypo
加密API
Documentation
核心源碼文檔
drivers
裝置驅動程式
firmware
使用某些驅動程式而需要的裝置固件
fs
VFS和各種檔案系統
include
核心頭檔案
init
核心引導和初始化
ipc
程序間通信代碼
kernel
像排程程式這樣的核心子系統
lib
同樣核心函數
mm
記憶體管理子系統和VM
net
網絡子系統
samples
示例,示範代碼
scripts
編譯核心所用的腳本
security
Linux 安全子產品
sound
語音子系統
usr
早期使用者空間代碼(所謂的initramfs)
tools
在Linux開發中有用的工具
virt
虛拟化基礎結構
還未實際嘗試過手動編譯核心,隻是用yum更新過核心。這部分等以後手動編譯過再補上。
安裝新的核心後,重新開機時會提示進入哪個核心。當多次安裝新的核心後,啟動清單會很長(因為有很多版本的核心),顯得不是很友善。
下面介紹3種删除那些不用的核心的方法:(是如何安裝的就選擇相應的删除方法)
rpm -qa | grep kernel* (查找所有linux核心版本)
rpm -e kernel-(想要删除的版本)
yum remove kernel-(要删除的版本)
删除/lib/modules/目錄下不需要的核心庫檔案
删除/usr/src/kernel/目錄下不需要的核心源碼
删除/boot目錄下啟動的核心檔案禾核心映像
更改grub的配置,删除不需要的核心啟動清單
為了保證核心的小和高效,核心開發中不能使用C标準庫,是以連最常用的printf函數也沒有,但是還好有個printk函數來代替。
因為使用GNU C,所有核心中常使用GNU C中的一些擴充:
内聯函數在編譯時會在它被調用的地方展開,減少了函數調用的開銷,性能較好。但是,頻繁的使用内聯函數也會使代碼變長,進而在運作時占用更多的記憶體。
是以内聯函數使用時最好要滿足以下幾點:函數較小,會被反複調用,對程式的時間要求比較嚴格。
内聯函數示例:static inline void sample();
内聯彙編用于偏近底層或對執行時間嚴格要求的地方。示例如下:
如果能事先判斷一個if語句時經常為真還是經常為假,那麼可以用unlikely和likely來優化這段判斷的代碼。
因為核心是最低層的程式,是以如果核心通路的非法記憶體,那麼整個系統都會挂掉!!是以核心開發的風險比使用者程式開發的風險要大。
而且,核心中的記憶體是不分頁的,每用一個位元組的記憶體,實體記憶體就少一個位元組。是以核心中使用記憶體一定要謹慎。
核心不能完美的支援浮點操作,使用浮點數時,需要人工儲存和恢複浮點寄存器及其他一些繁瑣的操作。
核心棧的大小有編譯核心時決定的,對于不用的體系結構,核心棧的大小雖然不一樣,但都是固定的。
檢視核心棧大小的方法:
Linux是多使用者的作業系統,是以必須處理好同步和并發操作,防止因競争而出現死鎖。
Linux核心可用于不用的展現結構,支援多種硬體。是以開發時要時刻注意可移植性,盡量使用體系結構無關的代碼。
本文轉自wang_yb部落格園部落格,原文連結:http://www.cnblogs.com/wang_yb/archive/2012/08/16/2641836.html,如需轉載請自行聯系原作者