4.4 系统异常

工业4.0下的设备异常预测维护系统设计 设备异常预测维护系统面临的主要问题包括:如何准确地采集设备的运行数据;如何对大量的异构数据进行有效的处理和分析;如何建立准确的故障预测模型;如何实现系统与现有工业控制系统的集成等。此外,还需要考虑系统的可靠性、安全性和可扩展性,以适应不断变化的工业环境。 阅读详情

程序4-4 代码功能

 lidt IDT_POINTER(%rip)
 ...

setup_IDT:    // ignore_int(%rip) = 0x1111 2222 3333 4444
 #首先ignore_int中断服务程序的偏移地址(OFFSET)就可以使用lea指令取出ignore_int标号的基地址

 #这个基地址要被拆分成第0-15位和第48-63位,分别放在EAX和EDX寄存器中
 #然後在將EAX的值加載到中斷描述符的低位,將EDX的值加載到中斷描述符的高位。
 leaq ignore_int(%rip), %rdx     ;假如 ignore_int 函数 的地址为 %rdx = 0x2222 3333 4444 5555
 movq $(0x08 << 16), %rax       ; 段选择子  %rax = 0x0000 0000 0008 0000 = 0b 0000 0000 0000 1000   位数: 0-1 RPL 请求特权级  1-2   TI 指示目标段描述符所在描述符表类型   3-15 用于索引目标段描述符  2   #段选择符,我们要选用代码段的段选择符,所以我们使用0008h号GDT段选择符。
 movw %dx, %ax                 ;   段内偏移 15:00  %ax =  ignore_int 函数的低16位 %ax = 0x5555 %rax = 0x0000 0000 0008 5555
 movq $(0x8E00 << 32), %rcx    ;  %rcx = 0x0000 8E00 0000 0000 = 0b0000 0000 0000 0000 1000 1110 0000 0000  32-34 IST ( Interrupt Stack Table,中断枝表)是IA-32e模式为任务状态段引人的新型战指针,其功能与 RSP相同,只不过IST切换中断棋指针时不会考虑特权级切换。 35-39:0 40-43:Type 第40-43位为段描述符类型标志(TYPE),我们设置的是1110.即将此段描述符标记为“386中断门”。  44-44:0 45-46:DPL 描述符特权级  47-48:P 指定调用门描述符是否有效
 addq %rcx, %rax              ;   %rax = 0x0000 8E00 0008 5555  %rcx = 0x0000 8E00 0000 0000        
 movl %edx, %ecx              ;   %ecx = ignore_int 函数的低32位 0x4444 5555    %rcx = 0x0000 8E00 4444 5555
 shrl $16, %ecx               ;   %ecx =  0x0000 4444 %rcx = 0x0000 8E00 0000 4444 
 shlq $48, %rcx               ;   %rcx =  4444 0000 0000 0000
 addq %rcx, %rax              ;   %rax =  0x4444 8E00 0008 5555        
 shrq $32, %rdx              ;    %rdx = 0x0000 0000 2222 3333 
 leaq IDT_Table(%rip), %rdi ;
  mov $256, %rcx
 rp_sidt:
  movq %rax, (%rdi)
  movq %rdx, 8(%rdi)
  addq $0x10, %rdi
  dec %rcx
  jne rp_sidt

·模块setup_IDT负责往IDT(中断描述符表)填入中断描述符(单个表项占用16Byte),中断描述符的格式参考下图:

在这里插入图片描述

ignore_int:
/*#CLD指令即告訴程序si,di向內存地址增大的方向走。*/
 cld
 pushq %rax
 pushq %rbx
 pushq %rcx
 pushq %rdx
 pushq %rbp
 pushq %rdi
 pushq %rsi

 pushq %r8
 pushq %r9
 pushq %r10
 pushq %r11
 pushq %r12
 pushq %r13
 pushq %r14
 pushq %r15

 movq %es, %rax
 pushq %rax
 movq %ds, %rax
 pushq %rax

 movq $0x10, %rax
 movq %rax, %ds
 movq %rax, %es

 leaq int_msg(%rip), %rax
 pushq %rax
 movq %rax, %rdx
 movq $0x00000000, %rsi
 movq $0x00ff0000, %rdi
 movq $0, %rax
 callq color_printk
 addq $0x8, %rsp

Loop:
 jmp Loop

 popq %rax
 movq %rax, %ds
 popq %rax
 movq %rax, %es

 popq %r15
 popq %r14
 popq %r13
 popq %r12
 popq %r11
 popq %r10
 popq %r9
 popq %r8

 popq %rsi
 popq %rdi
 popq %rbp
 popq %rdx
 popq %rcx
 popq %rbx
 popq %rax
 iretq

int_msg:
 .asciz "Unknown interrupt or fault at RIP\n"

·目前,只写了一个中断处理程序ignore_int,功能是在发生中断时在屏幕显示黑底红字的错误信息"Unknown interrupt or fault at RIP\n",并随即进入死循环;

·根据描述符格式要求,现在利用ignore_int所在的内核数据段选择子0x08以及ignore_int的入口偏移地址,来创建中断描述符,并且往目前的IDT表的全部256个表项都填入这个相同的描述符(即目前无论发什么异常错误,都调用的是ignore_int)

设置TSS

TSS段主要用于任务切换(或特权级切换) 时,保存处理器的寄存器状态,以及切换至对应的 特权级栈空间,从而使得任务返回时能够还原执行现场。 下图是一个32位的任务状态段的内部结 构。 (16位的TSS段只用在Intel286处理中。 )

32位模式下的tss

TSS被分为两部分 : 动态区域和静态区域。 当任务在切换过程中挂起时, 处理器会将执行现场保 存在动态区域内,下图归纳了32位 TSS的动态区域。
在这里插入图片描述

64位模式下的tss

下图的TSS描述符位功能非常好理解, 而且功能也并无变化,但TSS的内部结构却发生革命性的 变化。 既然TSS不再需要保存和还原程序 (或任务)的执行现场环境,那么它只负责不同特权级间的栈切换工作 。
下图是IA-32e模式TSS的 内部结构 。
在这里插入图片描述

为 TSS 设置 IST

void set_tss64(unsigned long rsp0,unsigned long rsp1,unsigned long rsp2,unsigned long ist1,unsigned long ist2,unsigned long ist3,
unsigned long ist4,unsigned long ist5,unsigned long ist6,unsigned long ist7)
{
	*(unsigned long *)(TSS64_Table+1) = rsp0;
	*(unsigned long *)(TSS64_Table+3) = rsp1;
	*(unsigned long *)(TSS64_Table+5) = rsp2;

	*(unsigned long *)(TSS64_Table+9) = ist1;
	*(unsigned long *)(TSS64_Table+11) = ist2;
	*(unsigned long *)(TSS64_Table+13) = ist3;
	*(unsigned long *)(TSS64_Table+15) = ist4;
	*(unsigned long *)(TSS64_Table+17) = ist5;
	*(unsigned long *)(TSS64_Table+19) = ist6;
	*(unsigned long *)(TSS64_Table+21) = ist7;	
}
	set_tss64(_stack_start, _stack_start, _stack_start, 0xffff800000007c00, 0xffff800000007c00, 0xffff800000007c00, 0xffff800000007c00, 0xffff800000007c00, 0xffff800000007c00, 0xffff800000007c00);

IST和IDT的实际使用示例

/*

*/

#define _set_gate(gate_selector_addr,attr,ist,code_addr)	\
do								\
{	unsigned long __d0,__d1;				\
	__asm__ __volatile__	(	"movw	%%dx,	%%ax	\n\t"	\
					"andq	$0x7,	%%rcx	\n\t"	\
					"addq	%4,	%%rcx	\n\t"	\
					"shlq	$32,	%%rcx	\n\t"	\
					"addq	%%rcx,	%%rax	\n\t"	\
					"xorq	%%rcx,	%%rcx	\n\t"	\
					"movl	%%edx,	%%ecx	\n\t"	\
					"shrq	$16,	%%rcx	\n\t"	\
					"shlq	$48,	%%rcx	\n\t"	\
					"addq	%%rcx,	%%rax	\n\t"	\
					"movq	%%rax,	%0	\n\t"	\
					"shrq	$32,	%%rdx	\n\t"	\
					"movq	%%rdx,	%1	\n\t"	\
					:"=m"(*((unsigned long *)(gate_selector_addr)))	,					\
					 "=m"(*(1 + (unsigned long *)(gate_selector_addr))),"=&a"(__d0),"=&d"(__d1)		\
					:"i"(attr << 8),									\
					 "3"((unsigned long *)(code_addr)),"2"(0x8 << 16),"c"(ist)				\
					:"memory"		\
				);				\
}while(0)

void sys_vector_init()
{
	set_trap_gate(0,1,divide_error);
	set_trap_gate(1,1,debug);
	set_intr_gate(2,1,nmi);
	set_system_gate(3,1,int3);
	set_system_gate(4,1,overflow);
	set_system_gate(5,1,bounds);
	set_trap_gate(6,1,undefined_opcode);
	set_trap_gate(7,1,dev_not_available);
	set_trap_gate(8,1,double_fault);
	set_trap_gate(9,1,coprocessor_segment_overrun);
	set_trap_gate(10,1,invalid_TSS);
	set_trap_gate(11,1,segment_not_present);
	set_trap_gate(12,1,stack_segment_fault);
	set_trap_gate(13,1,general_protection);
	set_trap_gate(14,1,page_fault);
	//15 Intel reserved. Do not use.
	set_trap_gate(16,1,x87_FPU_error);
	set_trap_gate(17,1,alignment_check);
	set_trap_gate(18,1,machine_check);
	set_trap_gate(19,1,SIMD_exception);
	set_trap_gate(20,1,virtualization_exception);

	//set_system_gate(SYSTEM_CALL_VECTOR,7,system_call);

}

sys_vector_init 方法里面的所有异常的IST均设置为1,其代表IST1,值为0xffff800000007c00,在发生异常时,会系统会自动将rsp指针设置为 0xffff800000007c00 用于保存寄存器的值!

思考,为什么执行 i = 1/0 时,系统会找到序号为0的中断,而不产生其他中断序号?

异常事件和中断请求的 检测 都是在某一条指令执行过程中进行的,显然由硬件完成;

在 CPU 根据 CS 和 EIP 取下条指令之前,会根据检测的结果判断是否进入中断响应阶段;

异常和中断的响应也都是在某一条指令执行过程中或执行结束时进行的,显然也由硬件完成;

内存示意图

在这里插入图片描述

setup_IDT :格式化中断描述符

在这里插入图片描述

ignore_int :中断处理程序

在这里插入图片描述

setup_TSS64 :格式化TSS描述符,并填入GDT表

在这里插入图片描述

参考资料

TSS Descriptor

在这里插入图片描述

汇编指令 lea

在这里插入图片描述

【SpringBoot 4.x 第64节】夯爆了,全局异常处理高级实践:业务异常、系统异常与参数异常一次讲透(超详解)! 🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。本专栏面向 有一定 Java 基础,但尚未系统学习 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,带你从第一个 Hello API 开始,逐步完成一个可部署、可监控、可扩展的后端项目。 阅读详情

相关推荐

【SpringBoot 4.x 第145节】Spring Boot 4.x 全局异常处理高级实践:业务异常、系统异常、参数异常一套打通(超详解)!

🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。本专栏面向 有一定 Java 基础,但尚未系统学习 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,带你从第一个 Hello API 开始,逐步完成一个可部署、可监控、可扩展的后端项目。

**My Coding Family** 69

中断分析(五)

中断分析(五)    ——初始化中断描述符表的具体实现    中断描述符表的初始化:将中断描述符表的起始地址装入IDTR,并初始化表中的每一项。具体过程如下图所示:         一、中断描述符表的预初始化:用256个指向ignore_int中断门的入口地址填充中断描述符表。它

点滴积累 757

第三篇:学习InternVL2.0(探讨代码之训练模块版)

InternVL2的训练模块

qq_69051120的博客 1244

关于cin.ignore()用法的一些浅见

C++小白经验总结

m0_57992813的博客 2244

车规级非易失存储选型指南:从AEC-Q100到ISO 26262的可靠性设计

非易失存储器是电子系统中负责长期保存关键数据与代码的核心组件,其可靠性直接决定了系统的长期稳定运行能力。在汽车电子领域,这一要求被提升到了极致,必须满足严苛的车规级标准。从原理上看,存储器的数据保持能力、擦写寿命等关键参数在高温、振动等恶劣环境下会急剧衰减,因此需要专门的设计与验证。其技术价值在于保障车辆全生命周期的功能安全与数据完整性,避免因存储失效导致的安全隐患或频繁维护。应用场景涵盖从发动机控制单元、自动驾驶域控制器到智能座舱的各类电子控制单元。本文聚焦于车规级非易失存储的选型,深入解析AEC-Q10

weixin_30938149的博客 457

避坑指南:从聚宽迁移到QMT必须知道的5个细节(含Redis连接异常处理)

本文详细解析了从聚宽迁移到QMT平台时需注意的5个关键细节,特别是Redis连接池优化和xtquant重连机制。通过实战代码示例,帮助量化团队解决信号传递稳定性、时间同步、滑点控制等核心问题,确保交易策略平稳过渡。

weixin_27303545的博客 427

AT&T 汇编入门 - 汇编使用printf

AT&amp;T 汇编入门 - 汇编使用printf 一般 C 语言的hello world 我们都是通过printf 打印的,而不是直接往stdout 写入字符串. 那我们现在就来试试如何在汇编中调用libc的printf 函数。 .section .data msg: .ascii "hello world!\n" .section .text .g...

chuck_huang的专栏 3001

SKUA-GOCAD入门教程-第七节 点的创建与编辑3

本文介绍了四种从井数据创建点集的方法

江洋大葱的博客 963

Linux 0.11-重新设置idt和gdt-08

为什么原来已经设置过一遍了,这里又要重新设置一遍,你可千万别想有什么复杂的原因,就是因为原来设置的 gdt 是在 setup 程序中,之后这个地方要被缓冲区覆盖掉,所以这里重新设置在 head 程序中,这块内存区域之后就不会被其他程序用到并且覆盖了,就这么个事。中断描述符表 idt 里面存储着一个个中断描述符,每一个中断号就对应着一个中断描述符,而中断描述符里面存储着主要是中断程序的地址,这样一个中断号过来后,CPU 就会自动寻找相应的中断程序,然后去执行它。,然后第四项系统段描述符并没有用到,不用管。

m0_53157173的博客 1033

快速卷积结构FIR数字滤波器的设计与ARM平台实现

本文提出了一种基于快速卷积结构的FIR数字滤波器设计与实现方案。通过Matlab设计了满足特定指标的低通FIR滤波器,采用重叠-保存法和重叠-相加法两种快速卷积算法,将计算复杂度从O(N·M)降低到O(NlogN)。详细介绍了滤波器系数生成、性能验证流程,并提供了ARM平台C语言实现的关键技术,包括定点量化处理。实验结果表明,该方法能有效滤除混合信号中的高频干扰,保留目标1kHz正弦信号,验证了设计方案的有效性。

huanghm88的专栏 123

vue2/3 - element表格组件el-table实现懒加载树型(上下级)数据、默认展开和隐藏层级,支持对表格进行修改|新增|删除,解决完成操作后树节点不刷新问题(提供示例代码,一键复制开箱即用

vue2,vue3,elementui,elementPlus,el-table,Table表格组件,表格懒加载数据,element table表格数中的树形结构懒加载,增加后数据不同步更新问题,el-table树形与el-tree树形结构的一键折叠与展开,elementui中el-tree懒加载数据 默认展开最外层节点,Element-plus Table组件树表结构默认展开一级目录,vue实现element table表格树形结构-使用懒加载时-解决子节点增删改后,不刷新子节点数据问题,解决el-tre

✅ 精选推荐文章 1万+

segment descriptor http://www.mouseos.com/arch/descriptor64.html

long mode 下的 segment descript 注意:     本文针对的是 long mode 下的 segment descriptor 情况,当然包括: 64-bit modecompatibility mode 对于 gate descriptor 来说,在 long mode 下是固定 16 bytes,但是对于 segmen

surpass1026的专栏 1029

OpenClaw 开机自启配置:Windows/macOS/Linux 全平台技术指南

OpenClaw 开机自启全平台配置指南 本文提供了在Windows、macOS和Linux系统上配置OpenClaw开机自启的完整技术方案。主要内容包括: Windows配置:提供三种方法(Windows服务、任务计划程序、启动文件夹),详细说明服务脚本创建、服务注册和测试流程 macOS配置:使用LaunchAgent实现开机自启,包含配置文件创建和加载方法 Linux配置:通过systemd服务实现,包括服务单元文件创建和启用步骤 系统要求:明确硬件(64位CPU/4GB内存)和软件(各平台操作系统版

一键难忘的博客 2993

Android4.2系统辅助功能打开时,加载WebView导致空指针异常解决记录

最近负责APP错误统计分析,修复线上一些BUG,有一个这样的问题,日志如下:java.lang.NullPointerException at android.webkit.AccessibilityInjector$TextToSpeechWrapper$1.onInit(AccessibilityInjector.java:753) at android.speech.tts.T

小嵩的博客 2581

数字信号处理----数字上变频和下变频都FPGA实现

** 数字信号处理基础----信号下变频和解调 一、 任务介绍 数字上变频器(DUC)和数字下变频器(DDC)广泛应用于通信系统,用于信号采样速率的转换。当信号从基带转换至中频( IF )带,需要使用数字上变频器。而数字下变频器是用于将信号从中频( IF )带转换为基带。DUC和DDC通常包括使用混频器进行频率转换,此外还有采样率转换。DUC或DDC的结构主要取决于所需要的转换率。例如,WiMAX (全球互通微波接入)系统典型的转换率为8—10阶。对于如此低的转换率,DUC和DDC只需采用FIR滤波器架构。

Born_toward的博客 3万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

异常处理

80x86处理器发布了大约20种不同的异常。内核必须为每种异常提供一个专门的异常处理程序。对于某些异常,CPU控制单元在开始执行异常处理程序前会产生一个硬件的错误码(hardware error code),并且压入内核态堆栈。下面列表给出了在80x86处理器中可以找到的异常的向量、名字、类型及其简单描述。更多信息可以在Intel的技术文挡中找到。0 - "Divide error

云(存储),松(耦合) 2561

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

构建64位操作系统-进程与线程

构建64位操作系统-进程

x13262608581的博客 496

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

【译】x86程序员手册35-9.8异常条件

译注:一些异常没有翻译,因为看书时主要为了理解linux代码,所以代码中没有主要使用的就没有仔细看。这部分内容后期再看时再进行翻译。 9.8 Exception Conditions异常条件 The following sections describe each of the possible exception conditions in detail. Each descr...

weixin_30716725的博客 632

《深入理解Linux内核》第四章中断和异常(一)

最近鼓足勇气拿起吃灰多年的linux红宝书《深入理解Linux内核》,希望可以提升和巩固Linux内核理论知识。在此记录自己对书本内容和源代码理解,望各位大虾批评指正。 一、中断描述符(4.2.3. Interrupt Descriptor Table) 目的:关联中断或者异常向量和对应中断或异常处理程序地址 大小:64bit(8个byte) 寄存器:idtr 格式: 其中40---43bit用来识别中断描述符类型。 二、硬件上对中断或者异常处理过程(4.2.4. Hardware Han

yxw0609131056的博客 687

构建64位操作系统-中断与异常

构建64位操作系统-中断与异常

x13262608581的博客 1423

实现64位操作系统的问题解决系列:(三)程序4-11 因为__switch_to符号未定义,编译失败

实现64位操作系统的问题解决系列:(三)程序4-11 因为__switch_to符号未定义,编译失败 ub16或者ub18上实践田宇大佬的64位操作系统的设计与实现,因为环境的原因,书中提供的代码并不能完全编译成功,前面我写了实现64位操作系统的问题解决系列:(一)和(二)基本编译到程序4-10都不会出问题,但是到程序4-11就会 因为__switch_to符号未定义,编译失败。 问题描述 经过实...

zhangji 1162

汇编 设置中断描述符表

操作的步骤如下:1、记录中断处理函数的段内偏移2、获取或指定段选择子3、对idt表赋值(本操作是对所有的中断都采用同一的函数(MyIntFunc)处理)注: _idt  中断描述符表的基址 idt_descr  中断描述符操作的参数图示如下:63.55.47.39.31.23.15.7.0|MyIntFunc[2] |MyIntFunc[3] |0x8e |0x00 |0x00 |0x08

eqxu的专栏 1535

C语言中的ignore

ignore函数 功能:函数用于输入流。它读入字符,直到已经读了num 个字符(默认为1)或是直到字符delim 被读入(默认为EOF). 其调用形式为cin.ignore(n,终止字符) 原型:istream &ignore( streamsize num=1, int delim=EOF ); 函数作用是跳过输入流中n个字符,或在遇到指定的终止字符时提前结束(此时跳过包

荪荪的博客 4765

64位操作系统——(二)kernel

64位操作系统——(二)kernel 作者:王赛宇 参考列表: 主要参考:《一个六十四位操作系统的设计与实现》——田雨 《Using as》 ——Dean Elsner & Jay Fenlason & friends nasm 用戶手册 处理器startup.s 常见汇编指令… 前情提要 在第一章节中,我们学习、研读了bootloader的代码,bootloader可以被分为两个过程: boot:计算机上电,自检完成后自动执行0x7c00处的boot程序,该程序被限制了大小5

qq_17853613的博客 3351

IA32和x64架构分段数据结构

翻译自《Intel® 64 and IA-32 Architectures Software Developer Manuals》 IA-32系统级寄存器和数据结构: 内存管理寄存器: 分段和分页: 逻辑地址到线性地址的翻译: 段选择子: 段描述符: 全局描述符和局部描述符

Firas的专栏 3999
上一篇: 4.5 初级内存管理单元
下一篇: 解决 wmware windows虚拟机无法使用U盘,提示“跟这台电脑连接的一个usb设备运行不正常 windows无法识别它”的问题!
滑板小王子
博客等级 码龄9年 19粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值