嵌入式学习-uboot-lesson4.2-设置SVC模式
来源:互联网 发布:linux 创建swap分区 编辑:程序博客网 时间:2024/05/18 21:11
CPU是工作在SVC模式, 至于为什么是工作在SVC模式
在uboot start.s 详细分析
中有提到过,
对于为何此处是svc模式,而不是其他某种格式,其原因,可以从两方面来看:
1. 我们先简单的来分析一下那7种模式:
a. 中止abt和未定义und模式
首先可以排除的是,中止abt和未定义und模式,那都是不太正常的模式,此处程序是正常运行的,所以不应该设置CPU为其中任何一种模式,所以可以排除。
b. 快中断fiq和中断irq模式
其次,对于快中断fiq和中断irq来说,此处uboot初始化的时候,也还没啥中断要处理和能够处理,而且即使是注册了终端服务程序后,能够处理中断,那么这两种模式,也是自动切换过去的,所以,此处也不应该设置为其中任何一种模式。
c. 用户usr模式
虽然从理论上来说,可以设置CPU为用户usr模式,但是由于此模式无法直接访问很多的硬件资源,而uboot初始化,就必须要去访问这类资源,所以此处可以排除,不能设置为用户usr模式。
d. 系统sys模式 vs 管理svc模式
首先,sys模式和usr模式相比,所用的寄存器组,都是一样的,但是增加了一些访问一些在usr模式下不能访问的资源。
而svc模式本身就属于特权模式,本身就可以访问那些受控资源,而且,比sys模式还多了些自己模式下的影子寄存器,所以,相对sys模式来说,可以访问资源的能力相同,但是拥有更多的硬件资源。
所以,从理论上来说,虽然可以设置为sys和svc模式的任一种,但是从uboot方面考虑,其要做的事情是初始化系统相关硬件资源,需要获取尽量多的权限,以方便操作硬件,初始化硬件。
从uboot的目的是初始化硬件的角度来说,设置为svc模式,更有利于其工作。
因此,此处将CPU设置为SVC模式。
2. uboot作为一个bootloader来说,最终目的是为了启动Linux的kernel,在做好准备工作(即初始化硬件,准备好kernel和rootfs等)跳转到kernel之前,本身就要满足一些条件,其中一个条件,就是要求CPU处于SVC模式的。所以,uboot在最初的初始化阶段,就将CPU设置为SVC模式,也是最合适的。
在ARM Architecture Reference Manual.pdf 中,可以得知是通过设置CPSR程序状态寄存器使其工作在SVC模式,
在下图中
要使其工作在SVC模式,则需要将M[4:0]设置为0b10011
mrs r0, cpsr @将值取出cpsr寄存器 bic r0, r0, #0x1f @将后5位 即M[4:0]清零 orr r0, r0, #0xd3 @0b10011 转化为16进制为0x13 同时为了屏蔽irq和fiq,可以将其设置为0b11010011即0xd3 msr cpsr, r0 @将值送回cpsr寄存器 mov pc, lr
屏蔽irq和fiq,在下面关闭中断一课中有说明。
@****************************@name: start.S@by : stone@time: 2016.6.23@function: 设置svc模式@****************************.text.global _start @将_start声明为全局变量_start: b reset ldr pc, _undefined_instruction ldr pc, _software_interrupt ldr pc, _prefetch_abort ldr pc, _data_abort ldr pc, _not_used ldr pc, _irq ldr pc, _fiq_undefined_instruction: .word undefined_instruction_software_interrupt: .word software_interrupt_prefetch_abort: .word prefetch_abort_data_abort: .word data_abort_not_used: .word not_used_irq: .word irq_fiq: .word fiq undefined_instruction: @处理未定义指令异常 nopsoftware_interrupt: @软中断 nopprefetch_abort: @预取指令异常 nopdata_abort: @数据访问异常 nopnot_used: @空位 nopirq: @中断 nopfiq: @快速中断 nopreset: @reset bl set_svcset_svc: mrs r0, cpsr @将值取出cpsr寄存器 bic r0, r0, #0x1f @将后5位 即M[4:0]清零 orr r0, r0, #0xd3 @0b10011 转化为16进制为0x13 同时为了屏蔽irq和fiq,可以将其设置为0b11010011即0xd3 msr cpsr, r0 @将值送回cpsr寄存器 mov pc, lr
菜鸟一枚,如有错误,多多指教。。。
- 嵌入式学习-uboot-lesson4.2-设置SVC模式
- 嵌入式学习-uboot-lesson4.1-异常向量表
- 嵌入式学习-uboot-lesson4.3-关闭看门狗和中断
- 嵌入式学习-uboot-lesson4.4-关闭MMU和cache
- 嵌入式学习-uboot-lesson4.5-外设基地址初始化
- uboot初始化中为什么要设置CPU为SVC模式
- uboot中为什么设置CPU为SVC模式????????
- 设置系统工作在SVC模式---嵌入式回归第七篇
- uboot初始化中,为何要设置CPU为SVC模式而不是设置为其他模式
- uboot初始化中,为何要设置CPU为SVC模式而不是设置为其他模式
- uboot初始化中,为何要设置CPU为SVC模式而不是设置为其他模式
- uboot初始化中,为何要设置CPU为SVC模式而不是设置为其他模式
- uboot初始化中,为何要设置CPU为SVC模式而不是设置为其他模式
- uboot初始化中,为何要设置CPU为SVC模式而不是设置为其他模式
- uboot初始化中,为何要设置CPU为SVC模式而不是设置为其他模式
- 设置SVC模式
- 设置SVC模式
- 6、异常向量表的学习---设置SVC模式
- Android项目重构之路:实现篇
- AFNetworking 的使用
- 写在博客第一天
- HorizontalListView 的selection方法
- 保存文件打开文件对话框
- 嵌入式学习-uboot-lesson4.2-设置SVC模式
- MYSQL datetime设置默认值
- Android横竖屏切换小结
- android videoview 播放有声音没有画面
- 从零开发一款APP 二、Java Web后端注册接口的实现
- 拦截导弹
- yum 安装zabbix报错
- 设计模式之代理模式
- 深入理解SELinux SEAndroid(3最后部分)