linux-2.6.30.4内核制作体验

来源:互联网 发布:应用单片机转速测量仪 编辑:程序博客网 时间:2024/05/15 05:12
Linux内核移植体验记录:
1.下载、解压内核
(1)从https://www.kernel.org/pub/linux/kernel/v2.6/下载内核完整源码包linux-2.6.30.4.tar.bz2
tar xvjf linux-2.6.30.4.tar.gz2
内核分为:完整源码版本和补丁版本。源码版本文件比较大,通常都是40M以上,而补丁版本一般就几K或者是几M,要小好多,打补丁的规则举个例子:
比如现在有Linux-2.4.16版本,之后又有了Linux-2.4.17版本,这时就需要下载patch-2.4.16.17才能实现打补丁升级
(2)添加对arm开发板的支持,修改顶层Makefile:“vim Makefile”
第193行修改成:这样后面配置编译工作会简单很多,到了后面自然就明白为什么要这样做了
ARCH = arm
CROSS_COMPILE = arm-linux-
【或者直接使用天嵌的内核linux-2.6.30.4_20100531,这些都已经做好了】

2.工具安装匹配要求:查看Documentation/Changes文件,里面有涉及编译该版本内核的工具的版本要求
o  Gnu C                  3.2                     # gcc --version
o  Gnu make            3.79.1                  # make --version
......
GCC
---
The gcc version requirements may vary depending on the type of CPU in your
computer.
要求GNU gcc编译器的版本大于等于v3.2
在Linux终端上看版本
Make
----
You will need Gnu make 3.79.1 or later to build the kernel.
要求GNU make版本大于等于v3.79.1
在Linux终端上分别使用“arm-linux-gcc -v”、“make -v”查看他们的版本
我的是:
gcc version 4.3.3
GNU Make 3.81
3.配置内核:
在进行具体的配置之前将天嵌准备好的配置文件拷贝成配置文件,执行命令:
cp config_EmbedSky_W35 .config
接着进行具体的配置,内核的配置方式有:
(1)make config:这是一种基于文字对话方式的配置方法
(2)make oldconfig:使用已有的“.config”文件,不过会询问新的配置选项
(3)make menuconfig:基于图形化界面的配置方法:
它是这样实现的:看看顶层Makefile的:455行
config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
%config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
这里的“%”是通配符的意思,就是“xconfig、menuconfig、oldconfig等等”都是依赖于“scripts_basic outputmakefile FORCE”
上面翻译过来就相当于:
make -C scripts/kconfig/ config
make -C scripts/kconfig/ %config
就是执行scripts/kconfig/Makefile文件,这部分原理就不深究先。在弹出的配置界面也是非常好用,这里也不做详细讲解,记得在文件系统支持上选上yaffs2文件系统支持。
4.修改开发板使用的时钟晶振频率:12MHz,而不是16.9344MHz
将arch/arm/mach-s3c2440/mach-tq2440.c里面的tq2440_map_io函数改成:
static void __init tq2440_map_io(void)
{
s3c24xx_init_io(tq2440_iodesc, ARRAY_SIZE(tq2440_iodesc));
s3c24xx_init_clocks(12000000);
s3c24xx_init_uarts(tq2440_uartcfgs, ARRAY_SIZE(tq2440_uartcfgs));
}
5.修改机器ID
将arch/arm/tools/mach-types文件的379行的:
s3c2440 ARCH_S3C2440S3C2440362
改成:
s3c2440 ARCH_S3C2440S3C2440168
6.设置Nand Flash分区表
将arch/arm/plat-s3c24xx/common-smdk.c复制为comon-EmbedSky.c,并将主要部分修改成:
<span style="font-size:14px;">static struct mtd_partition EmbedSky_default_nand_part[] = {[0] = {.name= "EmbedSky_Board_uboot",//存放“u-boot”.offset= 0x00000000,    //在nand中的起始地址为0x00000000.size= 0x00040000, //大小:0x40000字节=256KBytes},#if defined(CONFIG_FB_S3C24X0_TFT1024768)//这个没有定义[1] = {.name= "EmbedSky_Board_kernel",.offset= 0x00280000, .size= 0x00300000, },[2] = {.name= "EmbedSky_Board_yaffs2",.offset= 0x00580000, .size= MTDPART_SIZ_FULL,}#else[1] = {.name= "EmbedSky_Board_kernel",//存放“kernel”.offset= 0x00200000,//在nand中的起始地址为0x00200000.size= 0x00300000,//大小:0x00300000字节=3MBytes},[2] = {.name= "EmbedSky_Board_yaffs2",  //存放“rootfs”.offset= 0x00500000,//在nand中的起始地址为0x00500000.size= MTDPART_SIZ_FULL,//在include/linux/partitions.h里面有:#define MTDPART_SIZ_FULL(0)//表明用剩余的空间,即用满整个flash}#endif};</span>
从这段代码可以看到第[0]块和第[1]块之间存在0x1C000字节的间隙空间,这个空间是用来存放uboot的引导参数的,即uboot的环境变量
7.Makefile改进:
(1)将arch/arm/boot/Makefile的56行:
$(obj)/zImage:$(obj)/compressed/vmlinux FORCE
$(call if_changed,objcopy)
#添加下面这一句:将生成的zImage镜像文件复制到顶层目录下面,并且命名为zImage.bin
@cp -f arch/arm/boot/zImage zImage.bin 
@echo '  Kernel: $@ is ready'
同时在顶层Makefile的“distclean”目标命令的后面添加:
rm zImage.bin
(2)还有就是为了不要在每次“distclean”时把“.config”文件也清除掉,我把
MRPROPER_FILES +=.config .config.old include/asm .version .old_version \
                  include/linux/autoconf.h include/linux/version.h      \
                  include/linux/utsrelease.h                            \
                  include/linux/bounds.h include/asm*/asm-offsets.h     \
   Module.symvers Module.markers tags TAGS cscope*

的第一个“.config”删掉了。

8.可直接编译uImage改进

①make menuconfig-->Boot options--->去掉Kernel Execte-In-Place from ROM选项

②修改文件 vim arch/arm/boot/Makefile

搜索:/quite_cmd_uimage

将-a和-e选项后面的 $(LOADADDR)都改成0x30008000

③将uboot编译生成的工具mkimage放到ubuntu的/sbin/目录下面


9.编译内核:
①make distclean

②生成zImage.bin文件:make zImage

bootloader执行完后直接就是要跳转到zImage的镜像文件的开始处,zImage的下载地址就是bootloader的“theKernel”函数指针的指向的地址。

③生成uImage文件:make uImage 

另外手动用zImage生成uImage时常用的两条指令:

(A)mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008040 -n linux-2.6.30 -d zImage.bin uImage_neq 
uImage的下载地址只能是0x30008000,才能bootm 30008000启动成功
(B)mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008000 -n linux-2.6.30 -d zImage.bin uImage_eq 
uImage的下载地址随意,就是不能为0x30008000 ,才能bootm+下载地址启动成功




0 0
原创粉丝点击