2. The Kernel Source Tree
3. 配置內核
(1) 配置選擇有Boolean和tristates兩種類型.Boolean類型可以選擇yes或no.內核特性,比如 CONFIG_PREEMPT通常就是Boolean型.tristates類型有yes,no,module3個值可選.設置成module表示編譯成模塊(可動態加載的對象).tristates類型的數據中,yes表示將代碼編譯到內核映像中,而不是一個模塊.驅動通常就是tristates類型來配置的.
(2) 配置內核命令
文本模式下: $ make config
該命令會一個選項一個選項的讓用戶選擇,會花很多時間.因此最好使用圖形化的配置.
$ make menuconfig 或者基於gtk+的工具: $ make gconfig
$ make defconfig 該命令創建一個基於默認配置的配置.
$ make oldconfig 當更新了配置,或者使用了配置文件到新的內核代碼中,使用該命令進行驗證並更新配置.在編譯內核之前需要運行該命令.
配置選項CONFIG_IKCONFIG_PROC能夠將配置文件保存並壓縮到 /proc/config.gz中.可以使用如下命令將備份的配置文件恢復進行新的編譯.
$ zcat /proc/config.gz > .config
$ make oldconfig
內核配置完成後,使用make命令就可以編譯內核了.
$ make
如果不想看到過多的編譯信息,而只想看到警告和錯誤,可以使用如下命令重定向到其他文件:
$ make > ../detritus
還可以使用如下命令將無價值的輸出信息重定向到null,也就是丟棄.
$ make > /dev/null
4.安裝新內核
這取決於系統架構和Bootloader, 如果是x86使用grub引導,只需復制arch/i386/boot/bzImage目錄到 /boot,更名為 vmlinuz-version之類的名字,然後編輯 /boot/grub/grub.conf,為新內核添加一個新的entry.對於Lilo,則編輯/etc/lilo.conf然後重新運行Lilo.
使用% make modules_install命令來安裝內核模塊,該命令將編譯好的模塊放到 /lib/modules下.
5.內核區別與用戶程序的特點
(1) 內核不能訪問C庫和標准頭文件
常用的C庫函數有在內核中的實現,如printk()代替printf(),用法基本一樣,唯一的區別是printk可以添加一個表示信息優先級的宏(注意沒有逗號),如:
printk(KERN_ERR "this is an error!\n");
(2) 內核由GNU C編寫
支持內聯函數;內嵌匯編;likely()和unlikely()來優化分支語句.
(3) 內核缺少像用戶空間一樣的內存保護機制
(4) 內核很難進行浮點運算
(5) 內核的每個進程都只有固定的很小的棧空間
x86架構上一般為4KB或者8KB.32bit系統8KB,64bit系統16KB.
(6) 因為內核有異步中斷,可搶占,支持SMP,同步和並發運行是內核需要重點注意的方面
通常的解決辦法是使用自旋鎖和信號量.
(7) 可移植性非常重要