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


相关推荐

  • 现在哪款诺基亚能玩Java游戏_回忆S60(塞班)年代的JAVA游戏:有没有哪一款是你在课堂偷偷玩的?…

    现在哪款诺基亚能玩Java游戏_回忆S60(塞班)年代的JAVA游戏:有没有哪一款是你在课堂偷偷玩的?…Bounce我们把这个游戏叫为蹦球,也是诺基亚手机内置的一款游戏。需要操控一只红色的小皮球,滚动、蹦跳来一路闯关,碰触黄色的圈得分,关卡设计在今天来说都算是十分灵活的,可以来回进行冒险,不像常见的横版卷轴过关游戏,经过的关卡就不能回去了。玩这款游戏很是需要耐心,有些关卡需要特别注意机关、暗道,更有些关卡连弹跳的力度和位置都需要尝试很多次去掌握,依稀还记得按键2,5跳跃,按*(星键)可以改变蹦球形象…

    2022年7月7日
    18
  • Django(53)二次封装Response

    Django(53)二次封装Response前言有时候我们使用drf的Response,会发现默认返回的格式不太友好,每次我们都需要写入以下的格式returnResponse({"status":0,"

    2022年7月29日
    10
  • vscode代码自动提示_vscode智能提示

    vscode代码自动提示_vscode智能提示VSCode自动补全,VSCode当中的自动补全内容,其实是由语言服务来提供的。本文介绍VSCode自动补全功能和VSCode自动补全设置。VSCode为编程语言工作者提供了统一的API,即LanguageServerProtocol,每种语言都能够通过实现这个API在VSCode上得到类似IDE的开发体验,而各个语言根据这个API实现的服务,就被称为语言…

    2022年10月22日
    0
  • Boltzmann Machine 玻尔兹曼机入门

    Boltzmann Machine 玻尔兹曼机入门GenerativeModels生成模型帮助我们生成新的item,而不只是存储和提取之前的item。BoltzmannMachine就是GenerativeModels的一种。Boltzma

    2022年7月4日
    15
  • Linux环境编程

    Linux环境编程IPC共享内存出处:http://blog.csdn.net/lijun538/article/details/52549159共享内存区是可用IPC形式里面最快的。共享内存允许多个进程同时访问同一内存区,进程会将内存区映射到自己的地址空间中。这样进程间数据的传递不再涉及内核,减少了数据复制的动作。例如一个客户从服务器读的操作,使用管道消息队列等形式的话,需要内核将数据复制到进

    2022年6月1日
    43
  • C语言中volatile关键字的作用

    C语言中volatile关键字的作用一.前言1.编译器优化介绍:由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度。以上是硬件级别的优化。再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化。编译器优化常用的方法有:将内存变

    2022年6月1日
    34

发表回复

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

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