个人——对u-boot移植过程的理解

来源:互联网 发布:睡觉 知乎 编辑:程序博客网 时间:2024/04/30 01:05
Time 2014-10-09 by Zhou
结合“完整的内存布局.tif” 进行分析


1》烧写 u-boot.bin
tftp 20008000 u-boot.bin        //通过tftp 将 编译好的 u-boot.bin 下载到nand上
nand erase 0 40000 ;nand write 20008000 /* 擦除nand的一块空间,将 下载好的 u-boot.bin 写进去;
 * nand 的起始地址是 0x 0
 */
2》板子上电启动,将 nand 上的前 16k 代码加载到 IRAM 中的0x34000000的位置完成 第一阶段的运行。--->第一阶段(start.S)
3》在第一阶段中 完成 把 整个 u-boot 重定位到 DDR 内存中的 TEXT_BASE 位置。
4》接下来,uboot 会完成(第二阶段)以下工作:---------------------------------------------------->第二阶段 (lib_arm/board.c)
1.初始化一个全局变量
2.完成初始化序列
3.nandflash 初始化

4.环境变量的初始化
env_relocate ();
如果 nand 0x40000 的位置有关于 环境变量的数据,则会到那里去取,如果该块的数据被擦出掉了,则会执行默认的环境变量值。
(擦出 nand 中保存环境变量区数据 语句:nand erase 0x40000 0x20000(128K);
 读取 nand 中的数据时 一次 2K??)
setenv 设置的环境变量是保存在DDR 中的,遇到 saveenv 后才会保存到nand 中 0x40000 的位置。

5.网卡初始化
6.进入一个死循环


5》bootcmd tftp 0x20800000 uImage \; bootm 0x20800000 
( 注意: 如果是uImage,则 下载地址一定不能是 0x20008000,编译uImage 时要用到 uboot 源码 tool 目录下的 mkimage,具体用法查看相关文档,若是 zImage 则没有这些限制;
 uboot 默认情况下是不能 启动zImage 的,要实现能加载zImage 则需要改造 do_go 函数;
 启动 uImage 时,用bootm,若是 zImage 则用go ,这是因为 uImage = 64字节头文件 + zImage,如果加载的是zImage,却用了bootm,但是zImage中没有64字节的头文件,
 这时 在执行do_bootm 函数时则会出错。uboot 默认不能启动zImage 是由其源码决定的,具体过程可以分析源码

遇到 bootm 命令时,则会调用 do_bootm  
遇到 go 命令时,则会调用 do_go


启动内核过程:
tftp 0x20800000 uImage ; bootm 0x20800000
do_bootm 0x20800000
|
1, 分析uImage中64字节的头部信息, 将zImage重定位到ep=0x20008000
static bootm_headers_t images;


boot_fn = boot_os[images.os.os]; // common/cmd_bootm.c
==do_bootm_linux,            // lib_arm/bootm.c


2,用一个函数指针指向zImage所在的位置
void (*theKernel)(int zero, int arch, uint params);//lib_arm/bootm.c
char *commandline = getenv ("bootargs");

theKernel = (void (*)(int, int, uint))images->ep;  // 内核入口(执行)地址:0x20008000 

3, 在0x20000100中存放数据
setup_start_tag (bd);  //  设置DDR 内存的起始地址 0x20000000  

/* 表示内存:
* 内核只是负责管理内存,而不会去分配内存空间,所以这里要告诉内核有多大的
* 内存空间给它管理,如果本身的内存空间有256M,而这里只是指定了128M,那么
* 剩下的128M内核是无法进行管理的。---by Zhou 2014-10-09
*/
setup_memory_tags (bd);

/*命令行: 比如 // "console=ttySAC0 root=/dev/mtdblock2"
* 表示:内核的信息从开发板的串口0输出 
* 根文件系统在哪个分区  
*/
setup_commandline_tag (bd, commandline);


setup_end_tag (bd);// 表示参数的结?


4,调用函数指针, 传递一个参数:r1==1826
bd_t *bd = gd->bd;
int machid = bd->bi_arch_number; //gd->bd->bi_arch_number == 1826


theKernel (0, machid, bd->bi_boot_params); //gd->bd->bi_boot_params== 0x20000100


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


附:S5PC100 板子 上 IRAM 和 DDR 的区别,IRAM 的 读写速度较快,但是 内存空间小,而DDR 相对 来说空间则比较
大,但是读写速度相对 IRAM 则会慢一点。
0 0
原创粉丝点击