分类: LINUX
2012-05-08 14:02:43
应用层的API接口函数中一部分需要调用系统函数,有一对一调用的,也有一堆多调用的,剩下的大部分都是直接调用库函数来完成功能。
1.系统调用的可移植性较差,因为它直接对硬件进行操作,与具体的操作系统及硬件有关。而一般函数调用运行于应用层,一般都为C库,所以一般函数的可移植性较强。
2.每次系统调用时都要由用户层切换到内核层,因此需要耗费一定的开销。过多的进行系统调用会影响到系统的性能。
3.库函数对文件的操作最终会映射到系统调用的相应操作,打开文件获得FILE结构指针,在内核中会有一个相应的文件描述符fd打开。
4.读写文件时即使使用函数调用,最用还是会调用系统调用去进行具体的操作,但是使用函数调用可以减少系统调用的次数,这要得益于用户空间和内核空间的缓冲区技术。只有当缓冲区写满后才会写到目的地。
系统调用时将调用号(实际是系统调用表中的偏移),保存在eax寄存器中,通过此寄存器的值在include/unistd.h中对应的宏,内核可以得到相应的调用函数。再到include/system_call.s中执行此函数。