uboot和linux内核移植,Uboot与kernel移植总结

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

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

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

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

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

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

#define CONFIG_S3C2440_NAND_BOOT 1

#define STACK_BASE    0x33f00000

#define STACK_SIZE    0x8000

--->在board/目录下建立自己的目录:该目录下含lowlevel_init.s、uboot.lds,config.mk及makefile,flash.c和xxxboard.c

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

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

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

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

内核移植

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

Uboot从C函数跳到kernel的head.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-objs:obj-?指定编译什么,怎么编译?其中的“?”可能是“y”或“m”,“y”指定把对象编译进内核中,“m”指定把对象编译为模块。语法如下;     obj-? = $(target).o(target.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 menuconfig时scripts目录下工具会读取各目录下的kconfig(定义了makefile中会用到的变量)并形成菜单;

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

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

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值