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

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

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

str r3, [sp, #-4]! ----保存r0,注意有一个!,sp会加上4,这时候sp就指向栈顶的r0位置了

mov r3, lr ----保存svc mode的lr到r3

stmia r7, {r2 - r6} ---------压栈,在栈上形成形成struct pt_regs

.endm

至此,在内核栈上保存了完整的硬件上下文。实际上不但完整,而且还有些冗余,因为其中有一个orig_r0的成员。c/s结构由三个所谓original r0就是发生中断那一刻的r0值,按理说,ARM_r0和ARM_ORIG_r0都应该是用户空间的那个r0。 为何要保存两个r0值呢?为何中断将-1保存到了ARM_ORIG_r0位置呢?理解这个问题需要跳脱中断处理这个主题,我们来看ARM的系统调用。对于系统调用,它 和中断处理虽然都是cpu异常处理范畴,但是一个明显的不同是系统调用需要传递参数,返回结果。如果进行这样的参数传递呢?对于ARM,当然是寄存器了, 特别是返回结果,保存在了r0中。对于ARM,r0~r7是各种cpu mode都相同的,用于传递参数还是很方便的。因此,进入系统调用的时候,在内核栈上保存了发生系统调用现场的所有寄存器,一方面保存了hardware context,另外一方面,也就是获取了系统调用的参数。返回的时候,将返回值放到r0就OK了。

根据上面的描述,r0有两个作用,传递参数,返回结果。当把系统调用的结果放到r0的时候,通过r0传递的参数值就被覆盖了。本来,这也没有什么,但是有些场合是需要需要这两个值的:

1、ptrace (和debugger相关,这里就不再详细描述了)

2、system call restart (和signal相关,这里就不再详细描述了)

正因为如此,硬件上下文的寄存器中r0有两份,ARM_r0是传递的参数,并复制一份到ARM_ORIG_r0,当系统调用返回的时候,ARM_r0是系统调用的返回值。

OK,我们再回到中断这个主题,其实在中断处理过程中,没有使用ARM_ORIG_r0这个值,但是,为了防止system call restart,可以赋值为非系统调用号的值(例如-1)。

五、中断退出过程

无论是在内核态(包括系统调用和中断上下文)还是用户态,发生了中断后都会调用irq_handler进行处理,这里会调用对应的irq number的handler,处理softirq、tasklet、workqueue等(这些内容另开一个文档描述),但无论如何,最终都是要返回发生中断的现场。

1、中断发生在user mode下的退出过程,代码如下:

ENTRY(ret_to_user_from_irq)

ldr r1, [tsk, #TI_FLAGS]

tst r1, #_TIF_WORK_MASK---------------A

bne work_pending

no_work_pending:

asm_trace_hardirqs_on ------和irq flag trace相关,暂且略过

/* perform architecture specific actions before user return */

arch_ret_to_user r1, lr----有些硬件平台需要在中断返回用户空间做一些特别处理

ct_user_enter save = 0 ----和trace context相关,暂且略过

restore_user_regs fast = 0, offset = 0------------B


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

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

    • 蔡瑁
      蔡瑁

      #易烊千玺#要多带大名易烊千玺早安

    • 于頔
      于頔

      指同盟国)

    • 房亚州
      房亚州

      说出些猪狗不如的屁话

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