zoukankan      html  css  js  c++  java
  • 第14课_第005节_swi异常模式程序示例(软件中断)

    swi异常模式 程序示例
    swi:software interrupt (软件中断)

    为什么引入软件中断呢?
      ARM的CPU一共有7中模式,除了用户模式外,其他的都是特权模式,这些特权模式可以通过修改CPSR寄存器进入其他模式。用户模式不能修改CPSR寄存器,进入其他模式。在Linux系统里,应用程序一般运行于用户模式。
    APP运行于usr Mode。它是一种受限的模式。比如说,不可访问硬件。若APP想要访问硬件怎么办?APP想访问硬件,必须切换模式。

    怎样切换模式?
      1. 发生异常。
        1.1 中断,
        1.2 und未定义指令异常,
        1.3 swi #val 。通过val值分辨为什么执行swi。这里使用软中断。随时可以使用软中断切换模式。


    在und程序基础上更改程序,新程序015_swi_exception_014_005.

      在start.S中把要做的事情列出来:

        1. 复位之后,cpu处于svc模式(管理模式),现在切换到usr模式

          手册,usr模式下M4~M0是1000

          mrs r0,cpsr /* 读出cpsr */

          bic r0,r0,#0xf  /* 修改M4~M0为ob10000,进入usr模式 。所有模式的第4bit都为1,值需要最后4bit清零*/

          msr cpsr,r0 /* 将数据写入cpsr */

        2. 设置sp_usr。设置usr模式下的栈

          ldr sp,0x34000000

        3. 引入一条 swi命令,如 swi 0x123 。执行此命令,触发swi异常,进入0x8的位置执行。(swi异常的向量地址是0x8)。

        4.在0x8位置放入一条跳转指令,ldr pc , swi_addr 。

        5.添加swi异常,执行的代码。仿照und异常来做。

          swi_addr :

            .word do_swi

        6. do_swi

          do_swi

        7. 加入 .align 4 /* 表明其后的标号要放在4字节对齐的位置,防止程序不能运行。 */

      002程序:在中断程序中读出val值。

        1. 修改start.S

          

    应用程序根据 swi 带入的不同的值,来分辨是调用内核中哪一个系统调用。

  • 相关阅读:
    线上答题竞赛小程序
    成语答题小程序源码
    lua --- 局部变量
    lua --- 逻辑运算符小结
    Lua --- 输入一个数字,输出阶乘
    lua闭包实现迭代器遍历数组
    lua中的闭包概念的学习笔记
    Unity --- 纹理为什么要设置为2的N次方
    Unity --- 如何降低UI的填充率
    RPG游戏中如何判断敌人是否在玩家的攻击范围之内
  • 原文地址:https://www.cnblogs.com/doitjust/p/11145971.html
Copyright © 2011-2022 走看看