1. 程式人生 > >linux核心移植與編譯

linux核心移植與編譯

在瞭解了核心及其相關知識之後,就要著手核心移植的實驗了。

使用make menuconfig出現問題請移步make: *** 沒有規則可以建立目標“menuconfig”。 停止。

 

Linux核心移植與編譯

1.linux核心的下載

實驗開始之前,你需要自行下載linux核心,因為最後要移植都開發板上,因此需要下載相應的核心,下載連結如下:

https://pan.baidu.com/s/1epiuTQm9JoziuFQ0DVpQ_w

2.linux核心的解壓

下載完畢後,將檔案利用vmware的共享資料夾傳輸到Ubuntu環境下,進入共享資料夾。

終端輸入:cp linux-3.0.15.tar.gz /nfsroot/kernel,將核心檔案拷貝到指定目錄。進入該目錄,對核心檔案進行解壓。

終端輸入:tar xvzf linux-3.0.15.tar.gz,將核心檔案解壓到當前資料夾。

解壓成功後,當前資料夾下會生成linux-3.0.15目錄。

3.如何新增新的核心驅動

首先進入核心原始碼目錄,終端輸入:cd linux-3.0.15

接著進入drivers/char 目錄,終端輸入:cd drivers/char

在char目錄下,我們利用vim編輯器編寫一個helloworld.c檔案,檔案內容如下:

終端輸入:vim helloworld.c

#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
        printk(KERN_ALERT"Hello, world\n");
        return 0;
}
static void hello_exit(void)
{
        printk(KERN_ALERT"Goodbye, world\n");
}

module_init(hello_init);
module_exit(hello_exit);

 

進入核心原始碼目錄修改drivers/char目錄下的Kconfig檔案,按照Kconfig的語法新增helloworld的程式選單支援。

終端輸入:cd /nfsroot/kernel/linux-3.0.15

vim drivers/char/Kconfig

在Kconfig檔案中的source“driver/char/hw_random/Kconfig”下面新增如下內容(大約在264行)

進入末行模式,輸入:g/source,找到相應的行,末行模式輸入 :行數  即可將游標迅速跳轉至相應行。

新增內容如下:

config HELLO_MODULE
        bool "Hello World Test" 
        depends on CPU_EXYNOS4412 
        help 
          This is a demo to test kernel experiment On UP-CUP44.

 

注意:config HELLO_MODULE段要與前後段有換行隔開,且bool行前要有tab製表位,注意格式。

接下來對drivers/char目錄下的Makefile檔案進行修改,按照核心中Makefile的語法格式新增helloworld程式的編譯支援。

終端輸入:vim drivers/char/Makefile

當前處於末行模式,輸入 :g/hw_random

找到obj-$(CONFIG_HW_RANDOM) += hw_random/,在其下面新增如下內容:

obj-$(CONFIG_HELLO_MODULE) += helloworld.o

 

接下來執行make menuconfig 配置核心對helloworld程式的支援。

終端輸入:make menuconfig

進入Device Drivers --->,如下圖所示:

接著進入Character devices --->,如下圖所示:

但是經過尋找並沒有發現hello選單。

經過嘗試,決定改用新建目錄的方式將hello程式寫進核心。

(參考網址:https://blog.csdn.net/u013359794/article/details/46501923)

在drivers/char下新建hello目錄,目錄中包含helloworld.c和Makefile以及Kconfig檔案。

其中helloworld.c中的內容與上面的相同,Makefile的內容如下:

    obj-$(CONFIG_HELLO) += helloworld.o

Kconfig的內容如下:

    config HELLO_MOUDLE
    bool "Hello World Test"
    help
       Test for adding driver to menuconfig.

接下來對上一級目錄的Makefile和Kconfig檔案進行修改:

進入核心原始碼目錄linux-3.0.15,終端輸入:vim drivers/char/Kconfig

在檔案末endmenu之前新增:
source "drivers/char/hello/Kconfig"

終端輸入:vim drivers/char/Makefile

在檔案末尾處新增:

obj-$(CONFIG_HELLO_MOUDLE) += hello/

 

完成修改後,在原始碼目錄輸入make menuconfig,同樣進入Device Drivers --->、Character devices --->發現新目錄。

按空格鍵將尖括號中選為*,之後儲存退出,選擇yes。

之後執行make命令,將核心重新編譯。編譯成功後,會在核心原始碼目錄的arch/arm/boot

目錄下生成核心壓縮檔案zImage。在完成之後,按照配套文件將新生成的核心重新燒寫到開發板,就能在串列埠終端顯示核心在啟動過程中列印的相應資訊。

 

如果在make執行過程中出現:elf_i386或elf_x86_64:沒有那個檔案或目錄

原因是gcc 4.6不再支援linker-style架構。

64位系統解決方法:

確保當前路徑是在核心目錄中,然後執行命令:vim arch/x86/vdso/Makefile,在Makefile中搜索elf_x86_64,然後把”-m elf_x86_64” 替換為 “-m64“;

在Makefile中搜索elf_i386,然後把”-m elf_i386” 替換為 “-m32“,儲存退出,問題解決了。接著繼續編譯,就可以了。

32位系統解決方法:

在Makefile中搜索elf_i386,然後把”-m elf_i386” 替換為 “-m32“,儲存退出,問題解決了。接著繼續編譯,就可以了。

 

如果make過程中出現               PATH_MAX未宣告(在此函式內第一次使用)

發現PATH_MAX在limits.h中定義,在/scripts/mod/sumversion.c中新增#include <limits.h>即可。