//from http://blog.163.com/hellowpty@126/blog/static/141982220201041003038319/
內核開發
——Linux內核簡介(Linux體系結構,Linux內核架構)
——Linux內核源代碼(目錄結構)
——Linux內核配置裁剪與編譯
Linux體系結構
Linux系統如何構成的?
從上圖得知,Linux由用戶空間和內核空間兩部分組成。
爲什麼Linux系統會被劃分成用戶空間與內核空間呢?
答:arm實現了7種工作模式,在不同模式下運行,享有不同的權限,即訪問的寄存器也是不同的。劃分用戶空間與內核空間有助於對內核的保護,在用戶空間錯誤的運行一些應用程序或者應用程序出錯的時候而不至於修改內核空間,如果修改了內核空間很可能對系統造成破壞。
內核空間與用戶空間是程序執行的兩種不同狀態,通過系統調用和硬件中斷能夠完成從用戶空間到內核空間的轉移。
Linux內核架構
SCI系統調用接口:實現系統調用的,比如read,write
PM進程管理:進程的刪除與創建,進程的通信,進程的調度
VFS虛擬文件系統:統一接口
MM內存管理:內存的分配,回收,虛擬地址物理地址的映射
Network Stack網絡協議棧:
Arch(體系結構相關的代碼):將和cpu密切相關的代碼集中到一起,方便不同體系結構的移植。
DD設備驅動程序:非常重要。
虛擬文件系統(VFS):
Linux支持許多不同的文件系統,而Linux在運行這些文件系統的時候通過虛擬文件系統將不同的文件系統進行了一個統一的接口,這樣就可以統一的使用不同的文件系統。
目錄結構
Linux內核源碼採用樹狀結構進行組織,非常合理地把功能相關的文件都放在同一個子目錄下,使得程序更具可讀性。
Arch(architecture)目錄:存放有和cpu體系結構密切相關的部分,在該目錄下都有對應的子目錄。每個cpu的子目錄,又進一步分解爲boot,mm,kernel等子目錄,分別包含控制引導程序,內存管理,系統調用等。
Block:部分設備驅動程序
Crypto:加密,壓縮,crc校驗算法
Documenttation:內核的文檔
Drivers目錄:設備驅動程序
Fs目錄:存放各種文件系統的實現代碼,每個子目錄對應一種文件系統的實現,共用的源程序用於實現虛擬文件系統vfs。
Include目錄:內核所需要的頭文件,與平臺無關的頭文件在inlcude/linux子目錄下,與平臺相關的頭文件這放在相應的子目錄中。
Init目錄:內核初始化代碼
Ipc目錄:進程間通信的實現代碼
Kernel目錄:Linux大多數關鍵的核心功能都是在這個目錄實現(調度程序,進程控制,模塊化)
Lib目錄:庫文件代碼
Mm目錄:mm目錄中的文件用於實現內存管理中與體系結構無關的部分(與體系機構相關的在arch中)
Net目錄:網絡協議的實現代碼
Samples目錄:一些內核編程的範例
Scripts目錄:配置內核的腳本(在配置內核時的配置菜單就是Scripts畫的)
Security目錄:selinux的模塊
Sound目錄:音頻設備的驅動程序
Usr目錄:cpio命令實現
Virt:內核虛擬機
內核的配置與編譯
Linux的內核是可以配置的,就是說可以根據用戶的需要進行配置,正是因爲Linux的內核可以自由的配置,自由的裁剪,減小內核的體積從200多兆裁剪到幾百K,才使得Linux的內核可以移植到arm平臺上去
Linux內核具有可定製的優點,具體步驟如下:
1. 清除臨時文件,中間文件和配置文件(爲什麼要清除呢?在得到一個內核以後會有許多垃圾文件需要清除)
。make clean(刪除。O文件 保留配置文件)
Remove most generated files but keep the config
。make mrproper(刪除。O文件 刪除配置文件)
Remove all genertated files+config files
。make distclean(刪除。O文件 刪除配置文件 刪除。Hex文件)
Mrporper+remove editor backup and patch files
2. 確定目標系統硬件配置情況,比如cpu的類型,網卡型號,所需支持的網絡協議
3. 使用如下命令之一配置內核
。make conifg 基於文本模式的交互式配置(執行之後會在配置的過程中通過提問的方式來配置)
。make menuconfig 基於文本模式的菜單配置
。make oldconfig 使用已有的配置文件(。Config)與make config的區別只做表明爲new的配置項
。make xconfig圖形化配置選項(需要安裝圖形化界面)
使用完以上congfig命令之後,會自動生成一個。Config文件,文件的信息保存了內核配置的結果。
要配置arm的內核,可以根據arch中的默認配置在此基礎上修改。
內核配置選項說明:略(太多了)
4. 編譯內核
Make zimage
Make bzimage
區別:在X86平臺,Zimage只能用於小於512k的內核
編譯好的內核位於arch/cpu/boot目錄下
5. 編譯內核模塊
Make modules
6. 安裝內核模塊
Make modules_install(將編譯好的內核模塊從內核源代碼目錄copy到/lib/modules下)
7. 製作init ramdisk
Mkinitrd intrd-$version $version
例如:mkinitrd initrd-2.6.29 2.6.29
$version可以通過查詢/lib/modules下的目錄得到
1:cp arch/x86/boot/bzimage /boot/mlinuz-$version
2:cp $initrd /boot/
3修改/etc/grub.conf 或者/etc/lilo.conf
**$version爲內核當前版本號**