嵌入式linux系統由linux內核與根文件系統兩部分構成,二者缺一不可。linux
製做嵌入式平臺使用的linux內核,方法和製做pc平臺的linux內核基本一致,下面使用對比的方式介紹如何製做用於OK6410開發板的內核。vim
1. 清除原有配置與中間文件bash
x86: make distclean工具
arm: make distclean測試
2. 配置內核ui
x86: make menuconfig 後面默認加了ARCH=i386.net
arm: make menuconfig ARCH=arm3d
解壓linux-2.6.36.tar.gz :orm
tar zxvf linux-2.6.36.tar.gzip
cd linux-2.6.36
make s3c6400_defconfig ARCH=arm
(在linux-2.6.36/arch/arm/configs/下面有不少開發板的默認配置文件,利用這個命令就能夠在一些開發板的出廠配置文件基礎上進行配置)
make menuconfig ARCH=arm
System Type -->
ARM system type --->
3. 編譯內核
x86: make bzImage
arm: make uImage ARCH=arm CROSS_COMPILE=arm-linux-
===========================================================================================
arch/arm/mach-s3c64xx/built-in.o: In function `smdk6410_machine_init':
/forlinux/work/kernel/linux-2.6.36/arch/arm/mach-s3c64xx/mach-smdk6410.c:916: undefined reference to `s3c_ts_set_platdata'
arch/arm/mach-s3c64xx/built-in.o:(.init.data+0x288): undefined reference to `s3c_device_ts'
arch/arm/mach-s3c64xx/built-in.o:(.init.data+0x298): undefined reference to `s3c_device_tvenc'
arch/arm/mach-s3c64xx/built-in.o:(.init.data+0x29c): undefined reference to `s3c_device_tvscaler'
arch/arm/mach-s3c64xx/built-in.o:(.init.data+0x2a0): undefined reference to `s3c_device_vpp'
arch/arm/mach-s3c64xx/built-in.o:(.init.data+0x2a4): undefined reference to `s3c_device_mfc'
arch/arm/mach-s3c64xx/built-in.o:(.init.data+0x2a8): undefined reference to `s3c_device_rotator'
arch/arm/mach-s3c64xx/built-in.o:(.init.data+0x2ac): undefined reference to `s3c_device_jpeg'
arch/arm/mach-s3c64xx/built-in.o:(.init.data+0x2b0): undefined reference to `s3c_device_g2d'
arch/arm/mach-s3c64xx/built-in.o:(.init.data+0x2b4): undefined reference to `s3c_device_g3d'
make: *** [.tmp_vmlinux1] Error 1
[root@localhost linux-2.6.36]# make menuconfig ARCH=arm
scripts/kconfig/mconf arch/arm/Kconfig
*** End of Linux kernel configuration.
*** Execute 'make' to build the kernel or try 'make help'.
[root@localhost linux-2.6.36]#
============================================================================================
[root@localhost linux-2.6.36]# vim /forlinux/work/kernel/linux-2.6.36/arch/arm/mach-s3c64xx/mach-smdk6410.c
打開這個文件,將裏面的這些都註釋掉
// s3c_ts_set_platdata(&s3c_ts_platform);
// &s3c_device_ts,
//// &s3c_device_tvenc,
//// &s3c_device_tvscaler,
//// &s3c_device_vpp,
//// &s3c_device_mfc,
//// &s3c_device_rotator,
//// &s3c_device_jpeg,
//// &s3c_device_g2d,
//// &s3c_device_g3d,
而後編譯:
爲何會出現以下的錯誤呢:
mkimage" command not found - U-Boot images will not be built
Image arch/arm/boot/uImage is ready
由於使用make uImage編譯生成的內核能由uboot引導,編譯時會用到mkimage工具,出現這種錯誤是由於編譯器沒法找到mkimage工具,該工具在uboot/tools目錄下,如下兩種方法能夠解決問題:
方法一:在/etc/bashrc的末行加入如下語句:
export PATH:=$PATH:[uboot所在目錄]/tools
方法二:將uboot/tools目錄下的mkimage文件拷備到交叉編譯環境的BIN目錄:
cd [uboot所在目錄]/tools
cp mkimage /usr/local/arm/3.4.1/bin
在紅帽下測試:
若是在Ubuntu下編譯內核uImage出現
"mkimage" command not found - U-Boot images will not be built問題
解決方法:
若是使用的是Ubuntu 9.10及以上版本,能夠使用下面的命令安裝mkimage:
#apt-get install uboot-mkimage 固然也能夠按照上面拷貝工具的方法來解決。
安裝完成後在編譯內核make umage ARCH=arm CROSS_COMPILE=arm-linux-,就能夠生成uImage文件