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
總結
以上是生活随笔為你收集整理的uboot和linux内核移植,Uboot与kernel移植总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 每天天一个linux命令echo,每天一
- 下一篇: linux后台运行cat命令,Linux