21.核心初始化之svc模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了21.核心初始化之svc模式相关的知识,希望对你有一定的参考价值。

21.核心初始化之svc模式

要设置系统工作svc特权模式,从前面的学习知道这需要设置CPSR程序状态寄存器。

在ARM Architecture Reference Manual.pdf文档中,2.Programmers‘ Model的2.5.Program status register。

技术分享

可以看到CPSR的最后五位:M[4:0],就是来设置系统工作的系统模式。

技术分享

接下来就是把CPSR的最后五位设置为0b10011,就是完成了设置系统的SVC模式。

实现的思路是:

  1. 取得这五位
  2. 清零,使用bic位清零指令。
  3. 置第0,1,4位为1,即可,使用orr位或指令。

要取得CPSR的后五位,由于是操作CPSR/SPSR,不能像操作一般的寄存器一样,直接操作,需要将CPSR/SPSR寄存器的值取出再进行相应的操作。取出的指令:mrs。最后是存入:msr。这样就完成了修改操作。

?

修改的代码:

技术分享

上面的操作就能够实现把cpsr的末尾5位设置为0b10011。完成了设置系统工作在SVC模式。

我们做这些操作的时候,一般都是参考uboot里的设置来操作的。看看uboot里是怎么设置的:

技术分享

可以看到OK6410的uboot里是设置为0xd3的,0xd3的二进制:

技术分享

看到uboot里,还把[6][7]位设置为了1,看看这两位的功能,是设置中断的,uboot把中断和快中断都关闭了。

技术分享

由于uboot是老大,所以,这里也改为了0xd3,2440,6410,210都是一样的操作。最后start.S的代码是:

?

.text

.global????_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:

????????nop

software_interrupt:

????????nop

prefetch_abort:

????????nop

data_abort:

????????nop

not_used:

????????nop

irq:

????????nop

fiq:

????????nop

reset:

????????bl set_svc

set_svc:

????????mrs r1,cpsr

????????bic r1,#0x1f @clear r1的后五位,

???????????????????????? @即是清除cpsr的后五位

????????orr r1,r1,#0xd3 @0b10011=0x13

????????msr cpsr,r1

?

以上是关于21.核心初始化之svc模式的主要内容,如果未能解决你的问题,请参考以下文章

调试工具集之交叉编译工具链

交叉编译工具链

交叉编译工具链(详解)

LINUX交叉编译工具链和GCC是啥关系啊

arm交叉编译工具链下载

QtCreator配置交叉编译工具链