系统调用和函数调用

系统调用和函数调用


1. 系统调用

a. 什么是系统调用

系统调用,通俗的讲,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。

b. 系统调用的用途

  1. 控制硬件—系统调用往往作为硬件资源和用户空间的抽象接口,比如读写文件时用到的write/read调用。
  2. 设置系统状态或读取内核数据——因为系统调用是用户空间和内核的唯一通讯手段,所以用户设置系统状态,比如开/关某项内核服务(设置某个内核变量),或读取内核数据都必须通过系统调用。
  3. 进程管理—系统调用接口是用来保证系统中进程能以多任务在虚拟内存环境下得以运行。比如 fork、clone、execve、exit等

c. 系统调用的实现

Linux中实现系统调用利用了0x86体系结构中的软件中断。首先,用户程序为系统调用设置参数。其中一个参数是系统调用编号。参数设置完成后,程序执行“系统调用”指令。x86系统上的软中断由int产生。这个指令会导致一个异常:产生一个事件,这个事件会致使处理器切换到内核态并跳转到一个新的地址,并开始执行那里的异常处理程序。此时的异常处理程序实际上就是系统调用处理程序。它与硬件体系结构紧密相关。
新地址的指令会保存程序的状态,计算出应该调用哪个系统调用,调用内核中实现那个系统调用的函数,恢复用户程序状态,然后将控制权返还给用户程序。系统调用是设备驱动程序中定义的函数最终被调用的一种方式。

d. 系统调用的过程

系统调用和函数调用_第1张图片

e. 系统调用列表

常见的系统调用有:connect用于连接远程主机getuid获取用户标志号fork()waitpid()等详情可以从下列网址获取:

http://www.ibm.com/developerworks/cn/linux/kernel/syscall/part1/appendix.html

2. 函数调用

函数调用就相对熟悉多了。我们大一、大二编程所用的函数调用大多都是这里的函数调用,它运行在用户空间。
它主要通过压栈操作来进行函数调用。
例如,函数调用会执行下列操作:
⒈ 将帧指针压入栈中:pushebp
⒉ 使得帧指针等于栈指针:movebp,esp
⒊ 使栈指针自减,自减得到的内存地址应当能够(足够)用来存储被调用函数的本地状态:sub esp,0CCh


3. 函数调用与系统调用的区别

通俗的讲,函数调用是语言本身的一部分,而系统函数是内核提供给应用程序的接口,属于系统的一部分。函数调用是语言或应用程序的一部分,而系统调用是操作系统的一部分
具体比较可参考下面的表格:(摘自网络)
函数调用 系统调用
在所有的ANSI C编译器版本中,C库函数是相同的 各个操作系统的系统调用是不同的
它调用函数库中的一段程序(或函数) 它调用系统内核的服务
与用户程序相联系 是操作系统的一个入口点
在用户地址空间执行 在内核地址空间执行
它的运行时间属于“用户时间” 它的运行时间属于“系统”时间
属于过程调用,调用开销较小 需要在用户空间和内核上下文环境间切换,开销较大
在C函数库libc中有大约300个函数 在UNIX中大约有90个系统调用
典型的C函数库调用:system fprintfmalloc 典型的系统调用:chdir fork write brk;

参考:
1.https://zh.wikipedia.org/wiki/%E4%BB%BB%E5%8A%A1%E7%AE%A1%E7%90%86%E5%99%A8_(Windows%E5%85%83%E4%BB%B6)
2. https://zh.wikipedia.org/wiki/%E5%A4%9A%E7%BA%BF%E7%A8%8B
3. 《操作系统原理》
4. http://www.kerneltravel.net/journal/iv/syscall.htm
5. http://blog.csdn.net/yusiguyuan/article/details/23181327
6. http://wenku.baidu.com/view/3e99ead6195f312b3169a580.html
7. http://www.zhihu.com/question/19901763
8. http://baike.baidu.com/view/65706.htm

你可能感兴趣的:(操作系统)