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>即可。