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

bootloader总体操作设计的更多相关文章

  1. bootloader架构设计

    G-boot架构设计 第一阶段程序设计 1.0.核心初始化:     1.设置中断向量表 2.设置处理器为svc模式 3.关闭看门狗 4.关闭所有中断 5.关闭mmu和cache 6.外设基地址初始化 ...

  2. [国嵌笔记][031][Bootloader架构设计]

  3. stm32 Bootloader设计(YModem协议) (转)

    源:stm32 Bootloader设计(YModem协议) 相信很多人都希望,不开盖就可以对固件进行升级吧,就像手机那些.下文中的bootload就来实现这样的功能. 前段时间有项目关于Bootlo ...

  4. 【嵌入式开发】 Bootloader 详解 ( 代码环境 | ARM 启动流程 | uboot 工作流程 | 架构设计)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42462795 转载请著名出处 相关资源下载 :  -- u-boo ...

  5. Bootloader的原理以及实现(转载)

    BootLoader工作原理 BootLoader工作原理 BootLoader指系统启动后,在操作系统内核运行之前运行的一段小程序.通过BootLoader,我们可以初始化硬件设备.建立内存空间的映 ...

  6. 基于IAP和Keil MDK的远程升级设计

    写在前面:三个周之前,我突然想写一个远程升级的程序.那个时候我只是大概知道IAP的意思是在应用编程,但怎么编,我还一无所知.我给自己定下一个个阶段目标,从最基础的代码一点点写起,解决一个又一个的问题. ...

  7. 自己用C语言写RL78 serial bootloader

    了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). 之前用C实现过多款PI ...

  8. bootloader 详细介绍

    Bootloader 对于计算机系统来说,从开机上电到操作系统启动需要一个引导过程.嵌入式Linux系统同样离不开引导程序,这个引导程序就叫作Bootloader. 6.1.1  Bootloader ...

  9. 痞子衡嵌入式:飞思卡尔Kinetis系列MCU启动那些事(1)- KBOOT架构

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔Kinetis系列MCU的KBOOT架构. Bootloader是嵌入式MCU开发里很常见的一种专用的应用程序,在一个没有Boo ...

随机推荐

  1. ubuntu 下 apt /apt-get command not found 命令找不到

    简介:apt 命令在ubuntu下找不到.(针对云平台,等可联网的ubuntu  如果是虚拟机,请确认能否联网 (如是虚拟机且不能联网请参考其他文章,大致方向是先挂载系统镜像再安装)) (ps:一般的 ...

  2. Javascript Array 非常用方法解析

    在ECMAScript5的Array中已经有了Array.prototype.forEach,Array.prototype.filter,Array.prototype.map等方法 1. map ...

  3. Rootkit 核心技术——利用 nt!_MDL(内存描述符链表)突破 SSDT(系统服务描述符表)的只读访问限制 Part I

    -------------------------------------------------------- 在 rootkit 与恶意软件开发中有一项基本需求,那就是 hook Windows ...

  4. 深入理解:Linear Regression及其正则方法

    这是最近看到的一个平时一直忽略但深入研究后发现这里面的门道还是很多,Linear Regression及其正则方法(主要是Lasso,Ridge, Elastic Net)这一套理论的建立花了很长一段 ...

  5. 【编程技巧】NSDate,NSDateFormatter,NSTimeInterval

    //获取日期 todaysDate=[NSDate date]; //显示日期和时间 dateFormat = [[NSDateFormatter alloc] init];//NSDate没有自己的 ...

  6. github not authorized eclipse

    eclipse/myeclipse > menu window > preferences > general > security > content >git ...

  7. 洛谷 P1231 教辅的组成

    P1231 教辅的组成 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习 ...

  8. selenium+python自动化测试系列(一):登录

        最近接手商城的项目,针对后台测试,功能比较简单,但是流程比较繁多,涉及到前后台的交叉测试.在对整个项目进行第一轮测试完成之后,考虑以后回归测试任务比较重,为了减轻回归测试的工作量,所以考虑后台 ...

  9. 关于ls命令的实例

    生活映射程序---------科技创造生活 ls 是Linux的常用命令之一直接使用 ls 命令的话只会列出对应的文件名ls -l 命令会显示文件和目录,包括文件类型,大小,修改日期和时间,权限信息等 ...

  10. Css的优先级机制

    样式的优先级 多重样式(Multiple Style):如果外部样式.内部样式.内联样式同时应用于同一个元素,就是使用多重样式的情况. 一般情况优先级如下: (外部样式)External style ...