【linux】【操作系统】内核之asm.s源码阅读

news2024/12/30 3:36:25

在这里插入图片描述

asm.s是Linux内核的一部分,主要负责处理各种类型的硬件异常和中断。

  • _divide_error
    处理除法错误中断。当CPU执行除法指令时遇到除数为零的情况,会触发这个中断。此函数首先保存当前的寄存器状态,然后调用_do_divide_error函数来处理具体的错误。处理完毕后,它恢复寄存器的状态并返回中断前的上下文。

  • _debug
    处理调试中断。当运行调试指令如INT 3时,会触发此中断。它通过跳转到_do_int3函数来处理这个中断,_do_int3通常用于调试目的。

  • _nmi
    处理非屏蔽中断(NMI)。NMI是一种不能被处理器屏蔽的中断,常用于系统监控或错误检测。它同样通过跳转到_do_nmi函数来处理中断。

  • _int3
    处理中断3。这通常与调试有关,类似于_debug,但通过直接跳转到_do_int3函数来处理。

  • _overflow
    处理溢出中断。当算术运算的结果超出寄存器能表示的范围时,会触发此中断。它通过调用_do_overflow函数来处理。

  • _bounds
    处理边界检查中断。当访问数组越界时,会触发此中断。它通过调用_do_bounds函数来处理。

  • _invalid_op
    处理无效操作码中断。当遇到CPU不认识的操作码时,会触发此中断。它通过调用_do_invalid_op函数来处理。

  • _coprocessor_segment_overrun
    处理协处理器段越界中断。当协处理器访问超出其权限的内存时,会触发此中断。它通过调用_do_coprocessor_segment_overrun函数来处理。

  • _reserved
    处理保留中断。当遇到未定义的中断类型时,会触发此中断。它通过调用_do_reserved函数来处理。

  • _irq13
    处理IRQ13中断。IRQ13通常用于键盘中断,但在这个上下文中,它似乎用于处理协处理器错误。它首先清除中断信号,然后跳转到_coprocessor_error函数进行处理。

  • _double_fault
    处理双重故障中断。当处理器在处理一个中断时又遇到另一个中断,而这个新的中断无法处理时,会触发此中断。它保存所有寄存器的状态,设置错误代码,然后调用_do_double_fault函数来处理。

  • _invalid_TSS
    处理无效任务状态段(TSS)中断。当尝试切换到一个无效的TSS时,会触发此中断。它通过调用_do_invalid_TSS函数来处理。

  • _segment_not_present
    处理段不存在中断。当尝试访问一个不存在的段时,会触发此中断。它通过调用_do_segment_not_present函数来处理。

  • _stack_segment
    处理栈段中断。当栈段出现错误时,会触发此中断。它通过调用_do_stack_segment函数来处理。

  • _general_protection
    处理通用保护中断。当发生任何违反保护机制的行为时,如访问受限内存,会触发此中断。它通过调用_do_general_protection函数来处理。

每个处理函数都会保存当前的寄存器状态,调用相应的处理函数,然后恢复寄存器状态并返回中断前的上下文。这种设计确保了在处理中断时系统的稳定性和安全性。

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

/*
 * asm.s contains the low-level code for most hardware faults.
 * page_exception is handled by the mm, so that isn't here. This
 * file also handles (hopefully) fpu-exceptions due to TS-bit, as
 * the fpu must be properly saved/resored. This hasn't been tested.
 */

.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

_divide_error:
	pushl $_do_divide_error
no_error_code:
	xchgl %eax,(%esp)
	pushl %ebx
	pushl %ecx
	pushl %edx
	pushl %edi
	pushl %esi
	pushl %ebp
	push %ds
	push %es
	push %fs
	pushl $0		# "error code"
	lea 44(%esp),%edx
	pushl %edx
	movl $0x10,%edx
	mov %dx,%ds
	mov %dx,%es
	mov %dx,%fs
	call *%eax
	addl $8,%esp
	pop %fs
	pop %es
	pop %ds
	popl %ebp
	popl %esi
	popl %edi
	popl %edx
	popl %ecx
	popl %ebx
	popl %eax
	iret

_debug:
	pushl $_do_int3		# _do_debug
	jmp no_error_code

_nmi:
	pushl $_do_nmi
	jmp no_error_code

_int3:
	pushl $_do_int3
	jmp no_error_code

_overflow:
	pushl $_do_overflow
	jmp no_error_code

_bounds:
	pushl $_do_bounds
	jmp no_error_code

_invalid_op:
	pushl $_do_invalid_op
	jmp no_error_code

_coprocessor_segment_overrun:
	pushl $_do_coprocessor_segment_overrun
	jmp no_error_code

_reserved:
	pushl $_do_reserved
	jmp no_error_code

_irq13:
	pushl %eax
	xorb %al,%al
	outb %al,$0xF0
	movb $0x20,%al
	outb %al,$0x20
	jmp 1f
1:	jmp 1f
1:	outb %al,$0xA0
	popl %eax
	jmp _coprocessor_error

_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

_invalid_TSS:
	pushl $_do_invalid_TSS
	jmp error_code

_segment_not_present:
	pushl $_do_segment_not_present
	jmp error_code

_stack_segment:
	pushl $_do_stack_segment
	jmp error_code

_general_protection:
	pushl $_do_general_protection
	jmp error_code


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

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

相关文章

JavaEE 从入门到精通(二) ~SpringMVC 接收请求和设置响应

晚上好&#xff0c;愿这深深的夜色给你带来安宁&#xff0c;让温馨的夜晚抚平你一天的疲惫&#xff0c;美好的梦想在这个寂静的夜晚悄悄成长。 目录 前言 一、获取请求数据 1. 简单参数 1.1 请求行获取参数 a. 与查询参数的名称相同&#xff0c;底层会自动映射到形参中。 …

MySQL笔记(二):创建表

一、创建数据库(create) 按行运行&#xff0c;运行后右键rootlocalhost&#xff0c;刷新可以看到变换。 二、查询数据库&#xff08;show) 三、备份恢复数据库&#xff08;备份到另一个DBMS中去&#xff09; 备份数据库&#xff08;在DOS中执行&#xff09;命令行 mysqldu…

25款拥有炫酷动画效果的创意404错误页面源代码

25款拥有炫酷动画效果的创意404错误页面源代码&#xff0c;一系列具有炫酷动画效果的创意404错误页面&#xff0c;开发者可以利用各种前端技术和工具来实现。 源码免费下载&#xff1a;https://download.csdn.net/download/m0_66047725/89602634 更多资源下载&#xff1a;关注…

【每日力扣中医养生】力扣55. 跳跃游戏

55. 跳跃游戏 文章目录 【每日力扣】力扣55. 跳跃游戏题目描述输入输出示例示例 1示例 2 思路分析代码实现复杂度分析总结 【每日力扣】力扣55. 跳跃游戏 博主写这篇文章的时候已经凌晨1点30分啦。故想分享一下中医的子午觉这一养生技巧&#xff0c;就算真的要熬夜&#xff0…

第一阶段面试问题(前半部分)

1. 进程和线程的概念、区别以及什么时候用线程、什么时候用进程&#xff1f; &#xff08;1&#xff09;线程 线程是CPU任务调度的最小单元、是一个轻量级的进程 &#xff08;2&#xff09;进程 进程是操作系统资源分配的最小单元 进程是一个程序动态执行的过程&#xff0c;包…

Scrapy 爬取旅游景点相关数据(八)重用代理

本期学习&#xff1a;代理的使用与代理池的更新 1 代理IP提取 在Scrapy 爬取旅游景点相关数据&#xff08;六&#xff09;已经讲到了代理的使用&#xff0c;可以先学习这一期再来看本期内容&#xff0c; 第一步是代理IP提取&#xff0c;下面代码就是在中间件初始化的时候去更…

数据库之mysql初体验

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

Nsight-Compute Global Load相关Metric测试

Nsight-Compute Global Load相关Metric测试 1.参考链接2.生成测试用例3.编译4.Profiling并将结果导出到csv文件5.截图 本文使用ptx指令直接从global memory获取数据,了解相关metrics及其计算过程 1.参考链接 PTX Cache OperatorsPTX LD指令Kernel Profiling Guide Caches 2.…

探秘LED显示屏背后的秘密:数字信号与数字电路的奇妙世界

走进繁华的都市&#xff0c;无论是闪烁的霓虹灯下&#xff0c;还是宏大的体育场馆内&#xff0c;LED显示屏以其绚丽的色彩和清晰的画面吸引着我们的目光。但你是否好奇&#xff0c;这些令人惊叹的显示效果背后&#xff0c;隐藏着怎样的科技奥秘&#xff1f;今天&#xff0c;就让…

数据结构初阶-复杂度

复杂度 &#x1f388;1.例题一&#x1f388;2.例题二 &#x1f388;1.例题一 数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个&#xff0c;请编写代码找出那个缺失的整数。 ✅思路1&#xff1a;先冒泡排序&#xff0c;再遍历&#xff0c;当前值1&#xff0c;不等于下一…

Tomato靶机攻略

1、启动靶机 2、通过nmap -sA 192.168.168.0/24得到靶机IP 3、扫描目录 用dirb http://192.168.49.128扫描敏感目录 4、访问敏感目录 5、通过查看源码&#xff0c;发现其存在文件包含漏洞&#xff0c;利用该漏洞查看日志文件 http://192.168.168.131/antibot_image/antibots/…

腾讯云SDK发送短信

腾讯云接口发送短信 &#xff08;1&#xff09;创建签名 &#xff08;2&#xff09;创建模板 可以自定义模板参数例如&#xff1a;你好{1}&#xff0c;这是一个短信 &#xff08;3&#xff09;确认套餐包 发送的额度 &#xff08;4&#xff09;创建应用 查看应用设置&#…

基于深度学习的植物疾病检测识别系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 农作物病害不仅影响产量&#xff0c;还会导致严重的经济损失。传统的病害检测方法通常依赖人工专家进行目视检查&#xff0c;这种方法费时费力且容易受到主观因素的影响。近年来&#xff0c;深度学…

【Unity】3D功能开发入门系列(一)

Unity3D功能开发入门系列&#xff08;一&#xff09; 一、开发环境&#xff08;一&#xff09;安装 Unity&#xff08;二&#xff09;创建项目&#xff08;三&#xff09;Unity 窗口布局 二、场景与视图&#xff08;一&#xff09;场景&#xff08;二&#xff09;游戏物体&…

R语言统计分析——箱线图

参考资料&#xff1a;R语言实战【第2版】 箱线图&#xff08;又称盒须图&#xff09;通过绘制连续型变量的五数总括&#xff0c;即最小值、下四分位数&#xff08;第25百分位数&#xff09;、中位数&#xff08;第50百分位数&#xff09;、上四分位数&#xff08;第75百分位数&…

Linux真实机器安装

引言 装机电脑&#xff1a;具有网卡硬件、磁盘空间 > 64G、内存空间 > 4G&#xff1b; 装机工具&#xff1a;rufus&#xff0c;u盘&#xff08;8G&#xff09;&#xff1b; 装机系统&#xff1a;centos7.iso&#xff1b; 联网工具&#xff1a;路由器&#xff0c;网线 1.…

大学新生如何高效入门编程?全面指南来助力

引言 在当今数字化时代&#xff0c;编程已经成为一项必备技能。无论你未来从事什么职业&#xff0c;编程能力都能为你的职业生涯增添光彩。对于即将步入大学的新生来说&#xff0c;如何高效入门编程是一道关键课题。本文将从如何选择编程语言、制定学习计划、找到顶尖学习资源…

汇昌联信科技拼多多运营如何?

汇昌联信科技拼多多运营如何?在电商行业&#xff0c;拼多多的崛起无疑为许多企业带来了新的机遇。作为一家专注于电子商务解决方案的公司&#xff0c;汇昌联信科技在拼多多的运营方面展现出了不俗的实力。他们不仅成功帮助多个品牌入驻拼多多平台&#xff0c;还通过精细化运营…

缺口将达到1000万?人工智能(AI)专业就业前景分析

从年初以来&#xff0c;人工智能一直占据着热话题榜首。随着人工智能技术的不断发展和应用&#xff0c;人工智能&#xff08;AI&#xff09;专业已经成为了近年来大学校园里最热门的专业之一&#xff0c;成为连续四年新增最多专业。 今天给大家介绍一下&#xff0c;为感兴趣的…