主公CodingCos
竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生
展开
-
【ARMv8/v9 异常模型入门及渐进 9.1 - FIQ 和 IRQ 打开和关闭】
指令的功能是使能IRQ和FIQ中断,确保处理器能够响应这两种类型的中断请求。在嵌入式或操作系统开发中,运行该指令通常意味着你想要在特定的执行点允许处理器开始响应外部或快速中断,这是一种常见的操作,特别是在初始化或关键操作执行前后需要确保中断系统处于正确状态。通过直接操作特殊寄存器控制中断使能,开发者可以精确控制系统行为,但这也要求高度的谨慎和对平台细节的深入了解。在ARMv8/v9架构中,可以使用下面汇编指令来打开。原创 2024-07-15 22:14:51 · 441 阅读 · 0 评论 -
【ARMv8/v9 异常模型入门及渐进 6.1 -- linux 缺页异常处理流程详细介绍】
但是在ARM32的时候,TTBR1寄存器未使用,因为TTBR0和TTBR1寄存器只支持2G,1G,512M等,但是ARM32虚拟地址空间的划分比例为1:3,用户空间是3G,内核空间是1G,所以上述寄存器硬件限制无法满足这种通用配置,所以ARM32未使用TTBR1寄存器。为了避免在用户空间和内核空间切换时,切换页表带来的性能损耗,所以,用户空间和内核空间共用一个页表,即用户空间和内核空间具有相同的页表基地址TTBR0。对于current EL的 data abort,可以根据上图1-1中的内容,当。原创 2022-11-18 17:20:30 · 1484 阅读 · 0 评论 -
【ARMv8/v9 异常模型入门及渐进 10 -- WFI 与 WFE 使用详细介绍 1】
ARMv8架构提供了几个与事件相关的指令,包括等待事件(WFE)、发送事件(SEV)和本地发送事件(SEVL),这些指令有助于减少因处理器元素(PE,Processor Element)反复尝试获取自旋锁(spin-lock)而导致的功耗和总线竞争。ARMv8架构中引入了全局监视器的概念,当处理器元素(PE)的全局监视器从独占访问状态变为开放访问状态时,会自动生成一个事件。因此,当一个PE释放自旋锁时,不再需要在代码中显式包含SEV指令来唤醒等待锁的其他PE,系统会自动生成相应的事件,,而不进入等待状态。原创 2024-05-20 21:57:38 · 1007 阅读 · 0 评论 -
【ARMv8/v9 异常模型入门及渐进 13 -- ARM Linux 系统调用流程分析】
这是因为当进程在用户态运行时,使用的用户栈,当进程陷入到内核态时,内核保存进程在内核态运行的相关信息,但是一旦进程返回到用户态后,内核栈中保存的信息无效,会全部恢复,因此每次进程从用户态陷入内核的时候得到的内核栈都是空的。,这个地址在 MMU 中进行了权限的限制,所以当mmu 检测到用户空间地址后,会禁止其对内核空间进行访问,IO/memory的地址空间都位于内核空间,所以用户空间的进程是无法访问的。被存放在栈的顶部,也就是内核栈中的最低地址,内核栈的使用从栈底开始,一直向下增长,当增长过程触及到。原创 2023-07-24 10:41:01 · 503 阅读 · 0 评论 -
【ARMv8 异常模型入门及渐进 2.1 - 系统寄存器访问方法:op1,CRn,CRm,op2】
ARMv8中,取消了协处理器,之前协处理器实现的功能,全部由系统寄存器来是实现。对于系统寄存器的访问,使用 , 指令来访问。ARM架构的之前版本 (如ARMv7) 使用协处理器来进行系统配置。 但是,AArch64 不支持协处理器。AArch64 中系统寄存器会以 ”“ 的方式名命,寄存器的名称会告诉你可以访问它的最低异常级别。:处理器处于 EL1、EL2、EL3时可以访问。:处理器处于 EL2、EL3 时可以访问。大部分寄存器不支持处于 EL0 时访问,但也有一些例外,如 。例如:TTBR0_EL原创 2023-04-11 21:11:51 · 758 阅读 · 0 评论 -
【ARMv8/v9 异常模型入门及渐进2 - 系统控制寄存器 SCTRL_ELx 介绍】
由于在做DFD 测试过程中需要测试 EL1 状态下的 self-hosted trace 功能,但是这个测试是在UEFI中做的,在开发验证阶段UEFI默认是运行在EL3 下的,所以如果要完成测试就需要从EL3跳转到EL1, 由于在查找EL3 跳转到EL1的汇编代码时,发现ARMv8和ARMv9下两者在 SCTRL_EL3的配置是有差异的,所以就引入了下文对 SCTRL_ELx的介绍。ARMv8。原创 2023-06-19 17:06:08 · 893 阅读 · 0 评论 -
【ARMv8/v9 异常模型入门及渐进 11 - Linux 中断上下文判断 及 in_interrupt 跟踪分析】
的定义位于 preempt.h 文件中/*/*/*/*/*/*irq_count/*/*/*/*/*/*/*/*/*/*!/*/*/*/*/*注释可以看到的含义是:判断当前进程是否处于当前处于NMI(不可屏蔽中断) ,IRQ 中断 ,软中断或者 软中断被屏蔽 的环境中。原创 2022-12-21 10:13:46 · 906 阅读 · 0 评论 -
【ARMv8/v9 异常模型入门及渐进 12 -- ARM Linux 用户栈和系统栈及 CURRENT宏 介绍】
每个进程都对应一个用户栈和内核栈,在当前 linux 实现中,内核栈的大小为 8K,占用两个页表,而 thread_info 被存放在栈的顶部,也就是内核栈中的最低地址,内核栈的使用从栈底开始,一直向下增长,当增长过程触及到 thread_info 的区域时,内核栈就检测到溢出,要获取 thread_info 也非常简单,只需要屏蔽当前内核栈 sp 的低 12 位,就得到了 thread_info 的开始地址,达到快速访问的目的,而上面的宏指令 get_thread_info tsk 正是这么做的。原创 2022-12-13 19:54:59 · 897 阅读 · 0 评论 -
【ARMv8/v9 异常模型入门及渐进 9 - FIQ 和 IRQ 区别】
本文主要介绍ARM fiq 与 irq的硬件及软件方面的区别原创 2022-12-13 11:22:42 · 1601 阅读 · 0 评论 -
【ARMv8/v9 异常模型入门及渐进 8 -- 安全中断介绍】
异常发生后系统将切换到具有更高执行权限的状态,在AArch64是通过来实现的。AArch64 最多支持EL0~EL3四个,EL0 的最低,EL3 的最高。当发生异常的时候,系统的 exception 会迁移(route)到更高的 exception level 或者维持不变,但是绝不会降低。此外,不会有任何的异常会去到 EL0。AArch32,cpu 没有异常等级,而是采用模式,例如,这些不同的 mode 对应 privilege(其他mode)和 no-privilege(User mode)。原创 2022-12-09 23:24:34 · 943 阅读 · 0 评论 -
【ARMv8 异常模型入门及渐进7 - GIC及安全中断介绍】
GIC-v3中,引入了支持2种安全状态(secure state),也就是对于中断,根据secure状态,分为安全中断和非安全中断。当然也可以只支持一种安全状态。这里的2种安全状态和1种安全状态,主要是影响中断分组,所使用IRQ和FIQ管脚的映射,以及gic中的寄存器访问。原创 2022-11-28 17:53:20 · 1576 阅读 · 0 评论 -
【ARMv8/v9 异常模型入门及渐进 7 - ARM64 linux irq_domain 介绍】
在 中,我们使用下面两个ID来标识一个来自外设的中断:IRQ number: CPU需要为每一个外设中断编号,我们称之。这个 是一个虚拟的 ,和硬件无关,仅仅是被 CPU 用来标识一个外设中断。HW interrupt ID: 对于 而言,它收集了多个外设的 并向上传递,因此,interrupt controller 需要对外设中断进行编码。Interrupt controller 用 HW interrupt ID来标识外设的中断。在 interrupt controller 级联的情况下,仅仅用原创 2022-12-08 11:55:00 · 468 阅读 · 0 评论 -
【ARMv8/v9 异常模型入门及渐进5 - ARM64 IRQ 异常处理流程】
从 Linux 的角度来看,相当于是一个外设,因而其对GIC的功能实现是放在"第一级的中断处理完成后,就是遍历 IRQ 线上的链表,依次执行通过前面讲的。不同的控制,那就不得不说下对 ** IRQ 的描述**,IRQ 是由。,那 CPU 收到中断后,软件单凭中断号是分不清这个中断到底是从哪个。),指向系统实际的中断控制器所使用的控制方法的函数指针构成。全局的虚拟中断号的机制,而接下来要介绍的。这里需要判断是不是自己的设备产生的中断,中的一项,然后执行该 irq 号注册的。原创 2022-12-06 22:20:43 · 1255 阅读 · 1 评论 -
【ARMv8/v9 异常模型入门及渐进4 - ARM64 异常概念/异常处理流程/异常向量/汇编代码】
当发生异常时,如果该异常产生了EL的迁移,那么完成迁移操作之后会到迁移到的 EL 中的VBAR寄存器中找到向量表的基地址,然后命中对应的 handler.如果当ELx的异常发生了,然后用上了栈指针寄存器SP_ELx,然后就开始执行处理的指令流,然后正在处理过程中,又发生了一个同级的异常。在AArch64中,EL的迁移只能是从低EL向高EL进行迁移,如果使用AArch64指令集和AArch32指令集时产生了异常并且也发生了EL的迁移时,则使用的是将迁移到的EL对应的。上图中 4 处对应EL1表项的 4 组。原创 2022-11-15 11:44:13 · 2042 阅读 · 0 评论 -
【ARMv8/v9 异常模型入门及渐进 3 - ARM64 Process State介绍】
指令能访问EL1/2特权等级下的内存空间了,不然的话,它们是在EL0的,进入异常后就会置位UAO,相反,它会被置0。通用在ARMv7中使用的是CPSR寄存器来描述处理器的状态,只不过在ARMv8-A中已经取消了CPSR寄存器。异常,可以为这在本质上是一个保护,主要是硬件自动动作过程中置的位(也可以人工置位),其清除是自动的。: 置1后,效用是EL0通过虚拟内存地址能访问的特权数据(原本是EL1/EL2特权数据)。位置位的情况,就是返回时复制到PSTATE的(恢复现场?的各个域,比如可以直接使用。原创 2022-11-14 22:39:38 · 1229 阅读 · 0 评论 -
【ARMv8 异常模型入门及渐进 2 -- ARMv8/v9 寄存器 (SCR_ELn | ELR_ELn | ESR_ELn | CTR | HCR_ELn ... 详细介绍】
ARM8v-A提供了31个通用寄存器,分别是X0-X30。还有SP、PC、XZR等寄存器, 每个寄存器是64bits,可以在任何 Exception Level访问。表1-3因为ARMv8-A为了兼容32位应用程序,所以放ARMv8-A中运行32位应用程序的时候,会时候 W0-W30 寄存器。只使用其中的低32位。下面详细介绍写这些通用寄存器(X0-X7用于参数传递;X9-X15在子函数中使用这些寄存器时,直接使用即可, 无需save/restore. 在汇编代码中x9-x15出现的频率极低,原创 2022-11-14 22:15:38 · 3308 阅读 · 0 评论 -
【ARMv8 异常模型入门及渐进 1 -- 处理器运行模式及EL3/EL2/EL1学习】
在ARM v7架构中的ARM核用PL的方式定义执行等级。在ARMv8中ARM核的执行等级划分如下图所示。表 1-1ARM v8中一个ARM core 运行时可能具有两种状态:分别为两种状态下都有其对应的EL0,EL1。而EL3是独立的,属于secure world,EL2是ARM core的虚拟化模式,目前大部分芯片公司都将该level放在normal world中。linux kernel运行在normal world的EL1, linux的 user space 运行在normal world的。原创 2022-11-14 22:00:54 · 2942 阅读 · 0 评论 -
【ARMv8/v9 异常模型入门及渐进 9.1 – Linux 中断下半部处理方式】
内核线程只在内核空间运行,没有自己的用户空间,它和普通进程一样可以被调度,也可以被抢占。“关中断只是屏蔽了中断,并没有阻止任务切换,高优先级的任务任然可以抢占CPU并访问临界区和共享变量,关了中断,就禁止了抢占,如果当前任务也没有进行主动调度,当然系统中也就不会出现比当前优先级更高的任务进入就绪了,也就谈不上去“抢占CPU并访问临界区和共享变量”了。若是在临界区中进行了主动调度,那么后果就是提问的人说的:“关中断只是屏蔽了中断,并没有阻止任务切换,高优先级的任务任然可以抢占CPU并访问临界区和共享变量”原创 2022-11-10 17:13:43 · 470 阅读 · 0 评论 -
【RThtread 系统异常入门及渐进--2 镜像生成流程】
rtthread 编译之镜像生成原创 2022-11-09 20:17:10 · 37 阅读 · 0 评论