s3c2440启动方式
  1. 从nand flash 启动
    1.1 上电后将nand flash中的前4KB数据复制到“Stepping Stone”;
    1.2 CPU 执行“Stepping Stone”中的代码;
    //通常的做法是将nand flash中的代码拷贝至sdram;

  2. 从nor flash 启动
    2.1 根据nor flash的总线数据宽度,从第一条指令开始执行;
    //通常的做法:是用这段程序将nor flash中的代码拷贝至sdram;

启动代码核心分析

        GET option.inc ;栈地址等常量定义
GET memcfg.inc ;SDRAM初始化相关
GET 2440addr.inc ;特殊功能寄存器 USERMODE EQU 0x10 ;定义运行模式常量,即CPSR寄存器的模式控制位赋值 UserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 ~ ;定义各模式堆栈地址 ;实现$HandleAddr宏
$HandlerLabel
sub sp,sp,# ; sp = sp -4
stmfd sp!,{r0} ; sp = sp -4, r0寄存器的值入栈
ldr r0,=$HandleAddr ; $HandleAddr是该宏的参数,将该值赋给r0
ldr r0,[r0] ; $HandleAddr相当于是一个函数指针,此时将该指针所指向函数入口地址赋值给r0
str r0,[sp,#] ; ro入栈,即$HandleAddr
ldmfd sp!,{r0,pc} ; 出栈,恢复r0,将$HandleAddr赋值给pc
MEND ;入口地址,定义一个init段
;初始化异常向量表
b ResetHandler; 0x00000000 为ResetHandler 如上例:CPU上电时从0x0000000启动,此时ResetHandler被执行 ;实现arm对中断的处理,IsrIRQ
IsrIRQ
sub sp,sp,# ;reserved for PC
stmfd sp!,{r8-r9} ;保存r8、r9 ldr r9,=INTOFFSET ;中断偏移寄存器,当ENT0时,该值为0,随后32个外部中断源依次递增
ldr r9,[r9]
ldr r8,=HandleEINT0
add r8,r8,r9,lsl # ;r9左移2位、r8 = r8 + r9,
ldr r8,[r8]
str r8,[sp,#]
ldmfd sp!,{r8-r9,pc} ;跳转到中断服务函数 LTORG ;ResetHandler 实现
;1. WTCON 关闭看门狗;
;2. INTMSK\INTSUBMSK 中断屏蔽;
;3. 系统时钟初始化
;4. 存储器初始化
adrl r0, SMRDATA ; SDRAM的13个特殊寄存器设置参数
ldmia r0,{r1-r13}
ldr r0,=BWSCON
stmia r0,{r1-r13} ;堆栈初始化
bl InitStacks
;在InitStacks中,初始化各模式堆栈例如
mrs r0,cpsr
bic r0,r0,#MODEMASK
orr r1,r0,#UNDEFMODE|NOINT
msr cpsr_cxsf,r1 ;UndefMode ,通过修改CPSR,将处理器切换到该模式
ldr sp,=UndefStack ; UndefStack=0x33FF_5C00 ;执行启动
ldr r0, =BWSCON
ldr r0, [r0]
ands r0, r0, # ;OM[1:0] != 0, NOR FLash boot
bne copy_proc_beg ;do not read nand flash
adr r0, ResetEntry ;OM[1:0] == 0, NAND FLash boot
cmp r0, # ;if use Multi-ice,
bne copy_proc_beg ;do not read nand flash for boot
;nop
;===========================================================
nand_boot_beg ;从nand 启动
bl RdNF2SDRAM ;该函数将代码从nand 拷贝到 内存
ldr pc, =copy_proc_beg ;copy_pro_beg实现
;arm的可执行程序的映像文件,分为RO(代码段和只读数据段)、RW(可读/写数据段)和ZI 未初始化数据段
;根据link的设置,从0x00000000处跳转到SDRAM的0x30000000处
copy_proc_beg
adr r0, ResetEntry
ldr r2, BaseOfROM ;RO段的目标地址
cmp r0, r2
ldreq r0, TopOfROM
beq InitRam ;搬移RW
ldr r3, TopOfROM ldmia r0!, {r4-r7} ;利用r4-r7,每次搬移16个字节
stmia r2!, {r4-r7}
cmp r2, r3
bcc %B0 sub r2, r2, r3
sub r0, r0, r2 InitRam
ldr r2, BaseOfBSS
ldr r3, BaseOfZero cmp r2, r3
ldrcc r1, [r0], #
strcc r1, [r2], #
bcc %B0 ;初始化ZI段
mov r0, #
ldr r3, EndOfBSS cmp r2, r3
strcc r0, [r2], #
bcc %B1 ;跳转到c函数
b Main ;

s3c2440笔记1(启动)的更多相关文章

  1. S3C2440的Linux启动过程分析(一)——SC2440处理器结构

    1.1.     S3C2440处理器结构 S3C2440处理器的结构如下图所示,其核心单元为ARM9TDMI处理器核,主要包括16K的指令Cache和16K的数据Cache,以及分开的指令和数据MM ...

  2. Dubbo -- 系统学习 笔记 -- 快速启动

    Dubbo -- 系统学习 笔记 -- 目录 快速启动 服务提供者 服务消费者 快速启动 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubb ...

  3. 【MySQL笔记】启动弹窗问题,unable to connect to remote host. catalog download has failed.

    安装完MySQL之后,它每天凌晨启动一个Intaller任务,甚是烦人:   这是一个Windows的计划服务,在这里删除即可,开始/附件/系统工具/任务计划程序,把mysql的定时任务计划取消/删除 ...

  4. XV6学习笔记(1) : 启动与加载

    XV6学习笔记(1) 1. 启动与加载 首先我们先来分析pc的启动.其实这个都是老生常谈了,但是还是很重要的(也不知道面试官考不考这玩意), 1. 启动的第一件事-bios 首先启动的第一件事就是运行 ...

  5. SQL Server 2012实施与管理实战指南(笔记)——Ch5启动SQL Server服务和数据库

    5.启动SQL Server服务和数据库 在数据库和服务启动过程中,经常会出现的问题: 1.SQL Server实例无法正常启动 2.系统数据库无法正常启动 3.网络配置失败 4.用户数据库无法启动 ...

  6. c#笔记之启动新线程

    可已通过下面方法来启动一个新线程并执行相应的方法 new Thread(new ThreadStart(new Action(() =>                        {     ...

  7. Hive 学习笔记(启动方式,内置服务)

    一.Hive介绍 Hive是基于Hadoop的一个数据仓库,Hive能够将SQL语句转化为MapReduce任务进行运行. Hive架构图分为以下四部分. 1.用户接口 Hive有三个用户接口: 命令 ...

  8. 【学习笔记】启动Nginx、查看nginx进程、查看nginx服务主进程的方式、Nginx服务可接受的信号、nginx帮助命令、Nginx平滑重启、Nginx服务器的升级

     1.启动nginx的方式: cd /usr/local/nginx ls ./nginx -c nginx.conf 2.查看nginx的进程方式: [root@localhost nginx] ...

  9. How tomcat works 读书笔记十七 启动tomcat 下

    在上一节中,我们程序的起始位置还是Bootstrap,现在我们通过bat文件来启动这个类. 在分析catalina.bat之前,我们先看看几个简单的我们能用到的dos命令. 基础知识 1 rem 注释 ...

随机推荐

  1. 结构化查询语言(SQL)数据类型

    简要描述一下结构化查询语言中的五种数据类型:字符型,文本型,数值型,逻辑型和日期型. 字符型 VARCHARVS CHAR VARCHAR型和CHAR型数据的这个差别是细微的,但是非常重要.他们都是用 ...

  2. 用Backbone.js创建一个联系人管理系统(四)

    原文: Build a Contacts Manager Using Backbone.js: Part 4 这一系列教程的第四部分,教我们如何完成对已经存在的Contacts进行编辑和保存. 本教程 ...

  3. 拦截js方法备忘录

    很明显,以下代码拦截了fusion2.dialog.invite,然后在页面执行fusion2.dialog.invite方法的时候修改了参数中的img. <script> var old ...

  4. 给自己立下一个巨大的flag

    [BZOJ1861][BZOJ3224] [BZOJ2733][BZOJ1056] [BZOJ2120][BZOJ3673] [BZOJ1833][BZOJ1026] [BZOJ3209][BZOJ1 ...

  5. C语言题库的上机题

    1.编写函数,实现从键盘上输入一个小写字母,将其转化为大写字母. #include<stdio.h> int zhuanhua(char s); void main(){ char s; ...

  6. nexus2.1.2的配置

    最近在学习maven,逐渐接触到私服的搭建,也就着手学习使用nexus了,在http://www.sonatype.org/nexus/go网站上nexus最新版本的是,不过版本要同jvm的版本匹对, ...

  7. 【记忆化搜索】bzoj1652 [Usaco2006 Feb]Treats for the Cows

    跟某NOIP的<矩阵取数游戏>很像. f(i,j)表示从左边取i个,从右边取j个的答案. f[x][y]=max(dp(x-1,y)+a[x]*(x+y),dp(x,y-1)+a[n-y+ ...

  8. MY SQL 知识

    LINUX配置优化 诊断命令 more perfomance tool SRE performance 硬件优化 raid 10 ssd Fusion-io 大内存 电池后备SCSI磁盘缓存 系统优化 ...

  9. __attribute__((packed))详解

      1. __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法.这个功能是跟操作系统没关系,跟编译器有关 ...

  10. some tips learn from work experience

    1.you can't avoid office politics 2.you'll never have a job which you "can't quit" - if yo ...