Linux系统调用-详细全过程.ppt
《Linux系统调用-详细全过程.ppt》由会员分享,可在线阅读,更多相关《Linux系统调用-详细全过程.ppt(43页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、LinuxLinux系统调用系统调用_ _详细全过程详细全过程u系统调用系统调用( (SYSTEM CALL)SYSTEM CALL) nOSOS内核中都有一组实现系统功能的过程,内核中都有一组实现系统功能的过程,系统调用就是对上述过程的调用。编程人系统调用就是对上述过程的调用。编程人员利用系统调用,向员利用系统调用,向OSOS提出服务请求,由提出服务请求,由OSOS代为完成。代为完成。u一般情况下,进程是不能够存取系统内核一般情况下,进程是不能够存取系统内核的。它不能存取内核使用的内存段,也不能的。它不能存取内核使用的内存段,也不能调用内核函数,调用内核函数,CPUCPU的硬件结构保证了这一
2、的硬件结构保证了这一点。只有系统调用是一个例外。点。只有系统调用是一个例外。 Linux系统调用系统调用- -功能功能u系统调用是用户态进入内核态的唯一入口系统调用是用户态进入内核态的唯一入口:一夫一夫当关,万夫莫开。常用系统调用:当关,万夫莫开。常用系统调用:n控制硬件控制硬件: :如如write/readwrite/read调用。调用。n设置系统状态或读取内核数据设置系统状态或读取内核数据getpid()getpid()、getpriority()getpriority()、setpriority()setpriority()、sethostname()sethostname()n进程管理
3、进程管理: :如如 fork()fork()、clone()clone()、execve()execve()、exit()exit()等等u优点优点 n编程容易,从硬件设备的低级编程中解脱出来编程容易,从硬件设备的低级编程中解脱出来n提高了系统的安全性,可以先检查请求的正确性提高了系统的安全性,可以先检查请求的正确性5.1 Linux系统调用系统调用- -功能功能陷入指令系统子程序sub 0A0sub 1A1sub nAnsub iAi.陷入处理机构1)保护处理机现场2)取系统调用功能号并寻找子程序入口3)恢复处理机现场并返回入口地址表A0A2Ai.An.系统调用.用户程序5.2 Int 5.
4、2 Int 0 x800 x80指令指令uLinuxLinux中实现系统调用利用了中实现系统调用利用了i386i386体系结体系结构中的软件中断。即调用了构中的软件中断。即调用了int $0 x80汇编指令。汇编指令。u这条汇编指令将产生向量为这条汇编指令将产生向量为128128的编程异的编程异常,常,CPUCPU便被切换到内核态执行内核函数,便被切换到内核态执行内核函数,转到了系统调用处理程序的入口:转到了系统调用处理程序的入口:system_call()system_call()。uint $0 x80int $0 x80指令将用户态的执行模式转变为内指令将用户态的执行模式转变为内核态,并
5、将控制权交给系统调用过程的起点核态,并将控制权交给系统调用过程的起点system_call()system_call()处理函数。处理函数。system_call()system_call()函数函数usystem_cal()system_cal()检查系统调用号,该号码告诉内核检查系统调用号,该号码告诉内核进程请求哪种服务。进程请求哪种服务。u内核进程查看系统调用表内核进程查看系统调用表(sys_call_table)(sys_call_table)找到找到所调用的内核函数入口地址。所调用的内核函数入口地址。u接着调用相应的函数,在返回后做一些系统检查,接着调用相应的函数,在返回后做一些系统
6、检查,最后返回到进程。最后返回到进程。系统调用和普通函数调用系统调用和普通函数调用uAPIAPI是用于某种特定目的的函数,供应用程序调用,是用于某种特定目的的函数,供应用程序调用,而系统调用供应用程序直接进入系统内核。而系统调用供应用程序直接进入系统内核。uLinuxLinux内核提供了一些内核提供了一些C C语言函数库,这些库对系统语言函数库,这些库对系统调用进行了一些包装和扩展,因为这些库函数与系调用进行了一些包装和扩展,因为这些库函数与系统调用的关系非常紧密,所以习惯上把这些函数也统调用的关系非常紧密,所以习惯上把这些函数也称为系统调用。称为系统调用。u有的有的APIAPI函数在用户空间
7、就可以完成工作,如一些函数在用户空间就可以完成工作,如一些用于数学计算的函数,因此不需要使用系统调用。用于数学计算的函数,因此不需要使用系统调用。u有的有的APIAPI函数可能会进行多次系统调用。函数可能会进行多次系统调用。u不同的不同的API API 函数也可能会有相同的系统调用。比如函数也可能会有相同的系统调用。比如malloc()malloc(),calloc()calloc(),free()free()等函数都使用相同的等函数都使用相同的方法分配和释放内存。方法分配和释放内存。系统命令、内核函数系统命令、内核函数u系统调用与系统命令系统调用与系统命令n系统命令相对系统命令相对APIAP
8、I来说,更高一层。每个系统命令来说,更高一层。每个系统命令都是一个执行程序,如都是一个执行程序,如lsls命令等。这些命令的实现命令等。这些命令的实现调用了系统调用。调用了系统调用。u系统调用与内核函数系统调用与内核函数n系统调用是用户进入内核的接口层,它本身并非内系统调用是用户进入内核的接口层,它本身并非内核函数,但是它由内核函数实现。核函数,但是它由内核函数实现。n进入内核后,不同的系统调用会找到各自对应的内进入内核后,不同的系统调用会找到各自对应的内核函数,这些内核函数被称为系统调用的核函数,这些内核函数被称为系统调用的“服务例服务例程程”。如系统调用。如系统调用getpidgetpid
9、实际调用的服务例程为实际调用的服务例程为sys_getpid()sys_getpid(),或者说系统调用,或者说系统调用getpid()getpid()是服务例是服务例程程sys_getpid()sys_getpid()的封装例程。的封装例程。封装例程封装例程(wrapper routine)(wrapper routine)u由于陷入指令是一条特殊指令,依赖操作系统实现由于陷入指令是一条特殊指令,依赖操作系统实现的平台,如在的平台,如在i386i386体系结构中,这条指令是体系结构中,这条指令是int int $0 x80($0 x80(陷入指令陷入指令) ),不是用户在编程时应该使用的,不
10、是用户在编程时应该使用的语句,因为这将使得用户程序难于移植。语句,因为这将使得用户程序难于移植。u在标准在标准C C库函数库函数中,为每个系统调用设置了一个中,为每个系统调用设置了一个封封装例程装例程,当一个用户程序执行了一个系统调用时,当一个用户程序执行了一个系统调用时,就会调用到就会调用到C C函数库中的相对应的封装例程。函数库中的相对应的封装例程。系统调用过程系统调用过程系统调用过程系统调用过程xyz()system_call: sys_xyz() ret_from_sys_call:iretxyz()int 0 x80sys_xyz()在应用程序在应用程序 在标准库在标准库 系统调用系
11、统调用 系统调用系统调用调用中的调用中的 中的封装例程中的封装例程 处理程序处理程序 服务例程服务例程系统调用系统调用用户态用户态 内核态内核态system_call()system_call()函数(见教材函数(见教材P234P234页)页)u首先将系统调用号首先将系统调用号(eax)(eax)和可以用到的所有和可以用到的所有CPUCPU寄存寄存器保存到相应的堆栈中(由器保存到相应的堆栈中(由SAVE_ALLSAVE_ALL完成);完成);u对用户态进程传递过来的系统调用号进行有效性检对用户态进程传递过来的系统调用号进行有效性检查查(eax(eax是系统调用号,它应该小于是系统调用号,它应该
12、小于 NR_syscallsNR_syscalls)u如果是合法的系统调用,再进一步检测该系统调用如果是合法的系统调用,再进一步检测该系统调用是否正被跟踪;是否正被跟踪;u根据根据eaxeax中的系统调用号调用相应的服务例程。中的系统调用号调用相应的服务例程。u服务例程结束后,从服务例程结束后,从eaxeax寄存器获得它的返回值,寄存器获得它的返回值,并把这个返回值存放在堆栈中,让其位于用户态并把这个返回值存放在堆栈中,让其位于用户态eaxeax寄存器曾存放的位置。寄存器曾存放的位置。u然后跳转到然后跳转到ret_from_sys_call()ret_from_sys_call(),终止系统调
13、用,终止系统调用程序的执行。程序的执行。SAVE_ALLSAVE_ALL宏定义宏定义 #define SAVE_ALL #define SAVE_ALL cld; cld; pushl %es; pushl %es; pushl %ds; pushl %ds; pushl %eax; pushl %eax; pushl %ebp; pushl %ebp; pushl %edi; pushl %edi; pushl %esi; pushl %esi; pushl %edx; pushl %edx; pushl %ecx; pushl %ecx; pushl %ebx; pushl %ebx; m
14、ovl $(_KERNEL_DS),%edx; movl $(_KERNEL_DS),%edx; movl %edx,%ds; movl %edx,%ds; movl %edx,%es;movl %edx,%es; 将寄存器中的参数压入到将寄存器中的参数压入到核心栈中核心栈中( (这样内核才能使这样内核才能使用用户传入的参数。用用户传入的参数。) ) 因为在不同特权级之间控因为在不同特权级之间控制转换时,制转换时,INTINT指令不同于指令不同于CALLCALL指令,它不会将外层指令,它不会将外层堆栈的参数自动拷贝到内堆栈的参数自动拷贝到内层堆栈中。层堆栈中。所以在调用系所以在调用系统调用时,
15、必须把参数指统调用时,必须把参数指定到各个寄存器中定到各个寄存器中图10.2 调用总控程序(system_call)执行流程图系统调用表与调用号u这样系统调用处理程序一旦运行,就可以从这样系统调用处理程序一旦运行,就可以从eaxeax中中得到系统调用号,然后再去系统调用表中寻找相得到系统调用号,然后再去系统调用表中寻找相应服务例程。应服务例程。u 一个应用程序调用一个应用程序调用fork()fork()封装例程,那么在执行封装例程,那么在执行int $0 x80int $0 x80之前就把之前就把eaxeax寄存器的值置为寄存器的值置为2(2(即即_NR_fork)_NR_fork)。u这个寄
16、存器的设置是这个寄存器的设置是libclibc库中的封装例程进行的,库中的封装例程进行的,因此用户一般不关心系统调用号因此用户一般不关心系统调用号系统调用表与调用号u核心中为每个系统调用定义了一个唯一的编号,这个编号核心中为每个系统调用定义了一个唯一的编号,这个编号的定义在的定义在linux/include/asm/unistd.hlinux/include/asm/unistd.h中(最大为中(最大为NR_syscallNR_syscall)u同时在内核中保存了一张同时在内核中保存了一张系统调用表,该表中保存了系统系统调用表,该表中保存了系统调用编号和其对应的服务例程地址调用编号和其对应的服
17、务例程地址。第第n n个表项包含系统个表项包含系统调用号为调用号为n n的服务例程的地址。的服务例程的地址。u系统调用陷入内核前,需要把系统调用号一起传入内核。系统调用陷入内核前,需要把系统调用号一起传入内核。而该标号实际上是系统调用表而该标号实际上是系统调用表( ( sys_call_tablesys_call_table) )的下标的下标u在在i386i386上,这个传递动作是通过在执行上,这个传递动作是通过在执行int $0 x80int $0 x80前前把调把调用号装入用号装入eaxeax寄存器寄存器实现。实现。u这样系统调用处理程序一旦运行,就可以从这样系统调用处理程序一旦运行,就可
18、以从eaxeax中得到系中得到系统调用号,然后再去系统调用表中寻找相应服务例程。统调用号,然后再去系统调用表中寻找相应服务例程。系统调用号系统调用号u#define _NR_exit 1u#define _NR_fork 2u#define _NR_read 3u#define _NR_write 4u#define _NR_open 5u#define _NR_close 6u#define _NR_waitpid 7u#define _NR_creat 8u#define _NR_link 9u#define _NR_unlink 10u#define _NR_execve 11u#def
19、ine _NR_chdir 12u#define _NR_time 13系统调用表系统调用表 (arch/i386/kernel/entry.s)u dataENTRY(sys_call_table).long SYMBOL_NAME(sys_ni_syscall) .long SYMBOL_NAME(sys_exit).long SYMBOL_NAME(sys_fork).long SYMBOL_NAME(sys_read).long SYMBOL_NAME(sys_write).long SYMBOL_NAME(sys_open) .long SYMBOL_NAME(sys_close).
20、long SYMBOL_NAME(sys_waitpid).long SYMBOL_NAME(sys_creat).long SYMBOL_NAME(sys_link).long SYMBOL_NAME(sys_unlink) .long SYMBOL_NAME(sys_execve).long SYMBOL_NAME(sys_chdir).long SYMBOL_NAME(sys_time).long SYMBOL_NAME(sys_mknod) 系统调用表系统调用表记录了各个记录了各个系统调用的服务例程的系统调用的服务例程的入口地址。入口地址。 以系统调用号为偏移量以系统调用号为偏移量能够
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 系统 调用 详细 全过程
限制150内