系统调用是什么???
系统调用是操作系统为用户提供的一系列API;系统调用将用户的请求发给内核,内核执行完以后,将结果返回给用户;
以open为例,进行系统调用:
分析Linux2.6.11版本
<1>通过在unistd.h中的函数名的拼接;
<2>找到对应的系统调用号
<3>然后将此系统调用号通过eax寄存器告知内核,在执行0x80号中断的时候,eax寄存器中放的是5;
<4>将用户空间的esp等信息压入内核栈,在内核栈上执行系统调用;
<5>系统调用执行完毕,将结果写入eax寄存器中,将用户空间的信息弹出内核栈,执行用户空间的代码;
系统调用时的当前进程要进行模式的切换,要从用户态切换到内核态,那么用户态的一些寄存器信息,就要进行压栈的操作,压入内核栈,以免下次进行现场恢复(恢复到用户空间)的时候,直接从内核栈弹出寄存器的信息,并让eax寄存器带上内核完成系统调用时的结果;
进程切换来了。。。
当我们进程进行切换的时候,用户态的寄存器信息,是保存在哪里的呢?用户态的信息是保存在task_struct里面的成员变量thread里面;
struct task_struct {
/**
* 进程状态。
*/
volatile long state; /* -1 unrunnable, 0 runnable, >0 stopped */
/**
* 进程的基本信息。
*/
struct thread_info *thread_info;
atomic_t usage;
unsigned long flags;