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)

posted on 2018-09-27 12:53  南笺  阅读(2049)  评论(0编辑  收藏  举报

导航