內核配置、編譯與安裝

Linux內核具有可定製的有點,下面講述內核的配置和編譯步驟

通常拿到一個內核系統源碼,你不知道具體別人有沒有配置過這個系統或做了哪些系統配置文件的修改,你要將系統還原到最初的默認配置狀態,則直接進行清除臨時文件、中間文件和配置文件。

 
總之,


 疑問:
make menuconfig提示:“recipe for target 'scripts/kconfig/mconf.o' failed…”
原因:缺少字符界面運行庫,執行:aptitude install libncurses5-dev或者apt-get install libncurses5-dev
步驟一,內核配置:
執行make menuconfig,進入到內核字符配置界面後,注意看上面的提示!!!
1、當進入到子選項後,要退出可以:
①    連續按兩次esc鍵
②    按x鍵
2、前面沒有中括號的表示系統默認選中,不能配置,前面的有中括號的,有*表示選中,沒有表示不選(通過按y/n鍵來切換);
    其中【M】:只編譯不鏈接,【*】:既編譯也鏈接

疑問:
針對不同的開發板,linux內核如何進行配置呢?
可以參考內核源碼中提供的一些默認配置選項:
執行:/usr/src/linux-source-4.4.0/linux-source-4.4.0/arch/arm/configs,其中會有一些參考的配置文件,其中/usr/src/linux-source-4.4.0/linux-source-4.4.0爲解壓的源碼所在路徑
利用一些參考配置進行修改,不知道的配置不要動!
執行:ls -a可以看到隱藏的.config文件

步驟二,內核編譯:
編譯指令:
 
其中加了V=1後,在編譯會把編譯使用的工具,鏈接了哪些文件,等信息全部都會列出來,方便編譯出錯調試找出錯誤原因。

編譯內核提示錯誤:
 
解決:sudo apt-get install libssl-dev
然後執行make bzImage V=1,等待編譯完成,可能時間會有點長!

步驟三,編譯內核模塊:


因爲linux內核有一部分直接被編譯到linux Image(內核鏡像)中,還有一部分功能是以內核模塊的形式存在的,因此我們要把這部分功能編譯並安裝進內核中。

步驟四,安裝內核模塊:
 
知識補充:內核模塊是一種可被動態加載和卸載的可執行程序,把先可能要用到的模塊編譯安裝好後,方便後面系統正常運行後用戶隨時動態加載調用(注意先編譯內核再編譯內核模塊,編譯後的內核模塊會駐留在編譯過的內核中,這樣纔可以動態加載)。通過內核模塊可以擴展內核功能,內核模塊通常用於設備驅動、文件系統等。如果沒有內核模塊,需要向內核添加功能就需要自發代碼、重新編譯內核、安裝新內核等步驟。參見http://www.cnblogs.com/zhangchaoyang/articles/1933927.html;後面也講到這一部分。

步驟五,製作init ramdisk
 
知識補充:RamDisk 就是將內存中的一塊區域作爲物理磁盤來使用的一種技術。對於用戶來說,可以把RAM disk與通常的硬盤分區同等對待來使用。
內存盤對於保存加密數據來說很有用,因爲我們如果將加密的文件解密到普通磁盤的話,即使我們隨後刪除了解密文件,數據仍然會留在磁盤上。這樣是非常不安全的。而對於 RamDisk 來說,沒有這樣的問題。
假設有幾個文件要頻繁的使用,你如果將它們加到內存當中,程序運行速度會大副提高,因爲內存的讀寫速度遠高於硬盤。
像Web服務器,需要大量的讀取和交換特定的文件的電腦,在Web服務器上建立RamDisk會大大提高網絡讀取速度。
注意:在2.6版本後,Ramdisk的這一作用開始被tmpfs(Virtual memory file system support)取代。

步驟六,內核安裝(不要和內核模塊安裝混淆)
 
其中,1是將編譯好的內核鏡像文件(bzImage文件)cp到/boot/下面,名字有規則的取最好(例如vmlinuz-4.12.23);然後將製作好的ramdisk(這裏是$initrd)也cp到/boot/下面;最後修改系統啓動配置文件(grub或者lilo文件)。
 
可以看到重啓後,可以看到My Linux自己製作的linux系統可以啓動了
 
補充:
什麼是內核模塊?
 
例如:
 
其中,static int hello_init(void)在內核模塊加載時由系統自動調用運行,由module_init宏指定初始化函數,static void hello_exit(void)是在內核模塊卸載時系統調用運行,由module_exit宏指定卸載函數;在內核調用的中的是prink(..)函數。
1、模塊的安裝與卸載
 
情況1:
編寫makefile文件編譯上述中的單個hello.c源文件,makefile文件的編寫如下:
 
然後,在makefile所在路徑執行:make,得到hello.ko文件,然後執行:insmod(hello.ko)

情況2:
編寫makefile文件編譯上述中的多個源文件,makefile文件的編寫如下:
 
然後,在makefile所在路徑執行:make,得到hello.ko文件,然後執行:insmod(hello.ko)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章