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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 5.网站404错误–404页面制作方法详解(下)

    5.网站404错误–404页面制作方法详解(下)  八、制作404页面  这里分两种情况。  Apache  为ApacheServer设置404错误页面的方法很简单,只需:  (1)在.htaccess文件中加入如下内容:ErrorDocument404/notfound.php,将.htaccess文件上传到网站根目录。  (2)制作一个404页面,随便您设计,命名为notfound.php,同样上传到网站根目…

    2022年7月27日
    1
  • netstat命令详解Linux,Linux netstat命令详解

    netstat命令详解Linux,Linux netstat命令详解常见参数-a(all)显示所有选项,默认不显示LISTEN相关-t(tcp)仅显示tcp相关选项-u(udp)仅显示udp相关选项-n拒绝显示别名,能显示数字的全部转化成数字。-l仅列出有在Listen(监听)的服務状态-p显示建立相关链接的程序名-r显示路由信息,路由表-e显示扩展信息,例如uid等-s按各个协议进行统计-c每隔一个固定时间,执行该netstat命令。提…

    2022年5月7日
    49
  • Allure趋势图本地显示

    Allure趋势图本地显示Allure趋势图本地显示众所周知,allure趋势图在本地运行的时候,总是显示的空白,但与Jenkins集成后,生成的报告却显示了整个趋势如果不与Jenkins集成就真的没办法展示趋势图吗?答案是NO,没有趋势图我们就自己写????一、首先看下Jenkins集成allure展示的趋势图是什么样子的展示了每次运行的结果对应构建的次数点击可以跳转到对应的构建结果报告整体趋势一目了然二、研究Jenkins生成的allure报告有什么规律1、打开家目录中的.jenkins/jobs/te

    2022年7月26日
    30
  • 图解springmvc 执行流程

    图解springmvc 执行流程核心对象DispatcherServlet核心控制器负责请求,响应,数据的分发。HandlerMapping处理器映射器,负责到controller中,找到对应的方法,返回给核心控制器。HandleAdapter处理适配器,将handle找到的方法执行,执行结果,即ModelAndView数据和视图返回给核心控制器。HttpMessageConvertor消息转换器,数据类型的转换,如日期…ViewResolver视图解析器,核心控制器调度视图解析器,视图解析器,返回视图。核心控制

    2022年6月28日
    28
  • Python fillna_python rfind函数

    Python fillna_python rfind函数假设我有这张桌子Type|Killed|SurvivedDog52Dog34Cat17Dognan3cownan2[Type]=Dog缺少Killed值之一.我想在[类型]=狗的[Killed]中归咎于平均值.我的代码如下:>搜索平均值d…

    2022年8月12日
    3

发表回复

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

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