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
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