基於Ubuntu製作內核鏡像
準備工作:
1. 完整的linux內核(本次試驗以linux2.6.35爲例)
2. PC機
操作步驟:
1. 首先,將linux內核拷貝到系統的/usr/src目錄下。
在這個拷貝的過程中有一點需要注意,下載的linux內核不能在windows下進行解壓拷貝。Windows和linux對於文件的命名規則不同,在linux下,文件名是區分大小寫的,名字相同大小寫不同完全可以,但是在windows下,這種命名方式不行,如果在windows下解壓縮,windows會自動刪除文件名相同的文件中的一個。
2. 修改根目錄下的Makefile文件,
修改如下:export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
3. 將系統目錄下的Kconfig拷貝到Linux2.6.35內核目錄下
4. 執行: makeclean
Make menuconfig (注:參見文檔linux修改kernel支持xr17d158方法-3)
Make bzImage
執行完到這一步,可能出現一個錯誤:
Error: gcc : 錯誤:elf_i386 : 沒有那個文件或目錄
Reason: PC機上安裝的gcc 編譯器不支持linker-style架構
Solution : 1, 修改 ./arch/x86/vdso/Makefile 中,找到VDSO_LDFLAGS_vdso.lds= -m elf_x86_64 –WL , ***
將“-melf_x86_64”替換爲“-m 64 ”
2, 找到VDSO_LDFLAGS_vdso32.lds = -m elf_x86_i386 –WL ,***
把“-melf_x86_i386”替換爲“-m32”
5. 執行make bzImage
成功則顯示: Root device is(8,7)
Setup is 13532bytes (padded to 13824 bytes)
System is 3455kb
CRC 3fa36e81
Kernel :arch/x86/boot/bzImage is ready (#1)
6. 執行make modules
可能出現的錯誤:
Error : Infile include from driver /net/igbvf/ethtool.c : 36: 0 :
driver/net/igbvf/igbvf.h : 在文件作用域:
driver/net/igbvf/igbvf.h : 129 : 15 : error : 重複的成員’page’
Reason : 錯誤是由於gcc版本與內核版本衝突,首先建議更換內核,目前,我們修改內核代碼以適應當前的編譯器。
Solution :/drivers/net/igbvf/igbvf.h : 129 : 15 : 代碼爲:”struct page*page”和line124中有相同的定義,”struct page *page“,將line129中的定義改爲”struct page *pagep”。
7. 重新執行make modules
8. 執行make modules_install
9. 執行make install
注:在執行make modules 的時候如果出現以下錯誤:
1,Make[1] : ***沒有規則可以創建”***/***.o”需要的目標”***/***.c”,停止。
2,In file include from**/**/**.c : ** : ** :
Include/**/**/**.h: 在文件作用域 :include/**/**/**.h: ** : ** : 致命錯誤,linux/**/**.h : 沒有這個文件或目錄。
Reason : 由於windows 和linux 下解壓縮的過程中的文件命名規則不同,在windows下可能會刪除名字一樣大小寫不一樣的文件,而linux下這種文件卻是可以共存的。故可能是因爲內核在windows下解壓縮,造成文件的丟失。
Solution : 修改指定目錄下的Makefile文件,將出現錯誤的文件所對應的Makefile配置代碼註釋掉。
Solu-Web : http://www.cnblogs.com/crazywangzx/p/3505289.html
http://loveboykan.blog.163.com/blog/static/182699468201211101659849/