第五篇 直接面向系统资源的0号中断处理

ARM中断处理架构与GICv3分组机制详解 中断处理是计算机系统的核心机制,通过硬件与软件协同实现对外部事件的快速响应。ARM架构的通用中断控制器(GIC)提供了灵活的中断管理方案,特别是在GICv3/v4版本中增强了安全状态支持与优先级处理能力。中断分组机制将中断划分为不同安全级别和优先级组别,结合二进制点寄存器实现精细化的优先级控制。这种设计在嵌入式系统和实时操作系统中尤为重要,例如汽车电子需要毫秒级响应安全气囊中断。通过合理配置中断分组、优先级和抢占规则,可以优化系统实时性能,平衡关键任务响应与普通任务处理。GICv3还引入了NMI支持,为不可 阅读详情

学习汇编的一个重要目的就是获得面对底层编程的经验。

这也就是说有的时候我们这些编程者应该绕开操作系统,直接面向硬件要资源。当然,这

在某种程度上是不安全的。但请别忘了,我们在写汇编。

 

一、简单介绍下博文的目标

这篇博文主要是改写0号中断(除法溢出)的入口地址,使之执行编程者自己编写的中断处理

程序。系统提供的0号中断服务程序做法是打印divide overflow!,然后返回。新的中断服务

程序的目标是在屏幕中央打印overflow!,然后返回。

那么,怎么怎样体现直接向硬件要资源呢?举个例子,我们知道普通的子程序实在编译的时候

由系统分配一个安全的内存空间存储之。我写的新的中断程序则不这样了,分析程序可以发现,

我是直接将新的中断服务程序,拷到了内存0000:0200开始的空间。

到这里,细心的读者可能就会有两个疑问了。

1、我们虽然强调直接面向系统资源(这里主要是内存)编程,但我们总不能什么也不管什么也

不顾吧,本着破坏的目的吧?

2、为什么将中断服务程序写到内存0000:0200开始的区域呢?

回答这两个问题之前我们先来看看利用debug的D命令,查看内存0000:0200开始的256个字节的

内容。

到这里,上述的两个问题都可以迎刃而解了。从0000:0200开始的内存区域虽然是系统存放

中断向量表的区域,但显然,系统没有提供那么多的中断,这区域为空。另外,由于这段区

域啥也没有,我们向这里写东西也一般不会引起不安全的事。

 

二、代码

data segment
	hint db 'overflow!','$'
	addr dw ?,?
data ends

code segment
	assume cs:code,ds:data
start:
	mov ax,data
	mov ds,ax

	;将新中断服务程序直接复制到地址0000:0200,此处不再向操作系统申请内存
	mov cx,offset doend - offset dostart
	mov si,offset dostart
	mov ax,seg dostart
	mov ds,ax
	mov ax,0000h
	mov es,ax
	mov di,0200h
	cld
	rep movsb

	mov ax,0
	mov es,ax
	
	;保存原中断地址
	mov ax,es:[0*4]
	mov addr[0],ax
	mov ax,es:[0*4+2]
	mov addr[2],ax
	

	;写入新中断地址
	cli
	mov word ptr es:[0*4],0200h
	mov word ptr es:[0*4+2],0000h
	sti	

	;产生除法溢出0号中断
	mov ax,0ffffh
	mov bh,1
	div bh

	mov ah,4ch
	int 21h

dostart:
	;显示字符串overflow!
	mov ax,data
	mov ds,ax
	
	;以下注释的部分是调用DOS功能调用在屏幕上打印字符串
	;mov dx,offset hint
	;mov ah,9
	;int 21h

	;直接向显存b8000:bffff内写入内容,也可以在屏幕上显示
	mov si,offset hint
	mov ax,0b800h
	mov es,ax
	mov di,12*160+36*2   ;设置在屏幕中央显示
	mov cx,9
again:
	mov al,[si]
	mov es:[di],al
	inc si
	add di,2
	loop again
	
	
	;将原中断服务程序地址写回
	cli
	mov ax,0
	mov es,ax
	mov ax,addr
	mov es:[0*4],ax
	mov ax,addr[2]
	mov es:[0*4+2],ax
	sti
	
	;程序退出
	mov ah,4ch
	int 21h
doend:
	nop
	
code ends
	end start

 

三、结果截图

 

四、代码中提到了两种打印overflow!方法。

1、DOS的功能调用-int 21h,利用其中的9号功能即可打印。其中,要将要打印的内容的首地址放到

ds:dx中,并且要打印的字符串要以$结尾。

2、直接要显存空间写数据,写入的数据会显示在屏幕上。

注:如果对显存不了解的可以到这里查看显存介绍及编程

 

 

STM32F4_DMA直接存储器详解 正如中断一样,CPU处理的事务也有轻重缓急之分,有些事情对于CPU来说并不是那么重要,比方说转移数据、存储数据、复制数据,如果通过其他功能去处理这些事,而让原本应该处理这些事件的CPU转而去处理更加重要、复杂的事务,是不是可以更好的利用CPU资源呢?单纯的ADC是可以独立进行工作的,并且通过中断服务函数获取每次采样的值,每次采样完毕后存储到数据寄存器中,但是ADC有一个致命的缺陷,也可以是不足,就是ADC每次转换得到的结果会覆盖上一次的值。达到阈值级别后,FIFO的内容便会移出,并存储到目标中。 阅读详情

相关推荐

嵌入式USB EHCI驱动开发:中断处理与数据结构实战解析

在嵌入式系统开发中,USB主机控制器是实现设备与外部世界高速、稳定通信的核心组件。其工作原理基于一套精密的硬件状态机和内存数据结构,驱动软件通过构建与管理这些结构来调度数据传输。理解中断处理机制,如中断源的分类、阈值调度以及服务流程,是保障系统实时性与效率的关键。掌握队列头(dQH)和传输描述符(dTD)等核心数据结构的内存布局、对齐要求及链式管理,则是实现可靠数据搬运的基础。这些底层技术对于开发高性能、高可靠的USB设备驱动至关重要,尤其在工业控制、数据采集等对稳定性和实时性要求严苛的嵌入式应用场景中。本

weixin_33168937的博客 247

汇编语言(王爽)12章0号中断处理

除法溢出会导致0号中断,要求0号中断时在屏幕上显示"DIV Overflow!",并返回dos。 assume cs:code,ss:stack;,ds:data ;data segment注释掉的话不注释ds:data会报错 ;data segment ; db 'DIV Overflow!',0 ;data ends stack segment db 16 dup(0) stack ...

weixin_43292547的博客 367

瑞萨RX微控制器RSCI FIT驱动配置与中断处理实战指南

串行通信接口(SCI)是嵌入式系统中微控制器与外部设备进行数据交换的基础,其核心原理是通过异步或同步时序实现数据的逐位传输。在嵌入式开发中,稳定高效的串行通信对于系统性能至关重要,而直接操作硬件寄存器往往带来时序控制和错误处理的复杂性。瑞萨电子的FIT(Firmware Integration Technology)驱动通过硬件抽象和模块化设计,将复杂的RSCI(可编程串行通信接口)硬件操作封装为清晰的API,显著提升了代码的可维护性和可移植性。该驱动的技术价值在于支持UART、SPI等多种模式,并内置了F

weixin_34161032的博客 381

汇编语言案例:编译处理0号中断

——王爽 《汇编语言(第3版)》实验12 清华大学出版社 案例: 改变0号中断程序的功能,重新编写一个0号中断程序,它的功能是在屏幕中间显示“overflow!”。 一、什么叫中断,什么叫0号中断? 任何一个通用CPU,可以在执行完当前正在执行的指令之后,检测到CPU外部发送过来的(外中断)或者内部产生的(内中断)一种特殊信息,并且可以对所接收的信息进行处理,这种特殊的信息,叫做中断信息。 什么情况的发生会产生中断信息? (1)除法溢出,比如,执行div指令产生的除法溢出。 (2)单步执行。 (3)执

weixin_43323027的博客 1753

从硬件到内核:USB热插拔的防抖设计与中断处理实战

本文深入探讨USB热插拔的硬件设计与内核中断处理机制,重点分析信号抖动问题及防抖解决方案。通过实战案例和代码解析,详细介绍了如何通过延迟工作队列实现VBUS信号防抖,优化DWC3控制器事件处理,提升系统稳定性和用户体验。

butter的博客 766

通过中断类型码求中断入口地址

表的地址位于内存的0000:0000到0000:03FFH(即0段的0000到03FFH) 大小1KB,共256个入口。假设中断类型码16H,求中断程序入口地址?每个入口占用4个单元,一次为CS:IP ,低字节为段内偏移地址,高字节为段基址。下面高,上面低,高地址放高位,低地址放低位。然后去 58H,59H,60H,61H中取数据。61H 里面的内容是 44H。58H 里面的内容是 11H。59 H里面的内容是 22H。60H 里面的内容是 33H。假设它们中的数据分别是。...

学习笔记 2万+

操作系统零碎知识点系列之二

1.解释中断向量 向量就是确定确切位置的含义,中断向量的含义是可以确定中断服务程序的位置。 中断向量就是中断处理程序的首地址。每个向量长度为4字节。 地址以低位2字节存储偏移量,高位2字节存储段地址。 2.解释中断类型码 把每个中断服务程序进行编号,一个号代表一个中断服务程序,就...

938

Linux中断处理程序的编写和调试

中断处理函数的定义需要遵循特定的函数签名。它通常返回类型,并接收两个参数:中断号和设备标识符。// 处理中断事件// ...// 或者 IRQ_NONEirq:中断号。dev_id:设备标识符,用于共享中断。编写和调试Linux中断处理程序需要理解中断机制、内核API以及一些调试技巧。本文详细介绍了如何编写中断处理函数、注册和注销中断处理程序,以及如何使用打印调试和调试文件系统进行有效调试。通过这些知识和实践,你能够更好地编写和调试内核驱动程序中的中断处理代码,提高系统的响应和稳定性。

小灰灰的博客 324

NASM汇编语言与计算机系统10-中断向量表0号中断(clistiirethlt)

0号中断也被成为除法错误中断,本文将演示发生触发错误之后,走我们自己的代码,在屏幕上显示ByZero 中断 可屏蔽中断: 程序执行时,可以被其他事件打断,例如鼠标,键盘等事件,这种事件叫做中断,这种中断是可以被禁止的,因为如果CPU有更重要的事情要做,那么就可以让键盘和鼠标等中断无效,可屏蔽中断的信号是通过CPU的INTR引脚传递的 不可屏蔽中断: 程序执行时候,如果有不可抗拒的事件发生,那么这个中断原则上是不应该被屏蔽的,应该随时有效,例如低电量警告,不可屏蔽中断的信号是通过CPU的NMI引脚传递的 笔

m0_59092234的博客 758

嵌入式系统多按键中断处理实战

多按键中断是指在同一个中断系统中,当多个按键几乎同时被按下时,系统能够准确识别并响应每个按键动作的技术。在传统单按键中断中,系统只能处理一个按键事件。而多按键中断技术则允许系统同时处理多个按键事件,甚至是在同一时间发生的多个按键事件。这种技术的核心在于中断管理器的高效处理能力以及消抖技术的合理运用。其中,消抖技术能够有效区分按键的真实意图与偶然的误触,确保系统稳定响应按键信号。多按键中断广泛应用于需要同时处理多个输入信号的系统中。

weixin_32836713的博客 707

从Ring3切换到Ring0的代码实现与分析

本文还有配套的精品资源,点击获取 简介:Ring3和Ring0是处理器的特权级别,定义了程序对系统资源的访问权限。从Ring3切换到Ring0是进行系统调用或驱动程序开发时的关键步骤。本课程设计项目提供了从Ring3切换到Ring0的代码实现,涵盖了中断、系统调用、特权检查、保护环结构、寄存器状态和返回机制等知识点。通过分析代码,学生将深入理解操作系统原理、内核编程和驱动开...

weixin_35753431的博客 1525

Arm 中断处理

S3C2440 中断处理 ARM 有

zhuzhiqi11的专栏 757

多视图学习 (Multi-View Learning)

多视角/多视图学习(Multi-view learning)是陶大成提出的一个研究方向。我们都知道,在机器学习中样本可以用不同的特征(如图片可以用LBP、SIFT等特征)来表示,或者从不同的角度进行观察(如从前后左右观察一个对象),甚至是采用不同的传感器来观测(如RGB摄像头,Depth摄像头),这些不同的观测手段、角度或特征在多视角学习中称为“视角”。多视角学习通过对不同的视角进行统一分析和研究,希望能够得到更好的分类或聚类等等的效果。

CarpeDiem 3万+

【实时Linux实战系列】实时I/O操作与中断处理

实时Linux中的I/O操作与中断处理是实现高效硬件交互的关键技术。文章介绍了实时系统的特性、中断处理机制和I/O操作方式,包括内存映射I/O和DMA传输。通过GPIO中断处理和DMA I/O操作两个具体案例,展示了开发实践步骤与代码实现。文中还提供了环境配置指南、常见问题解决方案及性能优化建议,适用于工业自动化、机器人控制等需要严格实时响应的领域。掌握这些技术能显著提升系统实时性和可靠性,满足复杂场景下的硬件交互需求。

望获实时Linux系统 882

Gemma 4 12B QAT+MTP小显存部署实战指南

大语言模型本地部署的核心瓶颈在于显存与推理效率的平衡。量化感知训练(QAT)通过在训练阶段模拟低精度计算,显著提升模型对INT4量化的鲁棒性;多令牌预测(MTP)则通过并行解码优化KV Cache复用,降低GPU kernel调用频次。二者协同可在8GB显存设备上稳定运行12B级模型,兼顾精度、速度与上下文长度。该方案适用于开发者本地AI助手、技术文档生成、SQL翻译等轻量但高交互需求场景,是当前Windows环境中小显存高效落地Gemma系列模型的工程最优解。

weixin_30934229的博客 377

基于Java+SpringBoot+Vue的中小企业设备管理系统的设计与开发(源码+lw+部署文档+讲解等)

💗博主介绍:✌新人博主,工作经验两年+、专注于Java、小程序技术领域和毕业项目实战✌💗🌟文末获取源码+数据库🌟

2301_76502068的博客 1385

硬件中断请求号和lspci命令查看到的device id有关系吗?

这是我忽然想到的一个人问题硬件中断请求号(IRQ)与lspci命令查看到的设备ID(Device ID)​,但两者在系统硬件管理中通过以下方式间接关联。

weixin_36476763的博客 824

积木报表导出数据量太大报错

‌性能问题‌:‌当数据量非常大时,‌积木报表在导出过程中可能会遇到性能瓶颈,‌导致导出过程缓慢甚至失败。‌解决这一问题的方法包括优化SQL查询、‌调整分页大小、‌使用更适合处理大量数据的库(‌如阿里巴巴的EasyExcel)‌进行导出,‌或者采用异步处理的方式来避免接口超时1。‌内存溢出‌:‌如果报表工具或其依赖的库不支持流式(‌分批)‌导出,‌大量数据的处理可能会导致内存溢出。‌数据处理方式‌:‌如果待导出的数据包含特殊字符,‌如英文双引号或等号,‌这可能导致JSON反序列化报错。

Activiti工作流 1908

FreeRTOS在边缘计算中的异步通信与中断处理艺术

本文深入探讨FreeRTOS在边缘计算中的异步通信与中断处理高级实践。通过队列机制优化、中断服务程序设计和Tickless低功耗模式,显著提升多传感器数据采集场景下的实时性能和能效,为工业物联网应用提供可靠解决方案。

w7x8y9z的博客 131

LVGL 组件对齐方式说明

本文说明 LVGL(以 v8 为例)中常用的 lv_align_t对齐选项的含义与用法,对应界面设计工具里下拉列表中的以及等命名。

摸鱼专家 133

Android SurfaceFlinger——概述(一)

对于系统渲染流程的理解是指导 SurfaceFlinger 设计的核心思想,从 Android 4.1 一直到 Android 9.0 都没有太大的变化。只要抓住这五个核心思想,我们阅读 SurfaceFlinger 的难度就会下降不少。下面看一下 SurfaceFlinger 的体系和 Skia 以及 View的绘制流程的关系。framework 面向开发者所有的 View 是便于开发的控件,里面仅仅只是提供了当前 View 各种属性以及功能。

小旭的专栏 2584

操作系统之系统调用

1.什么是系统调用 应用程序通过系统调用请求操作系统服务 应用程序不能直接申请系统资源,必须通过系统调用的方式向操作系统提出服务请求,由操作系统代为完成。这样保证了系统的稳定性和安全性。 系统调用分为 设备管理,文件管理,进程控制,进程通信,内存管理 系统调用的相关处理都是在核心态下的 2. 系统调用与库函数的区别 库函数可能是封装好的系统调用,也可能不涉及系统调用。应用程序可能发出系统调用,...

yrx420909的博客 4171

手把手教你学Simulink--基于储能系统的建模与仿真场景:-锂电池储能系统充放电管理策略仿真

《锂电池储能系统充放电管理的Simulink建模与仿真》摘要 本文详细介绍了使用Simulink+SimscapeElectrical对锂电池储能系统进行充放电管理策略建模的全过程。从系统结构设计入手,重点阐述了锂电池模型、充放电控制器、热管理系统等核心模块的搭建方法,并提供了完整的仿真流程。文章详细说明了如何实现荷电状态管理、温度控制和功率限制等关键策略,通过仿真分析了电池电压、电流、SoC和温度等关键指标的变化规律。最后提出了基于仿真结果的优化建议,包括参数整定、算法改进等方面,为锂电池储能系统的安全高

MHD0815的博客 1万+

DMA存储器到外设传输的安全性与中断处理机制

深入解析dma在存储器到外设传输中的安全性设计与中断处理流程,探讨dma通道配置中的风险控制与异常响应策略,提升系统稳定性与数据完整性。

weixin_30476025的博客 695

华为OD机试双机位C卷:日志排序 (Py/C/C++/Java/Js/Go)

华为OD机试双机C卷真题【日志排序】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试-日志排序。

qq_45776114的博客 1754

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Linux基础 | 系统调用

目录概念系统调用缺点系统调用原理特权级与中断基于int的linux系统调用实现触发中断切换堆栈中断处理程序 概念 现代操作系统中程序本身没有多少权利访问系统资源,为了保护系统资源,OS会组织程序直接访问系统资源,比如文件、网络、IO、各种设备等。 但是有些场景不借助OS没法很好地办到,比如让程序等待一段时间,如果借助OS,我们可以用sleep(),但是要是自己写的话,可能就是如下这样: for(int i=0;i<1000000;i++); 可以是可以,但是这样会浪费CPU时间。特别是这段程序在不同

qq_40291234的博客 302

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

上一篇: 第四篇 操作80*25彩色字符显示缓冲区
下一篇: 第六篇 键盘中断与应用程序读取键盘缓冲区
lulipeng_cpp
博客等级 码龄15年 169粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值