1. 程式人生 > >Uboot與kernel移植總結

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檔案就行呢?--------->

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