正邦品牌设计公司简介,兰州企业网络推广优化,餐饮logo创意设计,asp.net 网站强制兼容性运行这个问题也是在九识面试的时候被问到的#xff0c;当时我说就是像Shell#xff0c;从用户态转移到内核态的过程#xff0c;面试官让我说的详细一点#xff0c;我就说不出来了#xff0c;然后我就说了一些函数调用的过程#xff0c;hhhh。 现在在这里做一个记录吧。
本文…这个问题也是在九识面试的时候被问到的当时我说就是像Shell从用户态转移到内核态的过程面试官让我说的详细一点我就说不出来了然后我就说了一些函数调用的过程hhhh。 现在在这里做一个记录吧。
本文部分摘抄自终于把系统调用给整明白了~ 系统调用【简单总结】_系统调用的过程_aristo_boyunv的博客-CSDN博客 系统调用原理及详细过程_系统调用过程_BugM的博客-CSDN博客
什么是系统调用
操作系统为了防止各类应用程序可能会破坏系统资源对系统资源做了保护阻止应用程序直接去访问这些资源而应用程序又有访问这些系统资源的需求因此操作系统提供了系统调用让所有的应用程序统一通过系统调用来访问系统资源如文件、网络、内存、IO等
系统调用的过程
应用程序可以进行系统调用也可以调用标准库或者API 系统统调用需要进行模式切换而每个完整的应用程序都有两个栈一个用户栈一个内核栈。这两个栈是独立的用户栈在用户空间内核栈在内核空间因此切换模式时栈也得切换。
因此我们可以将系统调用的执行步骤分为三步 1.执行前的准备工作。 2.执行处理程序处理函数。 3.执行后的善后工作。 当然内核模式切换和栈切换就是1和3的工作了这里的三步都是在内核模式下执行的 以fork为例讲讲系统调用的实现 上图为系统调用涉及到的9个步骤
1.应用程序调用linux库提供的fork函数发起一个fork系统调用这个系统调用的目的是创建一个子进程这个子进程拷贝一份父进程的虚拟进程空间。
2.fork函数的第一步就是将2放入寄存器eax,每个系统调用都有一个编号2就是fork系统调用的编号eax是默认用于传递系统调用编号的寄存器。
如果系统调用有参数则将参数传入到如下的寄存器EBXECXEDXESIEDIEBP可以看出系统调用最多支持6个参数fork系统调用没有参数。
fork函数的第二步就是执行中断指令int 0x80,中断指令int用于发送中断信号给处理器0x80为中断向量号这个向量号是系统调用中断处理程序专用。
int指令同时也会将模式从用户态切换到内核态用户栈切换到内核栈同时会将当前被中断的应用程序中断时的寄存器内容入栈SSESPEFLAGSCSEIP这里的入栈指的是入内核栈每一个应用程序都一个用户栈和内核栈
3.处理器执行完当前的指令后会检查处理器的中断引脚发现有中断信号然后检查状态寄存器EFLAGS)发现中断屏蔽IF标志是打开的(系统调用中断信号不会被屏蔽)处理器根据中断信号分析出中断向量号然后根据中断向量号去查找中断描述符表找到了该中断向量号对应的中断处理程序。
4.操作系统跳转到中断处理程序然后开始执行中断处理程序0x80对应的中断处理程序是系统调用中断处理程序system_call。
该中断处理程序首先会将EAXEBXECXEDXESIEDIEBP这几个寄存器入栈之所以入栈就是为了防止后续的工作覆盖这些寄存器
5.系统调用中断处理程序紧接着根据系统调用号(这里就是fork系统调用号即2)去系统调用表进行查找可以找到该系统调用号对应的处理程序(也可以叫处理函数),Linux操作系统的系统处理函数一般以sys开头fork的系统处理函数就是sys_fork。
6.找到了系统处理函数后开始执行该函数处理函数可以从内核栈中获取函数的参数函数执行完成后函数的返回值默认采用EAX寄存器进行返回。
7~8.系统处理函数执行完成后回到了系统调用中断处理程序中断处理程序执行iret指令iret指令负责从内核态切换到用户态将内核态入栈的寄存器数据出栈到SSESPEFLAGSCSEIP这几个寄存器然后跳转到系统调用处。
9.系统调用fork返回到应用程序。