第五篇 直接面向系统资源的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

手把手教你配置MAX96712解串器:从I2C地址分配到PWM帧同步

本文详细解析了MAX96712解串器在自动驾驶视觉链路中的核心配置流程。从I2C地址分配、GMSL2数据流映射到实现多摄像头精准同步的PWM帧同步触发,手把手指导工程师构建高可靠性的图像传输系统,并提供了实用的Linux调试技巧与问题排查思路。

weixin_29297127的博客 927

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

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

望获实时Linux系统 882

MCGS 和 200SMART 时间同步

在实际应用中,PLC经常会因为断电原因,导致时间不准确。假设我们设置了一个投加泵,每天8-18点投加。屏幕上显示的时间和PLC内部的时间,很可能不一样。所以需要在触摸屏上读取PLC的时间,并且提供设置功能。

mmxxoo_xxmmp的博客 1522

UVM概述及uvm_component和uvm_object(一)

UVM:Universal Verification Methodology(通用验证方法学) UVM:是建立在systemverilog平台上的一个库,提供了一系列的接口,让我们能够更方便的进行验证。验证平台组成: Driver:用来把不同的激励施加给DUT; Monitor:用来检测DUT的输出; Scoreboard:专门用来比较期望值与monitor检测到的DUT输出; Refer

南国之邱 1万+

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

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

weixin_36476763的博客 824

802.1AS时间同步机制深度解析:从Sync报文到多域冗余设计

本文深度解析了802.1AS时间同步机制,从Sync与Follow_Up报文的核心交互原理入手,详细阐述了其如何通过精确的时钟频率比测量、链路延迟计算和驻留时间补偿来实现微秒乃至纳秒级同步。文章进一步探讨了802.1AS-2020版本引入的多时钟域冗余设计,为构建高可靠的车载TSN网络提供了关键见解和实战配置指南。

pytorch8learner的博客 464

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

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

w7x8y9z的博客 131

cs188Inference in Bayes Nets(贝叶斯网络的推理)

cs188Inference in Bayes Nets贝叶斯网络的推理Question1(3 points):Bayes Net StructureQuestion2(1 points):Bayes Net ProbabilitiesQuestion 3(5 points):Join FactorsQuestion4(4 points):EliminateQuestion5(4 points):NormalizeQuestion 6(4 points):Variable EliminationQuesti

weixin_46582817的博客 1674

保姆级教程:用COMSOL LiveLink™ for MATLAB 玩转自定义PDE,从理论到仿真一条龙

本文详细介绍了如何利用COMSOL LiveLink™ for MATLAB实现自定义PDE的从理论到仿真的完整流程。通过PDE模块与MATLAB的无缝集成,用户可以灵活处理非标准偏微分方程,适用于材料建模、传热传质验证等多物理场耦合研究。教程涵盖环境配置、方程标准化、界面操作及高级应用技巧,为工程仿真研究者提供原子级控制方案。

weixin_34098209的博客 358

操作系统之系统调用

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

yrx420909的博客 4171

Python 爬虫实战:全球咖啡期货市场数据采集与分析全攻略

通过本项目,我们实现了对全球咖啡期货市场数据的采集、处理和可视化,为市场分析和决策支持提供了数据基础。未来,可以进一步结合机器学习和深度学习技术,对咖啡期货价格进行预测和建模,提高市场分析的准确性和效率。

2201_76125261的博客 396

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

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

weixin_30476025的博客 695

使用Open3D进行RGB-D图像点云处理

在本文中,我们将使用Open3D来处理RGB-D图像,提取点云并进行一些基本的操作。总结起来,本文介绍了如何使用Open3D库处理RGB-D图像并提取点云。我们展示了如何读取RGB-D图像,创建RGB-D图像和点云,并显示点云。除了显示点云,Open3D还提供了许多其他功能,如点云滤波、点云配准、表面重建等。在创建RGB-D图像时,我们需要指定深度图像的缩放因子和截断值,以及是否将RGB图像转换为强度图像。希望本文能够帮助您入门Open3D,并在处理RGB-D图像和点云数据时提供一些指导。

QfcaLinux的博客 446

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

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

Linux基础 | 系统调用

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

qq_40291234的博客 302

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值