第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 带入的不同的值,来分辨是调用内核中哪一个系统调用。

原文地址:https://www.cnblogs.com/doitjust/p/11145971.html