linux0.12-8-2-asm.s

news2024/11/24 12:12:25

[290页]

8-2 asm.s程序

8-2-1 功能描述

1、 我们先考虑c)、 d)
在这里插入图片描述
2、无出错码
2.1、 将要执行的处理函数压栈;
2.2、 eax被交换入栈。现在eax=护理函数
2.3、 其他寄存压栈
2.4、 立即数0压栈
2.5、 取edx=EIP后,将edx压栈
2.6、 段寄存器都设置0x10段选择符
2.7、 调用处理函数(eax)
2.8、 去掉(2.4和2.5)数据
2.9、 弹出所有寄存
2.10、 返回到应用程序

3、 有出错码
3.1、 将要执行的处理函数压栈;
3.2、 出错码与eax交换;
3.3、 处理函数与ebx交换;
3.4、 其他寄存器压栈;
3.5、 将eax(错误码)压栈;
3.6、 取eax=EIP后,将eax压栈
3.7、 段寄存器都设置0x10段选择符
3.8、 调用处理函数(ebx)
3.9、 去掉(2.4和2.5)数据
3.10、 弹出所有寄存
3.11、 返回到应用程序

8-2-2 代码注释

/*
 *  linux/kernel/asm.s
 *
 *  (C) 1991  Linus Torvalds
 */

/*
asm.s程序中包括大部分的硬件故障(或出错)处理的低层次代码。
页异常由内存管理程序mm处理,所以不在这里。此程序还处理(希望是这样)由于TS-位而
造成的fpu异常,因为fpu必须正确地进行保存/恢复处理,这些还没有测试过。
*/

#本代码文件主要涉及对Intel保留中断int0--int16的处理(int17-int31留作今后使用)。
#以下是一些全局函数名的声明,其原形在traps.c中说明。
.globl _divide_error,_debug,_nmi,_int3,_overflow,_bounds,_invalid_op
.globl _double_fault,_coprocessor_segment_overrun
.globl _invalid_TSS,_segment_not_present,_stack_segment
.globl _general_protection,_coprocessor_error,_irq13,_reserved
.globl _alignment_check

#下面这段程序处理无出错号的情况。
#int0 -- 处理被零除出错的情况。 类型:错误; 无错误码。
#在执行DIV或IDIV指令时,若除数是0,CPU就会产生这个异常。当EAX(或AX、AL)容纳
#不了一个合法除操作的结果时,也会产生这个异常。21行标号'_do_divide_error'实际上是
#C语言函数do_divide_error()编译后所生产模块中对应的名称。函数'do_divide_error'
#traps.c中实现。
_divide_error:
	pushl $_do_divide_error		#首先把将要调用的函数地址入栈。
no_error_code:					#这里是无出错号处理的入口处,见下面第56行等。
	xchgl %eax,(%esp)			#_do_divide_error的地址->eax,eax被交换入栈。
	pushl %ebx
	pushl %ecx
	pushl %edx
	pushl %edi
	pushl %esi
	pushl %ebp
	push %ds					#!!16位的段寄存器入栈后也要占用4个字节。
	push %es
	push %fs
33	pushl $0					# "error code" #将数值0作为出错码入栈。
34	lea 44(%esp),%edx			#取有效地址,即栈中原调用返回地址处的栈指针位置。
35	pushl %edx					#并压入堆栈。
	movl $0x10,%edx				#初始化段寄存器ds、es和fs,加载内存数据段选择符。
	mov %dx,%ds
	mov %dx,%es
	mov %dx,%fs
#下面上的'*'号表示调用操作数指定地址处的函数,称为间接调用。这句的含义是调用引起本次异常
#的C处理函数,例如do_divide_error()等。第41行是将堆栈指针加8相当于执行2次pop操作,
#弹出(丢弃)最后入堆栈的两个C函数(33行和35行入栈的值),让堆栈指针重新指向寄存器
#fs入栈处。
	call *%eax
41	addl $8,%esp
	pop %fs
	pop %es
	pop %ds
	popl %ebp
	popl %esi
	popl %edi
	popl %edx
	popl %ecx
	popl %ebx
	popl %eax			#弹出原来eax中的内容。
	iret

#int1 -- debug调试中断入口点。处理过程通上。类型:错误/陷阱(Fault/Trap);无错误码。
#当eflags中TF标志置位时而引发的中断。当发现硬件断电(数据:陷阱,代码:错误),或者
#开启了指令跟踪陷阱或任务交换陷阱,或者调用寄存器访问无效(错误),CPU就会产生该异常。
_debug:
	pushl $_do_int3		# _do_debug #C函数指针入栈。以下同。
	jmp no_error_code

#int2 -- 非屏蔽中断调用入口点。 类型:陷阱; 无错误码。
#这是仅有的被赋予固定中断向量的硬件中断。每当接收到一个NMI信号,CPU内部就会产生中断
#向量2,并执行标志中断应答周期,因此很节省时间。NMI通常保留为极为重要的硬件时间使用。
#当CPU收到一个NMI信号并且开始执行其中断处理过程时,随后所有的硬件中断都将被忽略。
_nmi:
	pushl $_do_nmi
	jmp no_error_code
#int3 -- 断点指令引起中断的入口点。 类型:陷阱; 无错误码。
#由int 3指令引发的中断,与硬件中断无关。该指令通常由调试器插入被调试程序的代码中。
#处理过程通_debug。
_int3:
	pushl $_do_int3
	jmp no_error_code
#int4 -- 溢出出错处理中断入口点。 类型:陷阱; 无错误码。
#EFLAGS中OF标志置位时CPU执行INTO指令就会引发该中断。通常用于编译器跟踪算术计算溢出。
_overflow:
	pushl $_do_overflow
	jmp no_error_code

#int5 -- 边界检查出错中断入口点。 类型:错误;无错误码。
#当操作数在有效范围以外时引发的中断。当BOUND指令测试失败就会产生该中断。
#BOUND指令有3个操作数,如果第1个不在另外2个之间,就产生异常5
_bounds:
	pushl $_do_bounds
	jmp no_error_code

#int6 -- 无效操作指令出错中断入口点。 类型:错误;无错误码。
#CPU执行机构检测到一个无效的操作码而引起的中断。
_invalid_op:
	pushl $_do_invalid_op
	jmp no_error_code

#int9 -- 协处理器段超出出错中断入口点。 类型:放弃;无错误码。
#该异常基本上等同于协处理器出错保护。因为在浮点指令操作数太大时,我们就有这个机会来加载或
#保存超出数据段的浮点值。
_coprocessor_segment_overrun:
	pushl $_do_coprocessor_segment_overrun
	jmp no_error_code

#int15 -- 其他Intel保留中断的入口点。
_reserved:
	pushl $_do_reserved
	jmp no_error_code

#int45 -- (0x20+13)Linux设置的数学协处理器硬件中断。
#当协处理器执行完一个操作是就会发出IRQ13中断信号,以通知CPU操作完成。80387在执行计算
#时,CPU会等待其操作完成。下面89行上0xF0是协处理器端口,用于清忙锁存器。通过写该端口,
#本中断将消除CPU的BUSY延续信号,并重新激活80387的处理扩展请求引脚PEREQ。
#该操作主要是为了确保在继续执行8038的任何指令之前,CPU响应本中断。
_irq13:
	pushl %eax
	xorb %al,%al
89	outb %al,$0xF0
	movb $0x20,%al
	outb %al,$0x20
	jmp 1f
1:	jmp 1f
1:	outb %al,$0xA0
	popl %eax
	jmp _coprocessor_error

#以下中断在调用时CPU会在中断返回地址之后将出差号压入堆栈,
#因此返回时也需要将出错号弹出。

#int8 -- 双出错故障。 类型:放弃;有错误码。
#通常当CPU在调用前一个异常的处理程序而又监测到偶一个新的异常时,这两个异常会被串行地进行
#处理,但也会碰到很少的情况,CPU不能进行这样的串行处理操作,此时就引发该中断。
_double_fault:
	pushl $_do_double_fault		
error_code:
	xchgl %eax,4(%esp)		# error code <-> %eax
	xchgl %ebx,(%esp)		# &function <-> %ebx
	pushl %ecx
	pushl %edx
	pushl %edi
	pushl %esi
	pushl %ebp
	push %ds
	push %es
	push %fs
	pushl %eax			# error code
	lea 44(%esp),%eax		# offset
	pushl %eax
	movl $0x10,%eax
	mov %ax,%ds
	mov %ax,%es
	mov %ax,%fs
	call *%ebx
	addl $8,%esp
	pop %fs
	pop %es
	pop %ds
	popl %ebp
	popl %esi
	popl %edi
	popl %edx
	popl %ecx
	popl %ebx
	popl %eax
	iret

#int10 -- 无效的任务状态段(TSS)。 类型:错误;有错误码。
#CPU企图切换到一个进程,而该进程的TSS无效。根据TSS中那一部分引起异常,当由于TSS
#长度超过104字节时,这个异常在当前任务产生,因而切换被终止。其他问题则会导致在切换
#后的新任务中产生异常。
_invalid_TSS:
	pushl $_do_invalid_TSS
	jmp error_code

#int11 -- 段不存在。 类型:错误;有错误码。
#被引用的段不在内存中。段描述符中标志着段不在内存中。
_segment_not_present:
	pushl $_do_segment_not_present
	jmp error_code

#int12 -- 堆栈段错误。 类型:错误;有错误码。
#指令操作试图超出堆栈段范围,或者堆栈段不在内存中。这是异常1113的特例。
#有些 操作系统可以利用这个异常来确定什么时候应该为程序分配更多的栈空间。
_stack_segment:
	pushl $_do_stack_segment
	jmp error_code

#int13 -- 一般保护性出差。 类型:错误;有错误码。
#表面是不属于任何其他类的错误。若一个异常产生时没有对应的处理向量(0--16),
#通常就会归到此类。
_general_protection:
	pushl $_do_general_protection
	jmp error_code
#int17 -- 边界对齐检查出错。
#在启用了内存边界检查时,若特权级3(用户级)数据非边界对齐时会产生该异常。

_alignment_check:
	pushl $_do_alignment_check
	jmp error_code

剩下中断

#int7 -- 设备不存在(_device_not_available)在kernel/sys_call.s,158行。
#int14 -- 也错误(_page_fault)在mm/page.s,14行。
#int16 -- 协处理器错误(_coprocessor_error)在kernel/sys_call.s,140
#时钟中断int 0x20(_timer_interrupt)在kernel/sys_call.s,189行。
#系统调用int 0x80(_systme_call)在kernel/sys_call.s,84行。

8-2-3 Intel保留中断向量的定义。

看赵老师表。
表8-2 给出了Intel保留中断向量具体含义的说明。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/472488.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

通过身份个性化网络(IPM)实现真实世界的自动化妆

来源&#xff1a;投稿 作者&#xff1a;小灰灰 编辑&#xff1a;学姐 论文标题&#xff1a; Real-World Automatic Makeup via Identity Preservation Makeup Net 论文链接&#xff1a;https://www.ijcai.org/proceedings/2020/0091.pdf论文代码&#xff1a;https://github.co…

XRSPACE 总经理刘冠廷:元宇宙行业如何通过 2D、3D 联动,实现高速用户增长?

序言&#xff1a; 元宇宙领域创业并非坦途&#xff0c;似乎已经成为了行业共识。 即使到今天&#xff0c;VR/AR 领域的装备开支和上手学习成本居高不下&#xff0c;全球整体用户体量相比移动互联网也仍属早期阶段。 在这样的背景下&#xff0c;元宇宙公司如何持续且快速地获…

python毕业设计之django+vue流浪宠物动物救助领养网站

开发语言&#xff1a;Python 框架&#xff1a;django Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm 网站前台&#xff1a; 站内新闻&#xff1a;针对网站的新闻信息进行展示&#xff0c;能够展示…

简单聊聊Echarts伪3D地图实现的相关配置

知识和技能真的是用进废退&#xff0c;还是得多实践&#xff0c;才不至于遗忘。 目录 前言 二、实现原理 三、从0开始实现 1.目录结构 2.地图JSON数据获取 3.具体实现&#xff0c;重头戏 3.一些常见问题的解决方法 总结 前言 本文简单来聊一聊Echarts伪3D地图的实现&a…

Java面试被问Spring哑口无言?100道Spring面试考点解析

对于开发同学来说&#xff0c;Spring 框架熟悉又陌生。 熟悉&#xff1a;开发过程中无时无刻不在使用 Spring 的知识点&#xff1b;陌生&#xff1a;对于基本理论知识疏于整理与记忆。导致很多同学面试时对于 Spring 相关的题目知其答案&#xff0c;但表达不够完整准确。今天展…

UE4蓝图学习篇(八)-- 角色基础移动

在C学习篇中有介绍如何使用UE4C去处理角色的基础移动&#xff0c;那么本篇介绍使用蓝图去处理角色的基础移动。 1、创建Character类&#xff1b; 添加一个SpringArmComponent组件&#xff0c;在其下方添加一个CameraComponent组件能够看到角色&#xff0c;SpringArmComponent的…

奥斯汀独家对话|从机构的「拉扯」中成长的美国加密监管

‍前言 4月25日&#xff0c;在美国得克萨斯州的首府奥斯汀&#xff0c;这座充满活力和创造力的城市&#xff0c;欧科云链研究院与来自哥伦比亚商学院的Austin Campbell教授就美国加密监管以及其相关话题进行了一次深入探讨。双方讨论了美国整体的监管问题、监管逻辑、最新的稳…

华为孟晚舟当值首秀:2030年AI算力将增长500倍!

作者 | 范智林 来源 | 华商观察 微信号&#xff1a;HuashangGC 孟晚舟当值首次亮相。 4月19日&#xff0c;华为副董事长、轮值董事长、CFO孟晚舟在华为第20届全球分析师大会上进行演讲&#xff0c;这是她当值华为轮值董事长以来的首次公开亮相。 按照华为内部规定&#xff0c…

展会预告 | 昂视诚邀您届时莅临CIBF2023深圳国际电池展

CIBF2023深圳国际电池展将于5月16日在深圳国际会展中心&#xff08;宝安新馆&#xff09;举行&#xff0c;作为国际电池行业规模最大的会展活动&#xff0c;它是了解电池行业的重要窗口&#xff0c;也是中国电池产业链企业连接全球产业界的重要桥梁和平台。 昂视作为制造自动化…

一文彻底分清ARM架构、内核、指令集等相关概念

任何学习嵌入式/单片机的朋友都绕不开ARM&#xff0c;但初学者总是对ARM架构、内核、指令集等相关概念不够清晰或者混淆&#xff0c;本文帮助入门的朋友彻底弄清楚。 目录 1.芯片、CPU、SOC 2.ARM公司 3.ARM架构与内核、指令集 3.1架构与内核 3.2架构与指令集 4.ARM架构…

操作系统——概述

目录 1.1初识操作系统 思考题&#xff1a; 1.2操作系统的功能和定义 思考题&#xff1a; 1.3操作系统发展史 思考题&#xff1a; 1.4分时技术 思考题&#xff1a; 1.5典型操作系统类型 1.1初识操作系统 常见桌面级别的四大操作系统&#xff1a;Windows、Mac OS、Linu…

swift 技术 音频

一直觉得自己写的不是技术&#xff0c;而是情怀&#xff0c;一个个的教程是自己这一路走来的痕迹。靠专业技能的成功是最具可复制性的&#xff0c;希望我的这条路能让你们少走弯路&#xff0c;希望我能帮你们抹去知识的蒙尘&#xff0c;希望我能帮你们理清知识的脉络&#xff0…

【测试开发】单元测试、基准测试和性能分析(以 Go testing 为例)

一、为什么需要测试&#x1f914;️ 你写不出 bug-free 的代码。你认为自己写出了 bug-free 的代码&#xff0c;但它在你意想不到的地方出错了。你觉得自己写出了永不出错的代码&#xff0c;但它的性能十分糟糕。 二、在开发过程中做好测试&#xff08;理想情况下&#xff09;…

PLC模糊PID模糊规则矩阵(梯形图语言实现)

博途PLC的模糊PID控制详细内容请查看下面的博客文章: Matlab仿真+博途PLC模糊PID控制完整SCL源代码参考(带模糊和普通PID切换功能)_博途怎么实现模糊pid_RXXW_Dor的博客-CSDN博客模糊PID的其它相关数学基础,理论知识大家可以参看专栏的其它文章,这里不再赘述,本文就双容…

mysql实现存在则保存,不存在则更新

方式1 ON DUPLICATE KEY UPDATE 使用前提&#xff1a;表必须配置唯一键或者主键&#xff0c;且保存的字段中包含该键【重点】 原理&#xff1a; ON DUPLICATE KEY UPDATE如果配合主键&#xff0c;存在数据a&#xff0c;新插入b&#xff0c;如果主键不冲突&#xff0c;会保存b…

[React] useRef用法和特性

useRef 与 useState 的区别 一般在使用react-hook的时候&#xff0c;我们用到最多的就是定义变量&#xff0c;以及对应的修改变量 下面是一个最基本的 react-hook 应用程序 const Home () > {const [username, setUserName] useState();return &#xff08;<input va…

【物联网】物1— 初步认识MQTT、连接到MQTT服务端

目录 一、MQTT是什么 二、MQTT的版本 两者之间的关系&#xff1a; ​三、MQTT工作的基本原理 3.1、概念 MQTT客户端&#xff1a; MQTT服务端&#xff1a; MQTT主题&#xff1a; 3.2、MQTT订阅/发布主题的特点 相互可独立性&#xff1a; 空间可分离&#xff1a; 时间…

创建第一个DJango3的后端项目

1.安装DJango 需要事先安装python 打开控制台,使用pip命令安装django pip install django如何检验安装成功&#xff1a;在命令行中进入python的环境&#xff0c;导入并打印django的版本信息 2.使用django创建第一个项目 在命令行中进入要存放项目的位置&#xff0c;输入dj…

【mysql】日常遇到的问题解决

目录 MySQL 删除数据库报错 1010 - Error dropping database (cant rmdir) [ERR] 1452 - Cannot add or update a child row: a foreign key constraint fails MySQL 删除数据库报错 1010 - Error dropping database (cant rmdir) 场景复现&#xff1a;navicat中&#xff0c…

Java集合 —— HashMap

一、HashMap是什么 HashMap是一个存储key-value键值对的哈希表&#xff0c;表中每个元素的key都是唯一的&#xff08;通过equals方法判断&#xff09;&#xff0c;查询时通过key的hashcode值即可定位到元素的存储地址&#xff0c;因此HashMap在理想情况下查询时间复杂度为O(1)…