一、系统调用机制
系统调用的机制是靠软件中断实现的,首先,用户程序为系统调用设置参数。其中一个参数是系统调用编号。参数设置完成后,程序执行“系统调用”指令。x86系统上的软中断由int产生。这个指令会导致一个异常:产生一个事件,这个事件会致使处理器切换到内核态并跳转到一个新的地址,并开始执行那里的异常处理程序。此时的异常处理程序实际上就是系统调用处理程序,新地址的指令会保存程序的状态,计算出应该调用哪个系统调用,调用内核中实现那个系统调用的函数,恢复用户程序状态,然后将控制权返还给用户程序,每个系统调用被赋予一个系统调用号,系统调用号是通过eax寄存器传递给内核的。除了系统调用号以外,大部分系统调用都还需要一些外部的参数输人。
二、实验
1、用c语言来创建得到当前的进程号(调用API)
直接调用getpid函数,即可得到当前进程号。
2、用汇编来调用对应的系统调用
汇编第一句:把系统调用号14赋给eax寄存器,通过系统调用号来进行调用。
汇编第二句:执行eax寄存器中所对应的系统调用。
汇编第三局:将结果通过eax寄存器传给b。
最后将进程id打印出来。
3、结果
三、总结
首先我们需要在用户态时将系统调用号放入到寄存器eax中,再由指令int 0x80进行系统调用,然后进入到内核态,以我的实验为例,在内核态就会由sys_getpid函数来完成相关的功能,并将返回值返回到寄存器eax中,然后退出内核态系统调用,再退出内核态返回到用户态。