Uboot与kernel移植总结

设置uimage入口:由于一个可执行的Image必须有一个入口点,并且只能有一个全局入口,通常这个入口放在ROMFlash)的0x0地址,因此,必须通知编译器以使其知道这个入口,该工作可通过修改连接器脚本来完成。

要理解程序的入口地址,自然想到的是连接文件,首先看看开发板相对于某个开发板的连接文件"/board/你的开发板/u-boot.lds"

1.修改顶层makefileboard.cfg入口makefile中添加如下新内容,因为需要执行make xxx_config配置自己的板子---->在单板的数据库boards_cfg中添加自己单板的信息;

qljt2440_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm920t qljt2440 qljt s3c24x0

2:添加include/configs/xxboard.hboard/Samsung/xx_board目录:在 include/configs/ 中建立开发板所需头文件xxx.h

在头文件结尾处添加如下宏定义:

#define CONFIG_S3C2440_NAND_BOOT 1

#define STACK_BASE    0x33f00000

#define STACK_SIZE    0x8000

--->board/目录下建立自己的目录:该目录下含lowlevel_init.suboot.ldsconfig.mkmakefileflash.cxxxboard.c

 此目录下修改flash.cxxxboard.c分别保证flash读写和GPIO控制/PLL/flash初始化函数,makefile中添加flash.oxxxboard.o,根据开发板内存区的配置修改lowlevel_init.Suboot.lds

3.修改start.s中部分寄存器地址的定义、时钟设置。

所以@$(MKCONFIG) A $(@:_config=) 分解出来就是 mkconfig A smdk4412,它的意思就是进入当前目录下的mkconfig文件并且传递两个参数(-A smkd4412)给它。

Boards_cfg为各单板的数据库文件,mkconfig读取数据库文件并初始化ARCH等系统变量;

内核移植

============================================================

UbootC函数跳到kernelhead.s汇编(用汇编因为这部分代码会读取CPU型号等需要直接读写寄存器--->C函数跳到汇编,汇编再跳到C函数;

内核移植必不可少的修改

1.修改机器码:

内核的机器码在arch/arm/tools/mach-types(机器码库)+arch/arm/mach-s3c2440/mach_smdk2440.c文件,将其“MACHINE_START(S3C2440, "SMDK2440")”中的第一项改为与uboot码值对应的宏,在这里是S3C2440

u-boot的机器码是在arch\arm\include\asm\mach-types.h,代码在board/xxx/xxx_board.c

Uboot的机器码一定要修改成与内核的一致,因为内核head.S中会检查uboot传来的机器码与MACHINE_START(S3C2440, "SMDK2440")中的机器码是否一致。

2.修改时钟

arch/arm/mach-s3c2440/mach-smdk2440.c

修改s3c24xx_init_clocks(12000000);

3.修改makefile中的ARCH和编译器类型:

ARCH = arm

CROSS_COMPILE ?= arm-linux-

4.使用S5PV210处理器的默认选项,然后就可以make生成uimage

arch/arm/configs文件夹中有许多命名为xxx_defconfig的配置文件,如果运行make xxx_defconfig,当前.config文件会由xxx_defconfig文件生成。

Kbuild系统:是一个编译框架(makefile框架,因为是基于make编译工具)

1.obj-?和xxx-objsobj-?指定编译什么,怎么编译?其中的“?”可能是“y”或“m”,“y”指定把对象编译进内核中,“m”指定把对象编译为模块。语法如下;     obj-? = $(target).otarget.o为某个o文件,也可能是多个o文件即xxx-objs);

xxx-objs指定了编译对象需要的文件,一般只有在源文件是多个时才需要它。

#drivers/isdn/i4l/Makefile   

obj-$(CONFIG_ISDN) += isdn.o 

 isdn-objs := isdn_net_lib.o isdn_v110.o isdn_common.o

2.EXTRA_CFLAGS有时需要连接内核源代码外部的系统头文件,但Kbuild系统默认的系统头文件都在内核源代码内部,如何使用外部的头文件呢?

EXTRA_CFLAGS可以给Kbuild系统添加外部系统头文件,

EXTRA_CFLAGS += $(ext_include_path)

3.lib-?:所有用lib-y列出的objects在那个文件夹中被综合进单独的一个库,lib-y的使用方法通常被限制在lib/arc/*/lib中。

  #arch/i386/lib/Makefile 

  lib-y    := checksum.o delay.o

Make menuconfigscripts目录下工具会读取各目录下的kconfig(定义了makefile中会用到的变量)并形成菜单;

Make menuconfigmake xxx_defconfig后产生.config.config中的变量都是已定义并配置过的为各子目录的makefile所用。

注:为子目录添加新kconfig时,需在父目录的kconfig中添加source source "arch/arm/父目录/子目录/Kconfig"

注:移植内核时添加flash驱动,为何是修改arch/arm/plat-s3c24xx/commond-smdk.c文件就行呢?--------->

http://blog.csdn.net/zhaole20094463/article/details/7884785

Vmlinux---->Image---->zImage---->uImage

你可能感兴趣的:(Uboot与kernel移植总结)