一、下載內核源碼
linux內核官網http://www.kernel.org
二、內核源碼樹
目錄 | 說明 |
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 | 虛擬化基礎結構 |
三、編譯內核
- 配置內核:$ make menuconfig
- 編譯:make
四、內核開發的特點
- 內核編程時既不能訪問C庫也不能訪問標準的C頭文件
- 內核編程時必須使用GNU C,內核開發者有時會用到gcc提供的許多語言擴展部分。(gcc是多種GNU編譯器的集合,他包含的C編譯器既可以編譯內核,也可以編譯linux系統上用C語言編寫的其他代碼。)gcc 編譯器支持內聯(inline)函數、內聯彙編、分支聲明(比如likely(),unlikely())
- 沒有內存保護機制,在內核中不能做訪問非法內存地址,引用空指針之類的事情,否則會發成內存錯誤,內核會死掉。
- 不要輕易在內核中使用浮點數,因爲內核不能完美的支持浮點操作,在內核中使用浮點數時,需要人工保證和恢浮點寄存器,還有其他一些瑣碎的事情,所以,不是萬不得已,乾脆就別用浮點操作了。
- 內核棧容積小且固定,在X86上棧的大小在編譯時配置,可以是4KB也可以是8KB。查看內核棧大小的方法:
ulimit -a | grep "stack size"
- 同步和併發,由於內核可以搶佔,是多任務操作系統,進程調度隨時可能發生;中斷處理程序與被中斷的進程訪問同一資源;內核支持對稱對處理器系統(SMP),同時在兩個或兩個以上的處理器上執行的代碼可能會同時訪問共享的資源。因此,需要同步機制保證不出現競爭條件,常用的方法有自旋鎖、信號量、互斥體。
- 保證可移植性,諸如保持字節序、64位對齊、不假定字節長度和頁面長度等方法有助於移植性。