首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

RISC-V 学习篇之特权架构下的中断异常处理

Trap Value ) 一般情况下,mtval 寄存器的用途如下: 异常原因:对于异常,mtval 寄存器存储导致异常的具体原因或异常代码。...通过读取和写入mie寄存器,可以控制处理器接受和屏蔽不同类型的中断。中断发生时,处理器根据mie寄存器中相应的位来决定是否触发中断处理程序。...通过读取mip寄存器,可以查询处理器当前的中断请求状态,以了解是否有中断待处理。在处理器响应中断时,处理器根据mip寄存器中相应的位来确定中断的来源。...如果 hart 接受了异常并且把它委派给了S 模式,则硬件原子地经历几个类似的状态转换,其中用到了 S 模式而不是 M 模式的 CSR: 发生异常的指令的 PC 被存入 sepc,且 PC 被设置为...若 V = 0,则任何遍历到此页表项的虚址转换操作都会导致页错误。 R、W 和 X 位分别表示此页是否可以读取、写入和执行。

1.4K100
您找到你想要的搜索结果了吗?
是的
没有找到

MIPS架构深入理解6-异常和中断

这种现状导致跟在MIPS浮点指令后的指令必须在确认浮点指令不会产生异常后才能提交自己的状态。...下面是发生异常时,MIPS架构CPU的处理过程: 设置EPC寄存器指向重新开始的地址; 设置SR(EXL)标志位,强迫CPU进入内核态并禁止中断; 设置Cause寄存器,软件可以读取它获知异常原因。...所以,对于TLB未命中异常处理程序(也就是TLB重填异常处理程序)来说,如果读取TLB表(像Linux内核,一般将映射表保存在kseg2段地址空间中)时,发生页表地址读取异常时,程序再次返回到异常程序入口点...但是MIPS32/64架构CPU为中断提供了一个可选的不同的异常入口点,这能节省几个时钟周期。通过Cause寄存器的IV标志位进行使能。...di自动清除SR(IE)标志位,返回SR原始值到一个通用寄存器中。但是,这个功能在此版本上还是一个兼容性功能,所以你需要特别注意你的CPU是否支持这条指令。

2.5K20

嵌入式开发常见问题解决方法

2.5 保存内核寄存器快照 Cortex M内核陷入异常中断时会将几个内核寄存器的值压入栈中,如下图: 我们可以在陷入异常中断时将栈上的内核寄存器值写入RAM的一段复位后保留默认值的区域内,执行复位操作后再从...3.1 程序继续运行 3.1.1 数值异常 3.1.1.1 软件问题 数组越界 写数组时下标超出数组长度,导致对应地址内容被修改。...优化问题 如上图程序,本意是等待irq中断之后不再执行foo()函数,但被编译器优化之后,实际运行过程中flg可能被装入寄存器并且每次都判断寄存器内的值而不重新从ram里读取flg的值,导致即使irq...通信时序错误 例如电源管理芯片Isl78600,假设现在两片级联,当同时读取两片的电压采样数据时,高端芯片以固定周期通过菊花链将数据传送到低端芯片,而低端芯片上只有一个缓存区,如果单片机不在规定时间内将低端芯片上的数据读走那么新的数据到来时将会覆盖当前数据...3.2 程序崩溃 3.2.1 停止运行 3.2.1.1软件问题 HardFault 以下情况造成HardFault: 在外设时钟门未使能的情况下操作该外设的寄存器; 跳转函数地址越界,通常发生在函数指针被篡改

58620

Modbus报文详解

1.3.1.4地址冲突如果两个或更多的设备被设置成相同的地址,导致地址冲突,进而导致通信失败。...03 (0x03): 读保持寄存器(Read Holding Registers)- 用于读取一组保持寄存器中的二进制内容。...04 (0x04): 读输入寄存器(Read Input Registers)- 用于读取一组输入寄存器中的二进制内容。...1.3.2.5 异常异常功能码:异常功能码为正常功能码 + 0x80,如写入单个寄存器错误返回异常码为0x86。1.3.3 数据数据部分主要包含了命令的具体内容,它的结构和长度依赖于功能码的不同。...本文仅列举几个常见的功能码,以及与之对应的数据部分的结构和作用:1.3.3.1 读取保持寄存器 (功能码03)主机发送数据部分:主机发送功能码03的数据,表示要读取从0x0032开始3个寄存器的内容。

10700

操作系统:硬件结构

) 跳转指令(如无条件跳转指令b) 过程调用指令(如调用指令bl、返回指令ret) 特权指令(如读取系统寄存器指令ms、写入系统寄存器指令mrs)等 特权级 TrustZone将整个系统划分为安全世界和普通世界...发生EL0到EL1切换的可能场景: 应用程序需要调用操作系统提供的系统调用,此时应用程序执行svc指令将cpu特权级从EL0切换到EL1 应用程序执行的指令出发了异常,该异常导致CPU特权级切换到EL1...栈指针进行切换(操作系统可以设置这个寄存器来配置处理异常过程中使用的栈 其他的状态 异常向量表 操作系统可以在异常向量表种为不同的异常类型配置相应的处理函数。...发生特权级切换时,CPU读取VBAR_EL1(向量地址寄存器)来获取异常向量表的基地址,然后调用相应的处理函数 寄存器 在AArch64中,有31个64位通用寄存器,被命名为X0~X30。...X30用在链接指针(Link Pointer, LP)寄存器,因为CPU在执行函数调用指令bl时,自动把返回地址保存在其中。

71040

10_异常与中断

处理异常导致CPU核在模式之间切换并将某些寄存器复制到其他寄存器中。...10.2.6 异常处理 ​ 发生异常时,ARM内核自动执行以下操作: ​ 1.将CPSR复制到SPSR_ ,这是特定(非用户)操作模式的备份寄存器。 ​...此外,链接寄存器(进行了–8或–4调整,取决于中止是由指令获取还是数据访问引起的),给出了导致中止异常的指令的地址。...可以使用寄存器或者操作码中某个字段将参数传递给SVC处理程序。 ​ 发生异常时,异常处理程序可能必须确定内核是处于ARM还是Thumb状态。 ​ 特别是SVC处理程序,可能必须读取指令集状态。...处理中断所采取的步骤如下: ​ 1.外部硬件引发IRQ异常。ARM核自动执行几个步骤。当前模式下PC的内容存储在LR_IRQ中。CPSR寄存器被复制到SPSR_IRQ。

1.2K10

MIPS架构深入理解3-协处理器0

2.2 读取CPU控制寄存器的指令 mfc0 d, $n # 把协处理器第n个寄存器中的值写入到通用寄存器d中 上述指令的作用是把协处理器0中的第n个寄存器中的内容读取到通用寄存器d中。...2.3 特殊的控制指令eret 所有的架构的CPU在面对特权等级切换的时候(一般就是异常返回时),都会面临一个问题:一方面,在返回用户态程序之前就降低特权等级,那么立即引发一个异常指令访问的二次异常;...对于MIPS架构,程序发生异常时,只能看EPC寄存器中的值,然后通过反汇编得到执行代码的地址,从而获取到导致异常的代码大概位置。充分利用异常发生时的信息,是调试程序的一种有效手段。...在这些CPU上,指令清除CPU的管道流水线。而且大部分时候,对于不遵守MIPS32/64架构规范的CPU还会提供必要的延时。...为了保证安全,可以在 可以在读取CP0寄存器值的指令之前,添加ehb指令。

1K10

aarch64指令集_AArch64应用程序级编程模型

它只能在分支、异常条目或异常返回上更新。 试图执行未按字对齐的A64指令产生PC对齐错误 V0-V31 32个SIMD&FP寄存器,从V0到V31。...从EL0到系统寄存器的任何访问都禁用了访问权限,这将导致指令表现为未定义。...Timer registers 在ARMv8中执行以下操作:使用CNTFRQ_EL0读取对系统时钟频率的访问。 物理和虚拟计时器计数寄存器,CNTPCT_EL0和CNTVCT_EL0。...虚拟计数比较、下计数值和计时器控制寄存器CNTV_CVAL_EL0、CNTV_TVAL_EL0和CNTV_CTL_EL0。 软件控制功能和EL0 异常处理 在Arm架构中,异常导致程序流的更改。...与调试相关的说明 引用BRK指令,BRK指令生成断点指令异常。此外,在AArch64状态和AArch32状态下,HLT指令导致PE停止执行并进入调试状态。

60420

那些年,我们追过的MCU复位

低电压复位导致RCM_SRS0寄存器的LVD位被置位。 需要注意的是,如果要正确的使能LVD复位,还需要配置PMC_LVDSC1寄存器 ?...看门狗复位导致RCM_SRS0寄存器的COP位置位。 低漏唤醒复位 LLWU Reset。...当SYSRESETREQ位被置位时,产生一个复位请求。软件复位重置除去调试模块以外的其他任何模块。 软件复位导致RCM_SRS1寄存器的SW位置位。 锁定复位 LOCKUP Reset。...当系统内置的硬件保护装置被激活,从而产生了一个不可恢复的异常时,内核将被锁定,并引发锁定复位。 锁定复位导致RCM_SRS1寄存器的LOCKUP位置位。...MDM-AP系统复位导致RCM_SRS1寄存器的MDMAP位置位。 调试复位 调试复位不会导致RCM_SRS1寄存器的状态位发生改变。 特定的代码会使 JTAG 模块产生一个系统复位。

2.9K60

Java 并发编程:volatile能否保证数据的同步

在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。...这样做确实让速度提高了很多,但由于CPU发展十分迅猛,另一方面RAM的发展受到技术及成本的限制而发展缓慢,此时就产生了一个很难调和的矛盾:CPU运算速度比从RAM读取数据的速度快了几个数量级。...直接在CPU添加了几个不同级别的缓存,虽然它们的速度无法与寄存器相比,但是速度已经提升很多,基本能跟CPU的计算速度相匹配。 ? ?...CPU读取数据的顺序是先尝试读寄存器,如果不存在则尝试读高速缓存。如果还不存在则读RAM,最后才是读ROM。...如果变量值并非最新值,将会导致数据的脏读,最终可能导致计算结果大相径庭。

45640

操作系统基础-CPU虚拟化

前言 最近在学习威斯康星大学的CS-537课程:操作系统导论[1],笔者计划用五篇文章来结束这个课程,目的包括: 作为过去几个月学习经历的回顾和总结 参考陈皓的《TCP/IP那些事》[2],尝试用尽可能简洁的篇幅来描述操作系统的基础...操作系统通过分时复用的方式实现了CPU的虚拟化,运行进程A一段时间后,主动或被动地把这个进程的状态信息写入物理内存然后从物理内存中读取另一个进程B的状态信息,从而恢复进程B的运行。...在具体实现上,CPU中有一个状态位,表明了当前运行在什么模式下: 用户的进程运行在用户模式下,这种模式能做的操作有限,比如它无法发起一个I/O请求,尝试这么做引发一个异常(exception),导致进程被操作系统杀死...这些系统调用看起来像是一个普通的函数,而内部实现上只是把系统调用的编号,和对应的参数放到栈上某个特定的位置,然后调用trap指令,这个指令完成以下几个操作: 把当前进程的CPU寄存器的值保存到内核栈中...CPU在执行完一条指令之后,总是检查是否存在异常,如果有则触发对应的异常处理函数,否则继续执行下一条指令。

1.5K40

MIPS架构深入理解5-内存管理

V(合法标志位) 如果为0,尝试访问该地址都导致异常。用来设置某个物理地址不可访问。 G(全局标志) 置1时,TLB项只匹配V**域内容,不管ASID域的内容是否匹配EntryHi中的值。...系统软件一般不会读取TLB表项。但是,如果确实需要读取它们,则使用tlbp遍历匹配到需要的虚拟地址对应的TLB项,把对应的索引值写入到Index寄存器。...为了加速异常处理程序的执行,提供了几个特殊的硬件特性。...5.1 TLB未命中处理程序 TLB未命中异常发生时,如果状态寄存器SR中的EXL标志位没有被置位,总是跳转到CPU特定的入口点,开始执行。...TLB也允许你定义一些地址是临时的,或者永久不可用的,从而对这些位置的访问导致一个异常来运行操作系统的某些服务例程。通过使用ASID,可以在用户空间实现多任务间的地址空间安全。

1.6K20

Linux系统中断的硬件框架

中断控制器向CPU发出中断信号,CPU可以读取中断控制器的寄存器,判断当前处理的是哪个中断。...register:是否选择下降沿触发 Rising trigger selection register:是否选择上升沿触发 Interrupt mask register:是否屏蔽中断 当发生中断时,可以读取下列寄存器判断是否发生了中断...ISER0中的bit0对应异常向量表中的第16项(向量表从第0项开始),如下图: 3.2.4 CPU cortex M3/M4处理器内部有这几个寄存器: 1....GIC接受系统级别中断的产生,并可以发信号通知给它所连接的每个内核,从而有可能导致IRQ或FIQ异常发生。 GIC比较复杂,下一个视频再详细讲解。...GIC接受系统级别中断的产生,并可以发信号通知给它所连接的每个内核,从而有可能导致IRQ或FIQ异常发生。 GIC比较复杂,下一个视频再详细讲解。

4.4K40

ebpf_ebpf需要修改内核吗

一个eBPF程序会附加到指定的内核代码路径中,当执行该代码路径时,执行对应的eBPF程序。...,存储体系,中断,异常处理以及外部I/O。...预定义的挂钩包括系统调用、函数输入/退出、内核跟踪点、网络事件和其他几个。...无法读取包含未初始化内容(从未写过内容)的寄存器读取导致加载失败。寄存器R0-R5的内容通过存储特殊值来捕获未初始化寄存器的所有读取,从而在函数调用中标记为不可读。...进行了类似的检查以读取堆栈上的变量,并确保没有指令写入只读帧指针寄存器。? 3、检验者使用eBPF程序类型(稍后介绍)来限制可以从eBPF程序调用哪些内核功能以及可以访问哪些数据结构。

67511

ARMv8 寄存器

比如这张寄存器图,W0是X0的低32位,W1是X1的低32位: 对于数据处理指令,选择X或W决定操作的大小。使用X寄存器导致 64 位计算,使用 W 寄存器导致 32 位计算。...此时如果发生异常,并且target exception level也是EL1,虽然异常等级不会切换,但是栈指针也自动切换为SP_EL1。...n 注意:如果由于异常级别没有足够的权限执行指令而导致系统调用指令被捕获、禁用或未定义,则首选的异常返回地址为系统调用指令的地址。...1:表示在内核态访问用户态内存触发一个访问权限异常。 对于这些特殊寄存器的访问,只能通过MRS(读)/MSR(写)指令完成。...可以使用以下方式读取 PC:ADR Xd, . 点 ( .) 表示“这里”,因此显示的指令返回其自身的地址。这相当于阅读PC. 系统寄存器 数据处理或加载/存储指令不能直接使用系统寄存器

8710

全志A40i应用笔记 | 3种常见的网卡软件问题以及排查思路

问题分析: 出现"No phy found",常见原因是供给phy使用的25M时钟异常导致phy工作不正常,gmac驱动通过mdio接门也读不到phy的设备信息。...MDIO通讯正常验证: 使用phytool工具读取0x02 0x03寄存器 是否正确读取PHY芯片ID,读取成功,代表MDIO通讯正常。...问题分析: 出现"Initialize hardware error",一般是由于phy没有输出RX CLK至MAC控制器,导致MAC控制器内部soft reset失败,常见原因是phy供电异常或25M...如下图示例,能够正常读取JL11x1的phy ID则代表MDIO通讯正常。 使用phytool工具读取phy状态寄存器,查看phy芯片状态。...以JL11x1为例,如0x01状态寄存器读取值为0x786d,说明link成功并且工作正常。

11510

Linux之进程信号(下)

首先OS读取当前进程在CPU中CR3寄存器的内容,读取运行状态,只有当内容是0内核态时才允许进行访问,所以系统调用接口的起始位置帮我们把用户态变为内核态(即,从3改为0)。...程序的崩溃本质是因为进程访问了未申请的空间,导致程序异常,OS向进程发送了终止进程的信号,但是实际上数组编译器在编译代码时,在栈上开辟的空间的大小与编译器是强相关的(并不仅由程序决定开辟多大空间,但是至少和程序申请的一样大...例如,数组大小是10个元素,而它在栈上分配的字节数可能大于10个元素空间,那么此时数组越界也可能还在有效的栈区内,因此不会发生异常,OS识别不出异常,它也不会发送信号终止进程导致程序崩溃。...而while循环因为代码的优化,导致检测quit时读取的是寄存器中的值,而不是内存中的值,因此一直循环,就导致了程序不退出的结果。 这就相当于寄存器中的quit值覆盖率物理内存中quit变量值。...给quit加volatile关键字,则quit就会通过内存读取而不是寄存器,就能保持变量quit的内存可见性。

17820

(23)STM32——硬件随机数发生器

,只要只用几个函数就好了,不需要繁琐的配置,和软件中的随机数一样舒服。...通过监控RNG熵来标识异常行为。 可以禁止来降低功耗。 STM32F4的随机数发生器(RNG)采用模拟电路实现。...此电路产生馈入线性反馈移位寄存器 (RNG_LFSR) 的种子,用于生成 32 位随机数。 该模拟电路由几个环形振荡器组成,振荡器的输出进行异或运算以产生种子。...当将大量种子引入RNG_LFSR后,RNG_LFSR 的内容传入数据寄存器 (RNG_DR)。...同时,系统监视模拟种子和专用时钟 PLL48CLK,当种子上出现异常序列,或PLL48CLK时钟频率过低时,可以由RNG_SR寄存器的对应位读取到,如果设置了中断,则在检测到错误时,还可以产生中断。

71320

浅谈中断验证(一)

中断是一种硬件与软件间、cpu与外设间的交互手段,中断一旦出问题,芯片很可能因此缺失某些特性,甚至于毁了整颗芯片,中断验证由此显得极为关键。...比如,中断就好比你点了个外卖,然后你就去干你别的事了,过了一外卖小哥打电话叫你下楼取外卖;而查询与中断的区别在于,外卖小哥不会打电话给你,你点完外卖后要一直拿着手机查询订单状态,当外卖到楼下后自己下楼取餐...3、cpu收到中断信号后会对中断控制器中的寄存器进行访问,读取中断信息存入自身的状态寄存器中,并且有的中断控制器还会通过mask寄存器屏蔽对应的中断,之后cpu执行存好的中断驱动程序。...异常中断:顾名思义,就是一些硬件不可预期的行为导致的错误发生,发生异常中断时,硬件可能已不能自我解决这种错误,需要向cpu申请支援。...异常中断按照程度可以分为两类,分别为致命中断和非致命中断,它俩的区别在于硬件是否会由于异常错误挂死,甚至导致整个芯片崩溃宕机。

1.1K20
领券