如何獲取Linux內核源代碼
如何獲取Linux內核源代碼
下載Linux內核當然要去官方網站了,網站提供了兩種文件下載,一種是完整的Linux內核,另一種是內核增量補丁,它們都是tar歸檔壓縮包。除非你有特別的原因需要使用舊版本的Linux內核,否則你應該總是升級到最新版本。
使用Git
由Linus領頭的內核開發隊伍從幾年前就開始使用Git版本控制系統管理Linux內核了(參考閱讀:什么是Git?),而Git項目本身也是由Linus創建的,它和傳統的CVS不一樣,Git是分布式的,因此它的用法和工作流程很多開發人員可能會感到很陌生,但我強烈建議使用Git下載和管理Linux內核源代碼。
你可以使用下面的Git命令獲取Linus內核代碼樹的最新“推送”版本:
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
然后使用下面的命令將你的代碼樹與Linus的代碼樹最新狀態同步:
$ git pull
安裝內核源代碼
內 核包有GNU zip(gzip)和bzip2格式。Bzip2是默認和首選格式,因為它的壓縮比通常比gzip更好,bzip2格式的Linux內核包 一般采用linux-x.y.z.tar.bz2形式的文件名,這里的x.y.z是內核源代碼的具體版本號,下載到源代碼包后,解壓和抽取就很簡單了,如 果你下載的是bzip2包,運行:
$ tar xvjf linux-x.y.z.tar.bz2
如果你下載的是gzip包,則運行:
$ tar xvzf linux-x.y.z.tar.gz
無論執行上面哪一個命令,最后都會將源代碼解壓和抽取到linux-x.y.z目錄下,如果你使用Git下載和管理內核源代碼,你不需要下載tar包,只需要運行git clone命令,它就會自動下載和解壓。
內核源代碼通常都會安裝到/usr/src/linux下,但在開發的時候最好不要使用這個源代碼樹,因為針對你的C庫編譯的內核版本通常也鏈接到這里的。
應用補丁
Linux內核開發人員會將自己的修改做成補丁與其它人員分享,而且補丁是增量的,增量補丁是從一個內核樹移動到另一個內核樹的有效方法,不用下載完整的內核包就可以升級內核,不僅可節省帶寬,也節省了內核升級時間,應用補丁之前先進入內核源代碼樹所在目錄,然后運行:
$ patch –p1 < ../patch-x.y.z
注意,補丁包也有明確的版本號,這里的版本號與Linux內核源代碼的版本號要一致,內核和補丁版本號不一致時,強制應用補丁會引起意想不到的后果。
內核源代碼樹介紹
內核源代碼樹分為許多目錄,它們下面又包含許多子目錄,源代碼樹的頂級目錄及其描述參見下表。
目錄 | 描述 |
arch | 特定架構的源代碼 |
block | 塊I/O層 |
crypto | 加密API |
Documentation | 內核源代碼文檔 |
drivers | 設備驅動 |
firmware | 使用某個驅動需要的設備固件 |
fs | VFS和獨立文件系統 |
include | 內核頭 |
init | 內核啟動和初始化 |
ipc | 進程間通信 |
kernel | 核心子系統,如調度器 |
lib | 助手例行程序 |
mm | 內存管理子系統和VM |
net | 網絡子系統 |
samples | 示例,示范代碼 |
scripts | 用於生成內核的腳本 |
security | Linux安全模塊 |
sound | 聲音子系統 |
usr | 早期的用戶空間代碼(叫做initramfs) |
tools | 輔助Linux開發的工具 |
virt | 虛擬化基礎設施 |
在源代碼樹的根目錄下還有很多文件需要說明,COPYING是內核許可描述文件(即GNU GPL v2),CREDITS是參與Linux內核的開發人員名單,MAINTAINERS列出了維護各個子系統和驅動的個人,Makefile是內核Makefile的基礎。
生成、配置內核
生成內核
生成內核其實很簡單,甚至比編譯和安裝其它系統級組件,如glibc還要簡單,從2.6版本開始,Linux內核引入了一個新的配置和生成系統,它使生產內核的操作變得更加簡單了。
配置內核
既 然已經拿到內核源代碼,那我們在開始編譯前就可以根據需要自行配置和定制,可以編譯你指定的功能和想要的驅動,配置內核是生成內核必須的一步,因為內核提 供了大量的功能,支持各種不同的硬件,有很多都需要配置,內核配置是由配置選項控制的,配置選項都有CONFIG前綴,例如,對稱多處理(SMP)是由 CONFIG_SMP配置選項配置的,如果設置了這個選項,SMP就被啟用了,反之則被禁用,配置選項可以確定會生成哪個文件,也可以通過預處理指令操控 代碼。
配置選項可以控制生成過程要么是布爾型,要么是三態型,布爾型就是“是”或“否”,大部分內核配置選項都屬於布爾型,如 CONFIG_PREEMPT,而三態型則在“是”和“否”的基礎上,又增加一個“模塊”選項,模塊選項表示配置選項被設置了,但最后會編譯成模塊,而不 是直接編譯進內核,模塊可以理解為可獨立動態載入的對象,一般來說,驅動配置通常都是三態型。
配置選項也可以是字符串或整數,這樣的選項不會控制生成過程,指定的值由內核源代碼訪問預處理宏時使用,例如,可以為某個配置選項指定靜態分配數組的大小。
Linux 廠商也會隨發行版提供預編譯的內核,如Canonical為Ubuntu,或Red Hat為Fedora提供的內核,這樣的內核通常只啟用了需要的內核 功能,幾乎所有驅動都被編譯成模塊了,這樣的內核提供了一個良好的基礎內核和廣泛的硬件模塊支持,無論如何,想要成為內核高手,你應該編譯自己的內核。
值得慶幸的是,內核提供了很多工具簡化配置 ,最簡單的工具是基於文本命令行的實用程序,如:
$ make config
這 個工具會一個選項一個選項地配置,但用戶需要參與,如指定“是(y)”,“否(m)”還是“模塊(m)”,整個配置過程需要很長的時間,因此,除非是有人 按小時計費請你升級內核,實在找不出別的理由用這種最原始的方法配置內核了,相反,有現成的基於ncurses的圖形化工具可以代替。
$ make menuconfig
或是基於gtk+的圖形化工具
$ make gconfig
上述三個工具都將配置選項分成多個類別,如“處理器類型和特征”,你可以在這些類別上來回移動,查看內核選項,當然也可以修改它們的設置了。
下面這個命令會根據你的架構創建一個默認的配置基礎。
$ make defconfig
雖然默認配置有些武斷(在i386上,默認配置是由Linus配置的),但如果你從未配置過內核,它提供了一個良好的開端。
配置選項存儲在源代碼樹根目錄下一個名叫.config的文件中,你可以打開這個文件手工編輯其中的配置選項,修改后或要在新的內核源代碼樹上應用現有配置文件,你可以使用下面的命令驗證和更新配置:
$ make oldconfig
在生成內核之前必須運行這個命令。
配 置選項CONFIG_IKCONFIG_PROC指定了完整的內核配置文件壓縮包位置,默認是/proc/config.gz,這樣在生成新內核時要克隆 現有的配置就變得非常簡單了。如果你當前的內核開啟了這個選項,你可以從/proc拷貝該配置文件,然后在此基礎上生成新的內核:
$ zcat /proc/config.gz > .config $ make oldconfig
內核配置好后,使用下面的命令進行生成:
$ make
和2.6以前的內核不一樣,在生成內核前不再需要執行make dep命令了,依賴樹會自動維護,也不需要再指定特定的生成類型,如bzImage,或獨立生成模塊,默認Makefile規則會自動處理好一切。
將干擾信息最小化
在生成過程中會遭到警告和錯誤的干擾。最小化干擾信息的一個訣竅是重定向make的輸出,但仍然會看到一些警告和錯誤:
$ make > ../detritus
如果你想查看生成輸出,你可以事后閱讀這個文件,如果你完全不想看到任何輸出,那么就重定向到/dev/null:
$ make > /dev/null
同時執行多個生成作業
Make命令提供了一個功能可以將生成過程拆分成多個平行的作業,這些作業可以獨立運行,也可以並行運行,在多處理器系統上可以極大地提高生成速度,也提高了處理器利用率,因為生成大型源代碼樹會出現大量的I/O等待時間。
默認情況下,make只能拆分成一個作業,因為Makefiles常常會包含不正確的依賴信息,如果真是這樣,多個並行執行的作業將會引起混亂,最終會導致生成過程失敗,如果Makefiles中的依賴信息無誤,那么完全可以拆分成多個作業執行,如:
$ make –jn
這里的n表示拆分的作業數量,通常按每個處理器拆分成1-2個作業,例如,在一個16核心的機器上 ,你可以運行:
$ make -j32 > /dev/null
來自: http://www.360its.com/category/%E6%96%87%E7%AB%A0%E6%A0%87%E7%AD%BE/linux