[ARM&Linux]Linux下中断处理的上下文保存与切换的一些细节

本文深入探讨了在ARM架构的Linux系统中,中断处理过程中的上下文保存与切换机制。详细阐述了中断发生时,如何保存当前任务状态,切换到中断处理程序,并在完成后恢复先前的任务上下文,确保程序的正确执行。
摘要由CSDN通过智能技术生成

们这里讨论ARM体系下的Linux中断处理的上下文切换部分的细节。我们只讨论底层汇编处理细节,不考虑上层。

首先,Linux的中断处理程序是经过搬移的,向量表和处理程序距离很近,这是在系统初始化的时候
就完成的。这个地方我们不做深入讨论。

Linux的向量表通过MMU安排在0xffff0000的位置,向量表如下:


	.globl	__vectors_start
__vectors_start:
	swi	SYS_ERROR0
	b	vector_und + stubs_offset
	ldr	pc, .LCvswi + stubs_offset
	b	vector_pabt + stubs_offset
	b	vector_dabt + stubs_offset
	b	vector_addrexcptn + stubs_offset
	b	vector_irq + stubs_offset
	b	vector_fiq + stubs_offset



其中stubs_offset定义为__vectors_start + 0x200 - __stubs_start。
这个__vectors_start就是刚才的这个向量表,而__stubs_start为中断处理程序的开始地址。
向量表在trap_init函数中建立,该函数在start_kernel中较后的位置被建立。

  ----------------------       ---  __kuser_helper_end
 /                      \
 |                      |
 |                      |      ---   __kuser_helper_start -
 |                      |                                 |
 ------------------------      ---   __stubs_end   0xe00
 | |                                 |
 |          |      ---   __stubs_start  -
 | |                                 ^
 | |                                 |
 ------------------------      ---   __vectos_end 0x200
 | |                                 |
 | |                vector 32字节  |
 | |                                 |
 \ /                                 |
  ----------------------       ---  __vectors_start -
 
 整个__stubs的代码如下:

 
.globl	__stubs_start
__stubs_start:

/* 这些都是宏,IRQ_MODE等所有宏都在ptrace.h当中 */
	vector_stub	irq, IRQ_MODE, 4

	.long	__irq_usr			@  0  (USR_26 / USR_32)
	.long	__irq_invalid			@  1  (FIQ_26 / FIQ_32)
	.long	__irq_invalid			@  2  (IRQ_26 / IRQ_32)
	.long	__irq_svc			@  3  (SVC_26 / SVC_32)
	.long	__irq_invalid			@  4
	.long	__irq_invalid			@  5
	.long	__irq_invalid			@  6
	.long	__irq_invalid			@  7
	.long	__irq_invalid			@  8
	.long	
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值