1. 程式人生 > >Ubuntu下編譯linux核心

Ubuntu下編譯linux核心

1.概念解釋

      vmlinuz是可引導的、壓縮的核心。“vm”代表“Virtual Memory”。Linux 支援虛擬記憶體,不像老的作業系統比如DOS有640KB記憶體的限制。Linux能夠使用硬碟空間作為虛擬記憶體,因此得名“vm”。vmlinuz的建立有兩種方式。一是編譯核心時通過“make zImage”建立,然後通過:“cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage /boot/vmlinuz”產生。zImage適用於小核心的情況,它的存在是為了向後的相容性。二是核心編譯時通過命令make bzImage建立,然後通過:“cp /usr/src/linux-2.4/arch/i386/linux/boot/bzImage /boot/vmlinuz”產生。bzImage是壓縮的核心映像

,需要注意,bzImage不是用bzip2壓縮的,bzImage中的bz容易引起誤解,bz表示“big zImage”。 bzImage中的b是“big”意思。

vmlinux  編譯出來的最原始的核心檔案,未壓縮。

zImage   是vmlinux經過gzip壓縮後的檔案。

bzImage bz表示“big zImage”,不是用bzip2壓縮的。兩者的不同之處在於,zImage解壓縮核心到低端記憶體(第一個640K),bzImage解壓縮核心到高階記憶體(1M以上)。如果核心比較小,那麼採用zImage或bzImage都行,如果比較大應該用bzImage。

uImage   U-boot專用的映像檔案,它是在zImage之前加上一個長度為0x40的tag。

vmlinuz  是bzImage/zImage檔案的拷貝或指向bzImage/zImage的連結。

initrd   是“initial ramdisk”的簡寫。一般被用來臨時的引導硬體到實際核心vmlinuz能夠接管並繼續引導的狀態。

2.編譯選項

在核心原始碼目錄下執行以下步驟:

1."make mrproper", 清理原始碼目錄, 對於剛下載的核心, 可省略該步驟

2."make menuconfig", 直接儲存預設配置即可(一般預設配置就是發行版的預設配置), 也可根據需要修改相關配置.

3."make dep", 檢查模組間的依賴關係

4."make bzImage", 編譯核心

5."make modules", 編譯模組

6."sudo make modules_install", 安裝模組 //將編譯好的核心模組從核心原始碼目錄copy到/lib/modules下,可以檢視Makefile檔案看其究竟做了什麼事情

7."sudo make install", 安裝核心

8."sudo mkinitramfs 2.6.32.56+drm33.22 -o /boot/initrd.img-2.6.32.56+drm33.22", 安裝initramfs; "2.6.32.56+drm33.22"為核心版本號

9.修改grub啟動設定, 在ubuntu上, 如無特殊需求, 執行"sudo update-grub"即可; 也可手動修改/boot/grub/menu.lst檔案或/boot/grub/grub.cfg檔案.

3.具體編譯與啟動步驟

①去www.kernel.org 下載原始碼並解壓,我下載的是3.12.68版本,最近更新日期是2016.11.29,能滿足需求。我是通過共享資料夾的方式讓Ubuntu虛擬機器與win7共享原始碼,這樣既可以直接在虛擬機器中編譯,又可以在win7上用sourceinsight閱讀與修改原始碼。共享資料夾預設掛在在/mnt/hgfs/xxx下。

②如果已經安裝了必須的庫(見我另一篇博文點選開啟連結),則make menuconfig可以正常看到配置介面。為了節約時間,將當前正在使用的Linux的配置檔案拷貝到原始碼目錄下,並改名為.config。

cp /boot/config-3.11.0-15-generic ./

        mv config-3.11.0-15-generic .config


有了.config檔案之後,執行make menuconfig,然後Load目錄下的.config檔案,如果想要自己定製一些模組,則可以進行修改,修改選項有Y 、N 和M,可以只把Linux核心啟動必需的模組編譯到核心中,其它的可以選擇M或N。其中:

y: 模組驅動編譯到核心中,啟動時自動載入

   m:模組會被編譯,但是不會被編譯到核心中,只是生成.o檔案,我們可以收集這些.o檔案做到Linux的檔案系統中,然後用insmod實現動態載入。

(3)make -j4 進行編譯

        make命令預設的執行的是:make bzlmage和make modules

    模組的編譯

   模組一般用來支援那些不經常使用的功能。例如,通常情況下你僅使用撥號網路,因此網路功能並不是任何時候都需要的,那麼就應該使用可裝入的模組來提供 這個功能。僅在你進行撥號聯接的時候,該模組才被裝入。而在你斷掉連線的時候它會被自動卸下。這樣會使核心使用記憶體的量最小,減小系統的負荷。 
  當然,那些象硬碟訪問這樣時時刻刻都需要的功能,則必須作在核心裡。如果你搭一臺網路工作站或web伺服器,那麼網路功能是時刻都需要的,你就應該考 慮把網路功能編譯到核心裡。另外一個方法是在啟動的時候就裝入網路模組。這種方法的優點是你不需要重新編譯核心。而缺點是網路功能不能特別高效。 

 如果要以手工的方式載入模組, 建議最好使用 modprobe, 因為它可以解決模組之間的依賴性問題。

(4)安裝

       make modules_install   安裝模組,會在/lib/modules下生成3.12.68的資料夾,裡面存放著新核心的所有可載入模組,這一步不可缺少,否則後面的make install會有問題。

     make install   安裝核心,複製核心目錄內的.config,vmlinuz,initrd.img,System.map檔案到系統/boot目錄、更新grub。

     重啟系統即發現grub啟動項中有了剛剛編譯生成的linux系統了。需要注意Linux發行版與核心的關係,我們在上面將不同的Linux核心都安裝到了/boot下,但是他們使用的是同一套發行版即Ubuntu12.04LTS,核心是系統核,發行版是每個社團增加了外圍資源(比如使用者介面,系統安裝,程式更新),所以發行版和核心是可以任意搭配的,但發行版採取的各種使用者應用方式可能不同,其實本質是一樣的,就是核心定製+驅動定製+應用定製,版本號只是用來標識而已。