INT0中断_中断请求寄存器

INT0中断_中断请求寄存器 当进程执行系统调用时,先调用系统调用库中定义某个函数,该函数通常被展开成前面提到的_syscallN的形式通过INT0x80来陷入核心,其参数也将被通过寄存器传往核心。 在这一部分,我们将介绍INT0x80的处理函数system_call。 思考一下就会发现,在调用前和调用后执行态完全不相同:前者是在用户栈上执行用户态程序,后者在核心栈上执行核心态代码。那么,为了保证在核心内部执行完系统调用…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
 
当进程执行系统调用时,先调用系统调用库中定义某个函数,该函数通常被展开成前面提到的_syscallN的形式通过INT 0x80来陷入核心,其参数也将被通过寄存器传往核心。 


在这一部分,我们将介绍INT 0x80的处理函数system_call。 


思考一下就会发现,在调用前和调用后执行态完全不相同:前者是在用户栈上执行用户态程序,后者在核心栈上执行核心态代码。那么,为了保证在核心内部执行完系统调用后能够返回调用点继续执行用户代码,必须在进入核心态时保存时往核心中压入一个上下文层;在从核心返回时会弹出一个上下文层,这样用户进程就可以继续运行。 


那么,这些上下文信息是怎样被保存的,被保存的又是那些上下文信息呢?这里仍以x86为例说明。 


在执行INT指令时,实际完成了以下几条操作: 


(1) 由于INT指令发生了不同优先级之间的控制转移,所以首先从TSS(任务状态段)中获取高优先级的核心堆栈信息(SS和ESP); 


(2) 把低优先级堆栈信息(SS和ESP)保留到高优先级堆栈(即核心栈)中; 


(3) 把EFLAGS,外层CS,EIP推入高优先级堆栈(核心栈)中。 


(4) 通过IDT加载CS,EIP(控制转移至中断处理函数) 


然后就进入了中断0x80的处理函数system_call了,在该函数中首先使用了一个宏SAVE_ALL,该宏的定义如下所示: 


#define SAVE_ALL / 


cld; / 


pushl %es; / 


pushl %ds; / 


pushl %eax; / 


pushl %ebp; / 


pushl %edi; / 


pushl %esi; / 


pushl %edx; / 


pushl %ecx; / 


pushl %ebx; / 


movl $(__KERNEL_DS),%edx; / 


movl %edx,%ds; / 


movl %edx,%es; 


该宏的功能一方面是将寄存器上下文压入到核心栈中,对于系统调用,同时也是系统调用参数的传入过程,因为在不同特权级之间控制转换时,INT指令不同于CALL指令,它不会将外层堆栈的参数自动拷贝到内层堆栈中。所以在调用系统调用时,必须先象前面的例子里提到的那样,把参数指定到各个寄存器中,然后在陷入核心之后使用SAVE_ALL把这些保存在寄存器中的参数依次压入核心栈,这样核心才能使用用户传入的参数。 




下面给出system_call的源代码: 


ENTRY(system_call) 


pushl %eax # save orig_eax 


SAVE_ALL 


GET_CURRENT(%ebx) 


cmpl $(NR_syscalls),%eax 


jae badsys 


testb $0x20,flags(%ebx) # PF_TRACESYS 


jne tracesys 


call *SYMBOL_NAME(sys_call_table)(,%eax,4) 


. . . . . . 


在这里所做的所有工作是: 


Ⅰ.保存EAX寄存器,因为在SAVE_ALL中保存的EAX寄存器会被调用的返回值所覆盖; 


Ⅱ.调用SAVE_ALL保存寄存器上下文; 


Ⅲ.判断当前调用是否是合法系统调用(EAX是系统调用号,它应该小于NR_syscalls); 


Ⅳ.如果设置了PF_TRACESYS标志,则跳转到syscall_trace,在那里将会把当前程挂起并向其父进程发送SIGTRAP,这主要是为了设置调试断点而设计的; 


Ⅴ.如果没有设置PF_TRACESYS标志,则跳转到该系统调用的处理函数入口。这里是以EAX(即前面提到的系统调用号)作为偏移,在系统调用表sys_call_table中查找处理函数入口地址,并跳转到该入口地址。 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/194451.html原文链接:https://javaforall.net

(0)
上一篇 2025年11月5日 下午5:15
下一篇 2025年11月5日 下午5:43


相关推荐

  • 前端技巧|vue双向绑定原理,助你面试成功「建议收藏」

    前端技巧|vue双向绑定原理,助你面试成功「建议收藏」在面试一些大厂的时候,面试官可能会问到你vue双向数据绑定的原理是什么?有些小伙伴不知道是什么东西,这样你在面试官的眼里就大打折扣了。今天小千就来给大家介绍一下vue的双向绑定原理,千万不要错过啦。vue双向绑定大家其实对于这个问题不会很陌生,vue中采用mvvm的模式,内置vm将view层与model层两者进行关联,任何一方的变化都会让另外一方受到影响。那回答完后,面试官还会继续追问,请回答一下你理解的双向数据绑定背后的原理是什么?那今天我们就一起探讨一下vue的背后的一些方式实现。所谓要实现双向数

    2022年10月10日
    5
  • 进销存源码|ERP多仓库管理系统全开源php源码

    进销存源码|ERP多仓库管理系统全开源php源码  进销存(ERP)源码是用来管理企业数据的软件工具。进销存系统帮助不同的组织处理企业的不同部门。不同部门如收货、库存管理、客户订单管理、生产计划、发货、会计、人力资源管理等业务职能。基本上,它是将企业的计划、生产、销售和营销工作整合到一个管理系统中的实践。它将跨不同部门的所有数据库合并到一个单一的数据库中,该企业的所有员工都可以轻松访问该数据库。它有助于自动化执行业务流程所涉及的任务。    进销存源码演示及资源获取:e.csymzs.top    使用进销存前:    在使用进销存源码之前,

    2022年5月31日
    122
  • Pytest(16)随机执行测试用例pytest-random-order[通俗易懂]

    Pytest(16)随机执行测试用例pytest-random-order[通俗易懂]前言通常我们认为每个测试用例都是相互独立的,因此需要保证测试结果不依赖于测试顺序,以不同的顺序运行测试用例,可以得到相同的结果。pytest默认运行用例的顺序是按模块和用例命名的ASCII编码

    2022年7月29日
    9
  • Open Claw阿里云部署安装教程与应用实践分享(保姆级教程)

    Open Claw阿里云部署安装教程与应用实践分享(保姆级教程)

    2026年3月13日
    1
  • redis+springboot_redis部署

    redis+springboot_redis部署目录1、搭建环境2、测试Redis3、StringRedisTemplate3.1、介绍3.2、StringRedisTemplate常用操作3.3、StringRedisTemplate的使用4、RedisTemplate4.1、介绍4.2、RedisTemplate常用操作4.3、RedisTemplate的使用SpringBootData(数据)Redis中提供了RedisTemplate和StringRedisTemplate,其中StringRedisTemplate是RedisTem.

    2026年2月18日
    4
  • 使用Python进行Klayout版图绘制(1/4)

    使用Python进行Klayout版图绘制(1/4)作为器件研发工程师 能够绘制版图和修改版图是最基本的工作 但是在进行器件研发阶段 我们常常需要绘制不同 pitch 形状 尺寸的原胞结构 这些工作往往是重复且繁杂的 因为原胞有源区边缘总是整个器件版图绘制中比较难处理的地方 在使用绘图工具进行操作时 稍有不慎 就会在其中引入违反 DRC 规则的缝隙 并且在手动查找这些缝隙时 需要将版图的局部放大到非常大的倍数才能发现 因此 如果版图的绘制可以使用 python 代码来实现 将会大大简化在研发阶段版图绘制的时间以及修改版图的时间 提高研发的效率 目前 在绘制版图中 经常

    2026年3月19日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号