編譯Linux核心

2021-09-22 07:08:47 字數 3292 閱讀 7462

下面的實驗以 debian7.5 64bit 為例.

獲取 debian7.5 本身的原始碼非常簡單:

sudo apt-get install linux-source
的git上提供的原始碼分支非常多, 剛開始學習原始碼主要關注下面幾個分支:

linus分支: 

linux創始人的分支, 不用說肯定最重要, 它是所有分支的根源. 處於 "mainline" 的地位.

這個分支還有個好聽的名字 – "vanilla(香草)" 核心.

linux-next樹: 

這個乙個為發布將來的版本而積累新**並進行測試的原始碼樹.

由 stephen rothwell 等人進行管理和維護

stable樹: 

這是乙個主要針對過去發布的核心版本進行bug修改, 使其更加穩定的樹.

由 greg kroah-hartman, chris wright 進行管理和維護.

針對某個linus樹的穩定版維護一般持續6個月左右, 也有更持久的.

上面的列出的git樹中都可以獲取想要的原始碼.

其實編譯核心和編譯普通軟體也沒多大區別, 只是核心編譯的引數非常之多.

下面就來先看看如何設定核心編譯引數

編譯選項個數

核心的編譯選項的個數非常多, v2.6.38的核心中就有 12 000 個左右的設定選項(這是包含所有arch的配置選項).

核心編譯選項不僅多, 有些編譯選項之間還存在依賴關係, 所以手動設定編譯選項幾乎是不可能的.

值得慶幸的是, 只要知道自己需要設定的那些選項, 就可以使用 make ***config 來進行設定, 它還會自動處理依賴關係.

配置編譯選項:

設定核心編譯選項是通過kconfig這個工具來完成的.

kconfig 的原始碼就是核心**中 script/kconfig 目錄下

各個編譯選項的選擇有3種方式:

=y :: 直接編譯到核心中

=m :: 以模組方式編譯到核心中

不設定 :: 不編譯

編譯方法:

make menuconfig :: 原始碼根目錄下生成 .config (沒有會自動生成), .config中就是各個核心編譯選項的選擇狀況.

make defconfig :: 根據當前系統的架構預設 .config 生成核心原始碼目錄下的 .config (每個架構的配置檔案: ex. arch/x86/configs/x86_64_defconfig)

make oldconfig :: 將已有的 .config 放到原始碼根目錄下後執行, 目的是為了復用之前的核心編譯選項的配置.

make xconfig :: 圖形化配置, 需要qt3, 個人覺得沒有必要, 有 make menuconfig 就足夠了.

make localmodconfig :: 生成以正在使用的核心模組為物件的 .config

編譯很簡單, 核心編譯選項設定好之後, 只需簡單的命令 make, 就可以編譯了.

由於核心**的龐大, 所以和一般應用程式相比, 編譯時間會很長. 可以嘗試以下方法來加快編譯速度:

不用的驅動程式都不要設定, 這樣就不會編譯

利用make的 -j 選項來併發編譯, ex. make -j n (n是併發數). 如果你的機器有2個cpu, 可以用 make -j 2 來提高編譯速度

使用 make localmodconfig 來生成僅以正在使用的核心模組為物件的 .config (一般這樣生成的.config中包含的核心模組最少, 所以編譯速度快)

編譯時間比較: 測試環境 - debian v7.5虛擬機器(cpu: 單核, 記憶體: 512mb)

.config生成

make時間

生成的modules

備註make menuconfig

1小時13分41秒

3052個.ko, 共1.2gb

預設配置, 什麼也不選擇

make localmodconfig

19分36秒

337 個.ko, 共176mb

modules 是通過 make modules_install 之後, 在 /lib/modules 中根據編譯核心版本號來檢視的

檢視有多少個 .ko 檔案的方法:

cd /lib/modules/3.2.60

find . -name '*.ko' | wc -l

模組和核心不在一起的編譯, 就是在現有的核心中追加一些核心模組時, 不需要將核心也重新編譯.

模組分開編譯的方法很簡單, 參考之前的部落格: 《linux核心設計與實現》讀書筆記(六)- 核心資料結構 這篇部落格中的例子就是和核心分開編譯的模組.

交叉編譯就是在當前平台上編譯其他平台上的核心二進位制映像, 比如在 x86_64 平台上編譯 arm 的核心映像.

交叉編譯需要目標平台的交叉編譯器. 編譯時主要是 arch 和 cross_compile 2個變數的設定.

下面舉個交叉編譯 arm 的例子: 公司用的製作 cubieboard 板子上的image中的一段編譯核心的**

make -c $ o=$ arch=arm cross_compile=arm-linux-gnueabi- kernel_defconfig

make -c $ o=$ arch=arm cross_compile=arm-linux-gnueabi- -j4 install_mod_path=$ uimage modules

上述 第一行 是編譯核心原始碼. 第二行 是建立 uimage 格式的核心映像以及建立核心模組

最終在 install_mod_path 生成的核心模組可以直接拷貝到 arm機器上使用.

debian 系 linux下生成 核心原始碼包的方法

make deb-pkg
make modules_install (安裝核心模組到 /lib/modules 下)

make install (安裝核心二進位制映像, 生成並安裝boot初始化檔案系統映像檔案)

刪除/lib/modules/目錄下不需要的核心庫檔案

刪除/usr/src/kernel/目錄下不需要的核心原始碼

刪除/boot目錄下啟動的核心檔案禾核心映像

更改grub的配置,刪除不需要的核心啟動列表

make help : 核心makefile中的各種 target

make cscope : 生成 cscope 檔案

make tags/tags : tags可用於vim, tags可用於emacs

編譯 linux 核心

一 準備工作 tpv te0 首先說明,下面帶 號的行都是要輸入的命令列,且本文提到的所有命令列都在終端裡輸入。ixpub技術部落格 rc0p a6zx j 啟動linux系統,並用根使用者登入,進入終端模式下。6i sb w,a0 ixpub技術部落格c gng,y y ixpub技術部落格 k,...

linux編譯核心

red hat linux版本的核心編譯 make j2 編譯 make modules make modules install make install cd boot mkinitramfs o initrd.img 2.6.30.10 2.6.30.10 此項可能不需要 vim boot g...

Linux核心編譯

經過幾天的努力,本人終於把乙個核心編譯成功了,嘿嘿,現在把編譯過程記下來,以後再接再勵,注意 以下的操作都要有root許可權。linux 2.6.36.tar.bz2。2 解壓縮。cd usr src tar xvf home ibm linux 2.6.36.tar.bz2.usr src下就會多...