Linux內核入門-如何獲取Linux內核源代碼、生成配置內核


如何獲取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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM