LINUX-内核-中断分析-中断向量表(3)-arm【转】

简介:

转自:http://blog.csdn.net/haolianglh/article/details/51986987

arm中断概念

在《ARM体系结构与编程》第9章中说到,ARM 中有个概念叫做“异常中断”,也就是包括外部中断在内的各种异常。显然,ARM体系的“异常中断”概念更加接近MIPS体系中的“异常”概念。 
ARM体系结构中断概念 
既然更类似MIPS体系,那么自然的ARM体系就存在“异常中断入口”和“异常中断向量表”的概念。


arm的异常中断向量表

非向量化中断

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

向量化异常中断

虽然外部中断没有被向量化,但是异常中断被向量化了。因此,ARM也有一个所谓异常中断向量表。 
ARM体系异常中断向量表 
摘自《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); . . . }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

异常向量表内容是针对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: 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

初始化大蓝图

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









本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sky-heaven/p/8028978.html,如需转载请自行联系原作者

相关文章
|
5月前
|
安全 网络协议 Linux
深入理解Linux内核模块:加载机制、参数传递与实战开发
本文深入解析了Linux内核模块的加载机制、参数传递方式及实战开发技巧。内容涵盖模块基础概念、加载与卸载流程、生命周期管理、参数配置方法,并通过“Hello World”模块和字符设备驱动实例,带领读者逐步掌握模块开发技能。同时,介绍了调试手段、常见问题排查、开发规范及高级特性,如内核线程、模块间通信与性能优化策略。适合希望深入理解Linux内核机制、提升系统编程能力的技术人员阅读与实践。
477 1
|
5月前
|
Ubuntu Linux
Ubuntu 23.04 用上 Linux 6.2 内核,预计下放到 22.04 LTS 版本
Linux 6.2 带来了多项内容更新,修复了 AMD 锐龙处理器设备在启用 fTPM 后的运行卡顿问题,还增强了文件系统。
|
5月前
|
Ubuntu Linux
Ubuntu 23.10 现在由Linux内核6.3提供支持
如果你想在你的个人电脑上测试一下Ubuntu 23.10的最新开发快照,你可以从官方下载服务器下载最新的每日构建ISO。然而,请记住,这是一个预发布版本,所以不要在生产机器上使用或安装它。
|
5月前
|
监控 Ubuntu Linux
什么Linux,Linux内核及Linux操作系统
上面只是简单的介绍了一下Linux操作系统的几个核心组件,其实Linux的整体架构要复杂的多。单纯从Linux内核的角度,它要管理CPU、内存、网卡、硬盘和输入输出等设备,因此内核本身分为进程调度,内存管理,虚拟文件系统,网络接口等4个核心子系统。
360 0
|
5月前
|
Web App开发 缓存 Rust
|
5月前
|
Ubuntu 安全 Linux
Ubuntu 发行版更新 Linux 内核,修复 17 个安全漏洞
本地攻击者可以利用上述漏洞,攻击 Ubuntu 22.10、Ubuntu 22.04、Ubuntu 20.04 LTS 发行版,导致拒绝服务(系统崩溃)或执行任意代码。
|
存储 Unix Linux
浅入分析Linux
Linux 操作系统必须完成的两个主要目的 与硬件部分交互, 为包含在硬件平台上的所有底层可编程部件提供服务 为运行在计算机系统上的应用程序(即所谓的用户空间)提供执行环境 一些操作系统运行所有的用户程序都直接与硬件部分进行交互, 比如典型的MS-DOS。
1099 0
|
4月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
490 1
二、Linux文本处理与文件操作核心命令
|
4月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
336 137