分类: 嵌入式
2015-05-22 17:15:36
从新移植linux内核
15年4月23日08:37:24
*****特别要注意的是:移植内核的时候用的交叉编译器与构建跟文件系统的时候用的,一定要是统一个版本的,要不就会出现各种错误!!深有体会啊.......*******************
(一)常规方法,按照韦老师的来做(使用厂家提供的配置文件)
1)解压缩
“cd /work/system”
“tar xjf linux-2.6.22.6.tar.bz2”
2)打补丁
“cd /work/system/linux-2.6.22.6”
“patch -p1 < ../linux2.6.22.6_jz2440.patch”
其中p_后面可以写数字,表示忽略几个参数。
3)配置
“cp config_ok .config”
4)编译
“make uImage”
执行的过程中,在最后生成uImage的时候,在命令行最后发现:
**************************************************************
UIMAGE arch/arm/boot/uImage
“mkimage”commond not found – U-boot image will not be built
Image arch/arm/boot/uImage is ready
**************************************************************
即没有mkimage这个工具,直接执行“sudo apt-get install uboot-mkimage”命令,即可安装,再次执行“make uImage”,即可在arch/arm/boot文件夹下面发现生成的uImage。
执行上面的几个步骤就能在/work/system/linux-2.6.22.6/arch/arm/boot文件夹下面生成Image,zImage,uImage。其中Image是内核映象,大概4M,zImage为内核映象的压缩文件,uImage为zImage+64K的头部。
(二)自己使用默认配置,在上面修改的方式移植linux内核
前两步跟上面相同,不再重复写。1) 2)
3)配置
“make s3c2410_defconfig”
“make menuconfig”
提示出错:“curses.h:没有那个文件或目录,编译中断”
百度出来:”ubuntu系统中缺少一个套件ncurses devel“,安装即可,执行
”sudo apt-get install libncurses5-dev“,从新配置成功。
虽然“make menuconfig”的时候,我们什么都不修改,但是这一步不能省去,执行这一步,会生成一部分头文件。
4)编译
“make uImage”
(1)直接执行“make uImage”,提示:
”CHK include/linux/version.h
/bin/sh:1:cannot create …......:Permisson denied
make :***[........]错误2“
一看就是权限不够,于是加上”sudo..........“
(2)执行“sudo make uImage”,结果提示:
”make : arm-linux-gcc:命令没找到
CHK include/linux/version.h
make[1]:include /asm-arm/mach-types.h是最新的
CHK include/.........
CC ….......
/bin/sh:arm-linux-gcc:not found
make[1]:***[......]错误127
make:[prepare0]错误2“
我的arm-linux-gcc 交叉编译链已经安装,输入”arm-“按两下”Tab“键可以出现提示,输入”arm-linux-gcc -v“可以看到版本信息等东西,怎么回事。。。。。。
这时,看到网上一片文章讲的,当在当前用户模式下输入“arm-linux-gcc”时,“PATH”是当前模式下的环境变量,而输入“sudo.....”的时候,是在超级用户模式下,此时的环境变量“PATH”里面没有添加交叉编译链,这时候输入“sudo -s”进入超级用户模式,“vim /etc/environment”“export PATH=$PATH........”等,并且“source /etc/environment”,立即生效,输入exit退出后,再次输入“sudo make uImage”。
这时出现同样的错误,我查看环境变量没有错误,我用“sudo -i”进入超级用户模式,查看环境变量发现没有,这时候发现可能“sudo -i”与“sudo -s”可能有区别。
sudo后面可以添加几个参数,-s后面跟命令,直接在当前路径执行;
-i后面可以不跟命令,也可以跟命令,在/root下运行。
(3)继续”sudo -s“ ”make uImage“
提示错误:
”ccl:error:unrecognised debug output level “dwarf2”
make [1]***[usr/initramfs_data.o]错误1
make:***[usr]错误2“
网上查资料,原因是gcc版本不支持 -gdwarf2参数,打开Makefile ,查找后发现
ifdef CONFIG_DEBUG_INFO
CFLAGS += -g
# AFLAGS +=-gdwarf2
endif
用#号注释了上面那行,此时后可以成功编译uImage,不过暂时不知的注释掉这一行对后面有没有影响。