zoukankan      html  css  js  c++  java
  • bootloader总体操作设计

    bootloarder设计蓝图(不想做设计师的程序员不是好程序员):
    bootloarder的作用:将linux内核启动起来
    设计方法:模仿u-boot
    u-boot:支持多种嵌入式cpu的bootloarder程序,自主模式,自动引导内核启动。u-boot还有一种开发模式
    建立U-Boot工程:
    -------------------------------------------------
    source sight的使用:
    先将u-boot在linux中解压,在window下找到u-boot的文件夹并进入-》工具-》映射到网络文件夹-》复制当前地址到浏览z盘-》完成-》project

    project->new project->命名-》ok->project->add and remove file->选择u-boot->输入Z:/->enter->add all->勾选添加子目录-》ok.
    最终我们发现没有.s,.S文件。添加汇编文件:option->document Option->Document Type:C Source File,File filter:添加;*.s;*.S;*.h
    add and remove file->add tree
    --------------------------------------------------------
    ARM处理器启动流程:
    启动方式:
    2440:Nor (2m),以及从nand flash(256M)启动mapping
    在上c2440手册的p221页可以看到内存地址分布中没有nand flash ,
    有bootRAM(stopping stone),nand flash很特殊,不参与地址分配,但确实存在,运行的时候,先将nand flash 中的内容复制到stepping stone中。
    还要关注的一个就是SROM(BANK6,nGCS6)地址为0x30000000,处理器要求此处开始存放。
    s3c6410:可以从nand flash ,nor flash启动,sd卡启动及modem启动。
    地址布局:起始地址为一个镜像区域(不放任何设备,用来映射比如我们从irom启动,它就会把irom映射到镜像区域,其他启动类似)
    上电之后首先运行iROM(软硬件初始化),然后将bootloader中前8k复制到stepping stone中。将剩余的复制到sdram中。
    ----------------------------------------------------------
    u-boot工作流程分析
    程序入口:
    先找到主目录的makefile并打开-》find:smdk2440-》然后再board文件夹中找到samsung文件夹打开-》s3c2440->找到u-boot并打开-》发现ENTRY(入口函数)为_start,入口程序为start.o,在主目录中找到cpu文件夹-》s3c24xx->start.s->find "_start"(这就是程序最初的入口了)。

    start.s代码分析的原则:只关心它做了什么,而不是他怎么做的
    -----------------------------------------------------
    第一阶段分析:
    1.设置中断向量表(Jump vector table as in table 3.1 in [1]
    2.跳转到reset:set the cpu to SVC32 mode,跳过2443,,
    3.flush v4 I/D caches(刷新I/D caches)
    4.disable MMU stuff and caches(关闭mmu和caches)
    跳过config_onenand,然后到了bl lowlevel_init.S(在board->2440中找到这个文件,并分析)
    a.在6410中有个外围设备基地址的初始化()
    a.1:6410点亮led(有助于调试)
    a.2:关闭看门狗。
    a.3:关闭所有中断。
    4.1 init system clock(时钟初始化)
    4.2 for UART(初始化串口)
    4.3 simple init for NAND(对nand简单初始化)
    4.4 判断u-boot是否从nand flash启动,如果不是,需要进行内存初始化(mem_con_init)。
    5.mov pc,lr返回上一级代码处(start.S)。
    6.跳过config_s3c2442,check boot device is nand or nor(判断代码从何处启动)nand copy,nor copy()复制nand flash中的u-boot到内存中。
    7.跳过mmu,config_onenand
    8. Set up the stack(设置堆栈:为c编程做准备)
    9.clear_bss:(清除bss段)
    第一阶段代码结束。
    总结:先将nand flash中的start.S复制到stepping stone,从_start处开始运行。然后将剩余的程序复制到sdrom中,第三步将pc指针跳转到sdrom中运行(也就是第二阶段的bootloard)。
    -------------------------------------------------------
    进入u-boot代码中,对代码进行配置和编译。
    make smdk2440_config
    在vim Makefile 可以找到smdk2440_config这个目标项。
    执行make,反汇编,查看反汇编代码起始地址的变化找到原因。
    ------------------------------------------------------
    ldr r2,start_armboot跳转到第二阶段代码(绝对跳转)。(只分析硬件的初始化)
    1.初始化串口(CONFIG_VFD)
    2.lcd的初始化(CONFIG_LCD)。
    3.初始化网卡
    4.初始化led
    5.main_loop循环(对用户输入的命令进行解析,并执行)
    ----------------------------------------------------------
    Bootloard架构设计:
    第一阶段程序设计:核心初始化:
    1.设置中断向量表
    2.设置处理器的svc模式32
    3.关闭看门狗
    4.关闭所有中断
    5.关闭mmu和caches
    6.外设基地址的初始化
    c语言编程环境的设置:
    1.设置堆栈
    2.清除bss段
    led的初始化
    初始化系统的时钟
    运行内存初始化
    复制bootloader从nand or nor flash到内存:
    1.简单初始化nand flash
    2.复制代码到内存
    3.跳转到第二阶段入口处
    第二阶段:
    1.mmu初始化
    2.中断初始化
    2.1中断初始化
    2.3按键初始化
    3.初始化串口
    3.1串口初始化
    3.2移植printf函数
    4.网卡的初始化
    5.LCD的初始化
    5.1触摸板的初始化
    5.2LCD的初始化
    6.解析执行命令(移植tftp,bootm这个命令)
    --------------------------------------------------------
    可以使用的简化的bootloader的软件设计成型。

     

  • 相关阅读:
    Linux常用命令-centos
    USACO 2006 Open, Problem. The Country Fair 动态规划
    USACO 2007 March Contest, Silver Problem 1. Cow Traffic
    USACO 2007 December Contest, Silver Problem 2. Building Roads Kruskal最小生成树算法
    USACO 2015 February Contest, Silver Problem 3. Superbull Prim最小生成树算法
    LG-P2804 神秘数字/LG-P1196 火柴排队 归并排序, 逆序对
    数据结构 并查集
    浴谷国庆集训 对拍
    1999 NOIP 回文数
    2010 NOIP 普及组 第3题 导弹拦截
  • 原文地址:https://www.cnblogs.com/defen/p/4755761.html
Copyright © 2011-2022 走看看