异常向量表:
异常:因为内部或者外部的一些事件,导致处理器停下正在处理的工作,转而去处理这些发生的事件。ARM Architecture Reference Manual p54页。
7种异常的类型:
Reset异常:突然按下重启键。
Undefined Instruction:未定义指令。()
software interrup:软中断()
Prefetch Abort (instruction fetch memory about):预取中止
Data Abort:提取数据失败。
IRQ:中断
FIQ:快速中断 (响应速度更快)
------------------------------------------------------
异常向量:(p54)
当一种异常发生的时候,ARM处理器会跳转到对应该异常的固定地址去执行异常处理程序,这个固定的地址,称之为异常向量。
-------------------------------------------
异常向量表:由七个异常向量及其处理函数跳转关系组成的表
0x0000000:b reset
0x0000004:ldr pc,_undefined_instruction
0x0000008:ldr pc,_software_interrupt
0x000000c:ldr pc,_prefetch_abort
0x0000010:ldr pc,_data_abort
0x0000014:ldr pc,_not_used //使用无用的指令占据这个地址
0x0000018:ldr pc,_irq
0x000001c:ldr pc,_fiq
在start.S中我们是可以看到这张表的。
------------------------------------------------
代码的编写(start.S,makefile,gboot.lds):
start.S
touch start.S
chmod 777 start.S
.text
.global_start
_start:
b reset
ldr pc,_undefined_instruction //
ldr pc,_software_interrupt
ldr pc,_data_abort
ldr pc,_not_used
ldr pc,_irq
ldr pc,_fiq //将_fiq中的值存放到pc中
_undefined_instruction:.word undefined_instruction
_software_interrupt:.word software_interrupt
_data_abort:.word data_abort
_not_used:.word not_used
_irq:.word irq
_fiq:.word fiq //_fiq中存放的地址为fiq

undefined_instruction:
nop
software_interrupt:
nop
data_abort:
nop
not_used:
nop
irq:
nop
fiq:
nop
reset:
nop
-----------------------------------------------------------
gboot.lds
touch gboot.lds
chmod 777 gboot.lds

OUTPUT_ARCH(arm) @输出格式为arm
ENTRY(_start) @表明程序的路口处为:_start
SECTIONS{
. =0x50008000 @定义起始地址
. =ALIGN(4);
.text :
{start.o(.text) @代码段放的第一个文件。
*(.text)
}
. =ALIGN(4);
.data :
{
*(.data) @所有的数据
}
. =ALIGN(4);
bss_start = .;
.bss :
{
*(.bss)
}
bss_end = .;
}
-----------------------------------------------
touch Makefile
chmod 777 Makefile
all : %.o
arm-linux-ld -Tgboot.lds -o gboot.elf $^
arm-linux-objcopy -O binary gboot.elf gboot.bin
%.o : %.s
arm-linux-gcc -g -c $^
%.o : %.s
-----------------------------------------------
设置SVC模式:p 52页,49页M[0:4]设置模式(cpsr)
要让处理器工作在SVC模式就是要将程序状态寄存器cpsr的后五位设置为10011.
思路:先将这五位全部清理(bic指令)
置1的操作:orr(位或)
然后再加上mrs,msr指令。
首先我们应该是在开发板上电以后,然后来设置处理器的工作模式。所以:reset:
bl set_svc
set_svc:
mrs r0,cpsr //将状态寄存器中的值取出到通用寄存器中
bic r0,r0,#0x1f //将该值置0
orr r0,r0,#0xd3(或0x13) //位或操作,设置模式编号
msr cpsr,r0 //将该编号重新放到状态寄存器中。
------------------------------------------------------
关闭看门狗:
watchdog一般是一个硬件模块,其作用就是在系统死机时,帮助系统实现自动重新启动。
看门狗工作原理:watchdog在硬件上实现了计时功能,启动计时后,启动计时后,软件必须在计时结束前(5分钟或更久)重新开始计时,称为喂狗,如果到超时的时候还没有重新开始计时,那么它就认为系统死机了,就自动重新启动系统。
资料s3c6410page:1137图34-1
应为我们的bootloader比较简单,所以不需要看门狗:关闭。
如何关闭看门狗:通过prescaler(PCLK)这个寄存器来关闭。
控制寄存器:WTCON(watch timer control register):0x7E004000
reset:
bl set_svc
bl disable_watchdog
#define pWTCON 0x7E00400 //保存寄存器的地址
diable_watchdog:
ldr r0,=pWTCON //将立即数pWTCON中的内容装载到r0中
mov r1,#0x0 //r1寄存器中装入0x0
str r1,[r0] //将r1中的内容存储到r0中的有效地址
----------------------------------------------------------
关闭中断:
cpsr中N Z C V I F其中I位是控制中断的,F位是控制快速中断的。
分为两步:先将I,F位设置为1.在之前设置svc时已经设置好了
设置中断屏蔽寄存器ps3c2440 389,378
2440的操作:bl disable_interrupt
disable_interrupt:
mvn r1,#0x0
ldr r0,=0x4a000008
str r1,[r0]
6410一般采用的是向量中断的模式,更多的时候采用的是硬件中断。找到interrupt enable这个寄存器。p419页,需要关闭两个寄存器,VIC0INTENCLEAR(中断使能寄存器),VIC1INTRNCLEAR (关闭中断)。
disable_interrupt:
mvn r1,#0x0 //将0x0取反存放到r1中
ldr r0,=0x71200014 //将寄存器地址装载到r0中,相当与r0为该地址的替身。
str r1,[r0] //把r1中的值存放到r0中。
ldr r0,=0x71300014
str r1,[r0]
210则需关闭四个VICxINTENCLEAR.
----------------------------------------------------
关闭mmu和caches
ARM存储体系:处理器内部寄存器(通用,状态寄存器,速度快,数量少),TMC:紧耦合存储器(Cache,主存储器,容量大,速度稍慢),辅助存储器(Flash,SD等!)
cache:是一种容量小,但存取速度非常快的存储器,它保存最近用到的存储器中数据的拷贝。
按功能分:
I-Cache:指令Cache,用于存放指令.
D-Cache:数据Cache,用于存放数据.
mmu:将虚拟地址映射到物理地址。
虚拟地址:可以解决访问内存冲突,让进程使用更大的空间。
虚拟地址原理:用户指定了一个虚拟地址(4G),然后会通过映射将这些地址映射到不同的物理地址中。
因为使用mmu和cache需要一个正确的配置才能正常的使用。所以在这里我们先不使用,否则会导致意向不到的后果。
cache和mmu都是通过协处理器来控制的co-processor.
2440arm核手册p35 register control(read/write control register)先利用指令MRC p15,r0,c1,c0,0 把Register 1中的内容度到r0中,然后再修改r0中的值,在利用指令MRC p15,0,r0,c1,c0,0
Register1p36,看到第12位控制ICache,Cache disabled,第2位控制DCache,第0位控制mmu.
p41,还有一些数据我们需要设置,在Register7中是cache无效,invalidate cache。instruction:MCR p15,0,Rd,c7,c7,0
----------------------------------------------------
如何关闭cache//在arm11中操作是相同的。
1.使ICache和DCache失效。
2.关闭I/Dcache,关闭mmu
代码: bl disable_mmu
disable_mmu:
mcr p15,0,R0,c7,c7,0 //使I/Dcache失效。
mrc p15,0,r0,c1,c0,0
bic r0,r0,#0x00000007
mcr p15,0,r0,c1,c0,0
---------------------------------------------
最后再检查一遍:发现执行完每个bl之后没有返回,所以在每个bl所跳转的程序完成之后,需要加上一个mov pc,lr

u-boot核心初始化的更多相关文章

  1. Spring Boot 核心注解与配置文件

    @SpringBootApplication注解 Spring Boot项目有一个入口类 (*Application) 在这个类中有一个main 方法,是运行该项目的切入点.而@SpringBootA ...

  2. 【SpringBoot】15. Spring Boot核心注解

    Spring Boot核心注解 1 @SpringBootApplication 代表是Spring Boot启动的类 2 @SpringBootConfiguration 通过bean对象来获取配置 ...

  3. Spring Boot 核心配置文件 bootstrap & application

    Spring Boot 核心配置文件 bootstrap & application 1.SpringBoot bootstrap配置文件不生效问题 2.bootstrap/ applicat ...

  4. 3个Spring Boot核心注解,你知道几个?

    Spring Boot 核心注解讲解 Spring Boot 最大的特点是无需 XML 配置文件,能自动扫描包路径装载并注入对象,并能做到根据 classpath 下的 jar 包自动配置. 所以 S ...

  5. Spring Boot核心原理

    Spring Boot核心原理 spring-boot-starter-xxx  方便开发和配置 1.没有depoy setup tomcat 2.xml文件里面的没有没有了 @SpringBootA ...

  6. Spring Boot 项目初始化

    Spring Boot 项目创建 File->New->New Project->Spring Initializr 勾选 Web Spring Boot 版本选择稳定版,本文选择 ...

  7. Feign源码解析系列-核心初始化

    开始 初始化Feign客户端当然是整个过程中的核心部分,毕竟初始化完毕就等着调用了,初始化时候准备的什么,流程就走什么. 内容 从上一篇中,我们已经知道,对于扫描到的每一个有@FeignClient, ...

  8. Spring Boot核心配置

    启动类 在包根目录下添加启动类,必须包含main方法,再添加Spring Boot启动方法: SpringApplication.run(SampleController.class, args); ...

  9. Spring Boot之初始化项目

    最简单的从Spring官网下载 :地址 https://start.spring.io/ 下拉选择需要的Spring Boot版本 修改Group和Artifact  直接点击Generate Pro ...

  10. 深入了解Spring Boot 核心注解原理

    SpringBoot目前是如火如荼,所以今天就跟大家来探讨下SpringBoot的核心注解@SpringBootApplication以及run方法,理解下springBoot为什么不需要XML,达到 ...

随机推荐

  1. 本地如何使用phpstudy环境搭建多站点

    http://jingyan.baidu.com/article/e52e36154227ef40c70c5147.html 平时在开发项目的时候, 多个项目同时开发的时候会遇到都得放到根目录才能正常 ...

  2. 006-接收键盘的输入(read)

    read  -ptns   变量名 -p 在等待read输入的时候,显示的提示信息 -t 秒数,read等待用户输入的时间 -n read接收用户输入的字符数,只接收指定字符数,就会执行 -s 隐藏输 ...

  3. python下划线作用初识

    单下划线(例:_textchar) 以单下划线做前缀的名称指定了这个名称是"私有的".在 有些 导入import * 的场景中,下一个使用你代码的人(或者你本人)会明白这个名称仅内 ...

  4. python3 第十三章 - 数据类型之tuple(元组)

    元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号,列表使用方括号. 元组创建很简单,只需要在括号中添加元素,并使用逗号隔开即可: language = ('c', 'c++', 'py ...

  5. 转-How to install an SSH Server in Windows Server 2008

    window也可以通过ssh客户端连接,具体方式参考下面 1 How to install an SSH Server in Windows Server 2008 2 freeSSHd and fr ...

  6. Windows脚本相关

    1 获取IP地址 echo StartChangeIPFile echo 获取主机名 for /f %%i in ('hostname') do (set pcName=%%i) ::ping %pc ...

  7. maven系列--maven目录

    我们在玩maven,首先就是利用maven来管理我们的项目.其实maven并不难,它无非是一种目录结构.所以在本系列开始之前,我们要细致的了解下maven的目录,其实也就是maven的约定. 约定优于 ...

  8. selenium-java web自动化测试工具

    本篇文章由来,这两天整理了下自己经常使用而且很熟练的项目,今天突然想起漏了一个,补上了,但想到还没对应的博客,那就写一个简单的 我经常使用且相对熟练的部分技术如下(不知道算不算各位大神眼中的辣鸡): ...

  9. SQL Server 2005的服务器角色(public)的问题

    SQL Server 默认会有9个服务器角色,而且这些角色是不能删除和新增.修改的.关于这些角色相关介绍和权限,请参考 其中有一个特殊的角色public,任何登录都会属于该角色,它只拥有的权限是VIE ...

  10. apache编译安装参数说明

    apache编译安装参数说明 ./configure //配置源代码树--prefix=/usr/local/apache2 //体系无关文件的顶级安装目录prefix ,也就apache的安装目录. ...