一、UBoot 如何调用内核
UBoot通过命令把Linux内核镜像文件从Flash中读取到内存的某一位置,然后设置PC寄存器执向该位置UBoot调用Linux内核。
调用内核的条件是:
1. R0 =0
2.R1=适当的机器码,位于linux/arch/arm/tools/mach-type文件中
3.R2 =启动参数标记列表在内存中的位置
4.CPU必须设置为SVC模式并关闭中断
5.MMU必须关闭
二、UBoot 如何给内核传递参数
UBoot和内核交互是单向的,两个程序不能同时运行,那么要实现参数传递只能通过把参数存放到一个固定内存位置然后调用theKernel函数给对R0,R1,R2寄存器赋值。Linux启动调用start_kernel函数读取内容即可。
三、UBoot 启动流程
(1)、u_bootstage1 部分流程
(2)、u_bootstage2 部分流程
四、uboot 在mini2440 开发板上移植步骤
从网上下载uboot,内核文件是s3c2410源码
第一:改机器码
linux2.6.33/arch/arm/tools/mach-type文件中,
修改s3c2440机器码为1999
第二:修改外部时钟晶振
修改s3c24xx_init_clocks函数参数改为12M(12加6个零)该函数位于
(arch/arm/mach-s3c2440/mach-smdk2440.c)
第三:MTD分区(修改Nand Flash文件分区)
在Linux中用static struct mtd_partition这个结构体
来描述NANDFLASH的分区情况
(位于linux/arch/arm/plat-s3c24xx/common-smdk.c文件中)
第四:LCD相关参数设置
在/arch/arm/mach-s3c2440/mach-smdk2440.c中定义
第五:编译内核
打yaffs2补丁
见 yaffs2 /README-linux-patch
./patch-ker.sh c /myfile/linux-2.6.33 (自己指定的linux内核文件夹)
linux内核顶层makefile文件中 189 ARCH ?= arm-,CROSS_COMPILE ?= arm-linux-
make s3c2410_defconfig
第六: 手动修改配置
make menuconfig
修改参数有
(1)内核特性 kernel Features ->[*]use the ARM E ABI to compile
(2)文件系统 File systems ->Miscellaneous filesysytems ->[*]YAFFS2 file system support
(3)支持USB输入 Device Drivers ->HID Devices ->[*]USB Human interface Device
[*]dev hidev run HD device support
第七:执行 make zImage
第八:制作镜像头文件
将uboot源码中的tools目录下的mkimage工具拷贝到内核源码 linux路径arch/arm/boot/下
执行 ./mkimage -n 'linux-2.6.33.7' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage