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的软件设计成型。

     

  • 相关阅读:
    提升10倍生产力:IDEA远程一键部署SpringBoot到Docker
    如何写出让同事无法维护的代码?
    Nginx 极简教程(快速入门)
    实战SpringCloud响应式微服务系列教程(第一章)
    单节点nginx为两台apache服务器提供负载均衡
    监控Linux性能的18个命令行工具
    Nginx/LVS/HAProxy负载均衡软件的优缺点详解(转)
    LVS包转发模型和调度算法(转)
    借助LVS+Keepalived通过DR模式实现负载均衡
    CentOS 7.0 安装中文输入法
  • 原文地址:https://www.cnblogs.com/defen/p/4755761.html
Copyright © 2011-2022 走看看