《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
一.用户态,内核态
当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0 级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时 处理器在特权级最低的(3 级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。(百度百科)
二.系统调用(syscalls)
系统调用是和用户空间上运行的进程进行交互的一组接口。在linux中系统调用是用户空间访问内核的唯一手段。一般情况下,用应用程序编程接口封装系统调用。
三.使用库函数和内嵌汇编调用系统调用
1.使用库函数
只需要包含库函数的头文件,然后像使用普通函数一样就可以调用相关的系统调用。
![使用库函数触发系统调用](https://www.cnblogs.com/home/george/%E6%A1%8C%E9%9D%A2/%E7%81%AB%E7%8B%90%E6%88%AA%E5%9B%BE_2016-03-20T07-40-05.752Z.png)
2.使用内嵌汇编
1.系统调用号
每一个系统调用都有一个系统调用号,系统调用处理程序通过这个号来找到具体要执行的系统调用。
2.参数的传递
eax存放系统调用号,ebx,ecx,edx,esi,edi,按顺序存放系统调用的前5个参数。如果参数大于5个,可以用一个单独的寄存器存放指向所有这些参数在用户空间地址的指针。
系统的调用的返回值也通过eax传回来。
3.系统调用的执行过程
当软中断int $0x80会触发一个异常导致系统切换到内核态并执行128号异常处理程序,这个就是系统调用处理程序即system_call(),system_call()在到系统调用表(sys_call_table)中找这个系统调用的位置。
上图程序中通过eax传递系统调用号4。