b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

c/s结构由三个 ARM中断处理过程(8)

电脑杂谈  发布时间:2018-02-14 03:31:11  来源:网络整理

.align 5

__irq_usr:

usr_entry---------请参考本章第一节(1)保存用户现场的描述

kuser_cmpxchg_check---和本文描述的内容无关,这些不就介绍了

irq_handler----------核心处理内容,请参考本章第二节的描述

get_thread_info tsk------tsk是r9,指向当前的thread info数据结构

mov why, #0--------why是r8

b ret_to_user_from_irq----中断返回,下一章会详细描述

why其实就是r8寄存器,用来传递参数的,表示本次放回用户空间相关的系统调用是哪个?中断处理这个场景和系统调用无关,因此设定为0。

(1)保存发生中断时候的现场。所谓保存现场其实就是把发生中断那一刻的硬件上下文(各个寄存器)保存在了SVC mode的stack上。

.macro usr_entry

sub sp, sp, #S_FRAME_SIZE--------------A

stmib sp, {r1 - r12} -------------------B

ldmia r0, {r3 - r5}--------------------C

add r0, sp, #S_PC-------------------D

mov r6, #-1----orig_r0的值

str r3, [sp] ----保存中断那一刻的r0

stmia r0, {r4 - r6}--------------------E

stmdb r0, {sp, lr}^-------------------F

.endm

A:代码执行到这里的时候,ARM处理已经切换到了SVC mode。一旦进入SVC mode,ARM处理器看到的寄存器已经发生变化,这里的sp已经变成了sp_svc了。因此,后续的压栈操作都是压入了发生中断那一刻的进程的(或者内核线程)内核栈(svc mode栈)。具体保存多少个寄存器值?S_FRAME_SIZE已经给出了答案,这个值是18个寄存器。r0~r15再加上CPSR也只有17个而已。先保留这个疑问,我们稍后回答。

B:压栈首先压入了r1~r12,这里为何不处理r0?因为r0在irq mode切到svc mode的时候被污染了,不过,原始的r0被保存的irq mode的stack上了。r13(sp)和r14(lr)需要保存吗,当然需要,稍后再保存。执行到这里,内核栈的布局如下图所示:

ir1

stmib中的ib表示increment before,因此,在压入R1的时候,stack pointer会先增加4,重要是预留r0的位置。stmib sp, {r1 - r12}指令中的sp没有“!”的修饰符,表示压栈完成后并不会真正更新stack pointer,因此sp保持原来的值。

C:注意,这里r0指向了irq stack,因此,r3是中断时候的r0值,r4是中断现场的PC值,r5是中断现场的CPSR值。

D:把r0赋值为S_PC的值。根据struct pt_regs的定义(这个数据结构反应了内核栈上的保存的寄存器的排列信息),从低地址到高地址依次为:

ARM_r0

ARM_r1

ARM_r2

ARM_r3

ARM_r4

ARM_r5

ARM_r6

ARM_r7

ARM_r8

c/s_b/s结构指_c/s结构由三个

ARM_r9

ARM_r10

ARM_fp

ARM_ip

ARM_sp

ARM_lr

ARM_pc<---------add r0, sp, #S_PC指令使得r0指向了这个位置


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-76601-8.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 真田光一
      真田光一

      看看岛礁建设中还存在什么不足之处

    热点图片
    拼命载入中...