u-boot核心初始化
异常向量表:
异常:因为内部或者外部的一些事件,导致处理器停下正在处理的工作,转而去处理这些发生的事件。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核心初始化的更多相关文章
- Spring Boot 核心注解与配置文件
@SpringBootApplication注解 Spring Boot项目有一个入口类 (*Application) 在这个类中有一个main 方法,是运行该项目的切入点.而@SpringBootA ...
- 【SpringBoot】15. Spring Boot核心注解
Spring Boot核心注解 1 @SpringBootApplication 代表是Spring Boot启动的类 2 @SpringBootConfiguration 通过bean对象来获取配置 ...
- Spring Boot 核心配置文件 bootstrap & application
Spring Boot 核心配置文件 bootstrap & application 1.SpringBoot bootstrap配置文件不生效问题 2.bootstrap/ applicat ...
- 3个Spring Boot核心注解,你知道几个?
Spring Boot 核心注解讲解 Spring Boot 最大的特点是无需 XML 配置文件,能自动扫描包路径装载并注入对象,并能做到根据 classpath 下的 jar 包自动配置. 所以 S ...
- Spring Boot核心原理
Spring Boot核心原理 spring-boot-starter-xxx 方便开发和配置 1.没有depoy setup tomcat 2.xml文件里面的没有没有了 @SpringBootA ...
- Spring Boot 项目初始化
Spring Boot 项目创建 File->New->New Project->Spring Initializr 勾选 Web Spring Boot 版本选择稳定版,本文选择 ...
- Feign源码解析系列-核心初始化
开始 初始化Feign客户端当然是整个过程中的核心部分,毕竟初始化完毕就等着调用了,初始化时候准备的什么,流程就走什么. 内容 从上一篇中,我们已经知道,对于扫描到的每一个有@FeignClient, ...
- Spring Boot核心配置
启动类 在包根目录下添加启动类,必须包含main方法,再添加Spring Boot启动方法: SpringApplication.run(SampleController.class, args); ...
- Spring Boot之初始化项目
最简单的从Spring官网下载 :地址 https://start.spring.io/ 下拉选择需要的Spring Boot版本 修改Group和Artifact 直接点击Generate Pro ...
- 深入了解Spring Boot 核心注解原理
SpringBoot目前是如火如荼,所以今天就跟大家来探讨下SpringBoot的核心注解@SpringBootApplication以及run方法,理解下springBoot为什么不需要XML,达到 ...
随机推荐
- Linq 实例
1.分页 ).Take(); 2.分组 1)一般分组 //根据顾客的国家分组,查询顾客数大于5的国家名和顾客数var 一般分组 = from c in ctx.Customers group c by ...
- RequireJS(一)
RequireJS: RequireJS中文网:http://www.requirejs.cn/ 解决HTML引入大量js文件导致的问题: 首先是加载的时候,浏览器会停止网页渲染,加载文件越多,网页失 ...
- sass和compass实战 读书笔记(一)
sass优势: 不做重复的工作 一 消除样式表冗余(通过变量赋值的方式) 1. 通过变量来复用属性值 2. 使用嵌套来快速写出多层级的选择器 3. 通过混合器来复用一段样式 4. 使用选择器继承来避 ...
- Python---socket库
为方便以后查询和学习,特从常用库函数和示例来总结socket库 1. 术语 family:AF_INET socktype:SOCK_STREAM或SOCK_DGRAM protocol:IPPROT ...
- Python--socketserve源码分析(一)
class ThreadingTCPServer(ThreadingMixIn, TCPServer): pass 实现原理: s =socketserver.ThreadingTCPServer(参 ...
- Css的优先级机制
样式的优先级 多重样式(Multiple Style):如果外部样式.内部样式.内联样式同时应用于同一个元素,就是使用多重样式的情况. 一般情况优先级如下: (外部样式)External style ...
- Request和Response
1 简介 web服务器收到客户端的http请求,会针对每一个请求,分别创建一个用于代表请求的request对象和代表响应的response对象. request和response对象既然代表请求和响应 ...
- PHP判断变量是否为空的几种方法小结
1. isset功能:判断变量是否被初始化 说明:它并不会判断变量是否为空,并且可以用来判断数组中元素是否被定义过注意:当使用isset来判断数组元素是否被初始化过时,它的效率比array_key_e ...
- Redis的部署
笔者Q:972581034 交流群:605799367 欢迎加群交流 官方网站 redis.io 下载 cd /usr/local/src wget http://download.redis.io/ ...
- Windows--查看使用某端口的进程
场景: 有时候我们希望查找某个端口被那个进程使用,如何操作呢? 比如查找8000端口被按个进程使用? 首先使用netstat -ano |grep 8000查看 13776就是使用的进程ID 然后使用 ...