zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    [Err] 1055
    java -jar 时指定内存大小
    mysql判断是否存在数据库和表,进行删除和创建
    更新element-ui版本
    js 数组操作
    vue router 常用操作
    [algorithm] 汉诺塔问题
    【algorithm】 二分查找算法
    [algorithm] Dijkstra双栈算法表达式求值算法
    【hive】 hive 加载数据
  • 原文地址:https://www.cnblogs.com/FORFISH/p/5188728.html
Copyright © 2011-2022 走看看