zoukankan      html  css  js  c++  java
  • S5PV210启动过程详解

    1.常用的器件及特性
    • 内存
      • SRAM:静态内存 特点就是容量小、价格高,优点是不需要软件初始化直接上电就能用
      • DRAM:动态内存 特点就是容量大、价格低,缺点就是上电后不能直接使用,需要软件初始化后才可以使用。
      • 单片机中:内存需求量小,而且希望开发尽量简单,适合全部用SRAM
      • 嵌入式系统:内存需求量大,而且没有NorFlash等可启动介质
      • PC机: 内存需求量大,而且软件复杂,不在乎DRAM的初始化开销,适合全部用DRAM
    • 外存
      • NorFlash:特点是容量小,价格高,优点是可以和CPU直接总线式相连,CPU上电后可以直接读取,所以一般用作启动介质。
      • NandFlash(跟硬盘一样):特点是容量大,价格低,缺点是不能总线式访问,也就是说不能上电CPU直接读取,需要CPU先运行一些初始化软件,然后通过时序接口读写。
    2.各类计算机的启动方式
    • PC:很小容量的BIOS(NorFlash)+ 很大容量的硬盘(类似于NandFlash)+ 大容量的DRAM
    • 单片机: 很小容量的NorFlash + 很小容量的SRAM
    • 嵌入式:因为NorFlash很贵,所以现在很多嵌入式系统倾向于不用NorFlash,直接使用外接的大容量Nand + 外接大容量DRAM + SoC内置SRAM
    • S5PV210启动方式:外接的大容量Nand + 外接大容量DRAM + SoC内置SRAM+SoC内置iROM
    3.S5PV210的启动步骤

     

    在这张图中可以看出S5PV210的启动可大致分为五个步骤

    • 1、iROM阶段(BL0)
    • 2、BL1阶段
    • 3、BL2阶段
    • 4、拷贝OS到SDRAM
    • 5、启动OS
      samsung在S5PV210内部的IROM中固化了一段代码,用于初始化时钟,识别用户选择的启动模式,并从相应的地方拷贝boot-loader第一阶段代码到SRAM中运行。此外samsung在S5PV210内部也集成了96KB的内部SRAM,由于SRAM不需要初始化,上电就能使用,因此可当作DRAM初始化之前的代码运行空间。
    4.iROM完成的工作

    • 1、关闭看门狗;
    • 2、初始化icache;
    • 3、初始化栈;
    • 4、初始化堆;
    • 5、初始化块设备拷贝函数;
    • 6、初始化PLL,设置系统时钟;
    • 7、拷贝BL1到内部的SRAM区域;
    • 8、检查BL1的校验和;
    • 9、检查是否是安全启动模式;
    • 10、跳转到BL1的起始代码处。

    5.汇编启动代码
    #define WTCON        0xE2700000
    #define SVC_STACK    0xD0037D80
    
    // 把_start链接属性改为外部,这样其他文件就可以看见_start了
    .global _start                    
    _start:
        // 第1步:关看门狗(向WTCON的bit5写入0即可),不是所有的BL0都关看门狗
        ldr r0, =WTCON
        ldr r1, =0x0
        str r1, [r0]
    
        // 第2步:设置SVC栈 默认使用满减栈
        ldr sp, =SVC_STACK
    
        // 第3步:开/关icache
        mrc p15,0,r0,c1,c0,0;            // 读出cp15的c1到r0中
        //bic r0, r0, #(1<<12)            // bit12 置0  关icache
        orr r0, r0, #(1<<12)            // bit12 置1  开icache
        mcr p15,0,r0,c1,c0,0;
    
        // 第4步:调用入口函数
        bl entry
    6.链接脚本
    • 什么是链接地址
      链接地址是由程序员预知的或希望的程序执行地址,在编译链接的过程中,通过Makefile中-Ttext xxx或者在链接脚本中指定的。
    • 什么是运行地址
      是程序执行,代码所处的实际位置地址。
    • 链接脚本究竟要做什么?
      链接脚本其实是个规则文件,他是程序员用来指挥链接器工作的。
      链接器会参考链接脚本,并且使用其中规定的规则来处理.o文件中那些段,将其链接成一个可执行程序。
      链接脚本的关键内容有2部分:段名 + 地址(作为链接地址的内存地址)
      链接脚本的内容:

      • SECTIONS {} 是整个链接脚本的全部
      • . 点号在链接脚本中代表当前位置。
      • =等号代表赋值,要用分号结尾

    link.lds

    SECTIONS
    {
        . = 0xd0020010;
    
        .text : {
            start.o
            * (.text)
        }
    
        .data : {
            * (.data)
        }
    
        .bss : {
            * (.bss)
        }
    
    }
    7.Makefile
    NAME=led
    BIN=$(NAME).bin
    ELF=$(NAME).elf
    OBJ=start.o led.o
    
    CC=arm-linux-gcc
    LD=arm-linux-ld
    CFLAGS=-march=armv5te -nostdlib
    LDFLAGS=-nostartfiles -nostdlib
    OBJCOPY=arm-linux-objcopy
    
    bin:elf
        $(OBJCOPY) -O binary $(ELF) $(BIN)
        cp $(BIN) ~/shared/image/
    elf:$(OBJ)
        $(LD) -T link.lds $(LDFLAGS) $(OBJ) -o $(ELF)
    %.o:%.c
        $(CC) $(CFLAGS) -c $< -o $@
    clean:
        rm -f $(OBJ) $(ELF) $(BIN)
  • 相关阅读:
    6、函数、谓词、CASE表达式
    25. k个一组翻转链表
    78. 子集
    72. 编辑距离
    12. 整数转罗马数字
    287. 寻找重复数
    27. 移除元素
    91. 解码方法
    283. 移动零
    198. 打家劫舍
  • 原文地址:https://www.cnblogs.com/xiehuan-blog/p/9712470.html
Copyright © 2011-2022 走看看