Start.s分析(背景+注解)

Start.s网上有很多注解,但是看完注解后对其整个工作过程又有些模糊,特别是涉及到内存地址的地方,所以通过查阅资料慢慢完善对Start.s的分析,包括他的背景叙述和代码的一些分析,这篇随笔还不断晚上,添加上自己的一些体会和查到的资料。

 

CPU:s3c2440

内核:ARM920t

 

系统启动流程:

1、系统上电后,首先自动判断是否是autoboot模式,如果使用 s3c2440是带有nandflash的,并且被设置成autoboot,从nandflash开始启动。
 
2、在判断是autoboot模式后,mcu内置的nandflash控制器自动将nandflash的最前面的4k区域(这4k区域存放着 bootloader的最前面4k代码)拷贝到samsung所谓的"steppingstone"里面(steppingstone是在S3C2440 中,实际上是一块4k大小的SRAM,见下图),该4k程序需要完成ARM CPU的核心配置,并且把该4K及剩余的代码一起拷贝到SDRAM中的指定位置)
    
    (注:如果是通过nor Flash启动那么没有“4k”的限制,norflash会被直接映射到内存的0x0处,CPU从0x0开始执行,在nor flash中完成主要配置(关看门狗、关中断、设置堆栈等等)后进入SDRAM中继续运行)
 
3、在拷贝完前4k代码后,nandflash控制器自动将"steppingstone"映射到arm地址空间0x00000000开始的前4k区域。
 
4、在映射过程完成后。nandflash控制器将pc指针直接指向arm地址空间的0x00000000位置,准备开始执行"steppingstone"上的代码。
 
5、而"steppingstone"上从nandflash拷贝过来的4k代码,是程序员写的bootloader的前4k代码。这个 bootloader在之前写好,并已经被烧写到nandflash的0x00000000开始的最前面区域,而这"steppingstone"上的4k代码就是bootloader的前4k代码。
 
6、在pc指向arm地址空间的0x00000000后,系统就开始执行指令代码。这4k代码的任务是:
  •      初始化硬件
  •      设置中段向量表
  •      设置堆栈
     然后一个很重要的任务是,将nandflash的最前面区域的bootloader(包含4k启动代码)拷贝到SDRAM中去,bootloader代码的大小是写好bootloader就确定的。然后只需要确定bootloader想映射到SDRAM的起始位置(见下图):
 
   
   
    这一部分在Start.s中对应代码段:
#if 1
bl  CopyCode2Ram    /* r0: source, r1: dest, r2: size */                
#else

   

    其中CopyCode2Ram函数的工作是判断是Nor flash还是Nand flash启动,如果是Nand flash启动那么则将包括前4k内容的整个boot代码段复制到SDram指定位置,代码如下:  

 1 int CopyCode2Ram(unsigned long start_addr, unsigned char *buf, int size)
 2 {
 3     unsigned int *pdwDest;
 4     unsigned int *pdwSrc;
 5     int i;
 6 
 7     if (bBootFrmNORFlash())
 8     {
 9         pdwDest = (unsigned int *)buf;
10         pdwSrc  = (unsigned int *)start_addr;
11         /* 从 NOR Flash启动 */
12         for (i = 0; i < size / 4; i++)
13         {
14             pdwDest[i] = pdwSrc[i];
15         }
16         return 0;
17     }
18     else
19     {
20         /* 初始化NAND Flash */
21         nand_init_ll();
22         /* 从 NAND Flash启动 */
23         nand_read_ll_lp(buf, start_addr, (size + NAND_BLOCK_MASK_LP)&~(NAND_BLOCK_MASK_LP));
24         return 0;
25     }
View Code

 

7、在完成对nandflash上的bootloader搬移后,找到4k代码的搬移代码最后一个指令的下一个指令在SDRAM的bootloader的地址,然后跳转到该位置,继续执行bootloader的剩余代码(引导系统)
 
参考:1、ARM上电启动及u-boot代码分析:http://blog.csdn.net/qianlong4526888/article/details/27698707

转载于:https://www.cnblogs.com/orangeJuice/p/5826828.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值