中断INT 0x80的作用[转自8miu blog]

    技术2022-05-19  19

    当进程执行系统调用时,先调用系统调用库中定义某个函数,该函数通常被展开成前面提到的_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

    转载请注明原文地址: https://ibbs.8miu.com/read-2205363.html

    最新回复(0)