linux内核中断向量表,LINUX-内核-中断分析-中断向量表(3)-arm

linux内核中断向量表,LINUX-内核-中断分析-中断向量表(3)-armarm中断概念在《ARM体系结构与编程》第9章中说到,ARM中有个概念叫做“异常中断”,也就是包括外部中断在内的各种异常。显然,ARM体系的“异常中断”概念更加接近MIPS体系中的“异常”概念。既然更类似MIPS体系,那么自然的ARM体系就存在“异常中断入口”和“异常中断向量表”的概念。arm的异常中断向量表非向量化中断ARM体系定义了7种异常中断,在《ARM体系结构与编程》第9章的表9.1…

大家好,欢迎来到IT知识分享网。

arm中断概念

在《ARM体系结构与编程》第9章中说到,ARM 中有个概念叫做“异常中断”,也就是包括外部中断在内的各种异常。显然,ARM体系的“异常中断”概念更加接近MIPS体系中的“异常”概念。

94cbd64a08f089b92f8ffb949b6a774a.png

既然更类似MIPS体系,那么自然的ARM体系就存在“异常中断入口”和“异常中断向量表”的概念。

arm的异常中断向量表

非向量化中断

ARM体系定义了7种异常中断,在《ARM体系结构与编程》第9章的表9.1中标明了这7种异常中断。其中第6中异常中断即是外部中断的统一入口。显然,在ARM中,也类似MIPS一样实行了非向量化的外部中断。应该说RISC类的架构几乎都是采用非向量化中断。

向量化异常中断

虽然外部中断没有被向量化,但是异常中断被向量化了。因此,ARM也有一个所谓异常中断向量表。

f43edf78f22d642caa7aaae226067bb9.png

摘自《ARM体系结构与编程》表9-1,如表 4 1所示,ARM的这个异常中断向量表可以是高端向量表,也可以是低端向量表,两者取其一。区别是基地址不同。高端向量是ARM架构可选配置,可以通过硬件外部输入管脚来配置是低端向量还是高端向量,不能通过指令来改变向量的位置,但如果ARM芯片内部有标准ARM协处理器,那么协处理器CP15的寄存器C1的bit13可以用来切换低端和高端向量地址,等于0时为低端向量,等于1时为高端向量。

异常中断向量表的初始化

arm体系在函数early_trap_init()中初始化这个异常中断向量表,相比x86以设置门的方式赋值idt_table,MIPS直接给全局变量exception_handlers[]成员赋值的方式。arm的方式比较另类。其方式是将从__vectors_start开始,直到__vectors_end之间的一段代码给复制到vectors_base地址上,这个vectors_base其实就是0x0000000或者0xffff0000。

————————————————arch/arm/kernel/trap.c

void __init early_trap_init(void *vectors_base)

{

/* 异常向量表 exception vectors的基址 */

unsigned long vectors = (unsigned long)vectors_base;

extern char __vectors_start[], __vectors_end[];

vectors_page = vectors_base;

/*

* Copy the vectors, stubs and kuser helpers (in entry-armv.S)

* into the vector page, mapped at 0xffff0000, and ensure these

* are visible to the instruction stream.

*/

memcpy((void *)vectors, __vectors_start,

__vectors_end – __vectors_start);

. . .

}

异常向量表内容是针对ARM的7种异常要采取的不同的处理代码,但是这个异常向量表总size是非常小的,其中每一种异常只有4字节的代码。因此实际上向量表中针对每一种异常的每一个表项都是一句跳转指令或者是使用ldr指令向PC寄存器写入新值。

——————————————arch/arm/kernel/entry-armv.S

.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 /* 软件中断SWI,系统调用 */

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:

初始化大蓝图

下面以海思的Hi3535为例展示arm体系中断初始化的主要流程。

92c1eac7b1453659a528d2ca8b2bf87b.png

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/11742.html

(0)
上一篇 2024-03-20 16:26
下一篇 2024-03-20 21:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信