linux中断系统那些事之----中断初始化过程

linux中断向量的初始化

中断异常向量表的地址有两种:
异常向量表的加载地址: 就是在向量表加载到内存,但在运行之前的地址
异常向量表的运行地址: 实际运行时的中断向量表地址

中断异常向量表的基地址的确定:
在ARM V4及V4T以后的大部分处理器中,中断向量表的位置可以有两个位置:一个是0x00000000,另一个是0xffff0000。可以通过CP15协处理器c1寄存器中V位(bit[13])控制。V和中断向量表的地址的对应关系如下:

V=0        ~        0x00000000~0x0000001C

V=1        ~        0xffff0000~0xffff001C

linux内核目前都是将0xffff0000设置为中断向量表的开始地址


中断异常向量表的内容(arch/arm/kernel/entry-armv.S)
/*
 * We group all the following data together to optimise
 * for CPUs with separate I & D caches.
 */
	.align	5

.LCvswi:
	.word	vector_swi

	.globl	__stubs_end
__stubs_end:

	.equ	stubs_offset, __vectors_start + 0x200 - __stubs_start
/*
*interruption ventor entry table
*rubbitxiao
*/
	.globl	__vectors_start
__vectors_start:
 ARM(	swi	SYS_ERROR0	)
 THUMB(	svc	#0		)
 THUMB(	nop			)
	W(b)	vector_und + stubs_offset
	W(ldr)	pc, .LCvswi + stubs_offset
	W(b)	vector_pabt + stubs_offset
	W(b)	vector_dabt + stubs_offset
	W(b)	vector_addrexcptn + stubs_offset
	W(b)	vector_irq + stubs_offset
	W(b)	vector_fiq + stubs_offset

	.globl	__vectors_end
__vectors_end:
以上向量表的反汇编代码如下:

000002c4 <__stubs_end>:
 2c4:   ef9f0000        svc     0x009f0000
 2c8:   ea0000dd        b       644 <__switch_to+0x19c>
 2cc:   e59ff410        ldr     pc, [pc, #1040] ; 6e4 <__switch_to+0x23c>
 2d0:   ea0000bb        b       5c4 <__switch_to+0x11c>
 2d4:   ea00009a        b       544 <__switch_to+0x9c>
 2d8:   ea0000fa        b       6c8 <__switch_to+0x220>
 2dc:   ea000078        b       4c4 <__switch_to+0x1c>
 2e0:   ea0000f7        b       6c4 <__switch_to+0x21c>
由以上可知中断向量表是一个跳转表,对应8个中断向量,每个异常向量都有固定的pc地址相对应,并且都对应个特定的处理器模式,而每种处理器模式又有各自特有的备份寄存器。他们的对应关系如下:

偏移量
中断类型
处理器的模式
0x00
复位
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux中断初始化是在内核初始化过程中完成的。具体来说,中断初始化包括三个方面:中断系统初始化中断异常处理和中断API的初始化。首先,在中断系统初始化过程中,内核会对中断处理机制进行初始化,包括中断描述符表的初始化中断请求队列的初始化等。其次,中断异常处理是实际处理中断异常过程。最后,中断API提供一组函数给设备驱动程序使用,包括注册与释放、激活与禁止等操作。在中断描述符表的初始化中,有两个阶段。第一阶段发生在内核引导过程中,主要完成为中断描述符表分配空间和初始化默认值,同时将IDT的起始位置存储到IDTR寄存器。第二阶段发生在内核初始化过程中,使用trap_init和init_IRQ函数进行初始化。trap_init函数完成对系统保留中断向量初始化,而init_IRQ函数完成其余中断向量初始化。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Linux中断机制:硬件处理,初始化中断处理](https://blog.csdn.net/wads23456/article/details/106105492)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [linux中断系列之中断系统初始化(三)](https://blog.csdn.net/zhao2272062978/article/details/70272066)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值