什么是系统调用

什么是系统调用,第1张

Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。

用户可以通过系统调用命令在自己的应用程序中调用它们。

从某种角度来看,系统调用和普通的函数调用非常相似。

区别仅仅在于,系统调用由 *** 作系统核心提供,运行于核心态而普通的函数调用由函数库或用户自己提供,运行于用户态。

随Linux核心还提供了一些C语言函数库,这些库对系统调用进行了一些包装和扩展,因为这些库函数与系统调用的关系非常紧密,所以习惯上把这些函数也称为系统调用。

扩展资料:

实际上,很多已经被我们习以为常的C语言标准函数,在Linux平台上的实现都是靠系统调用完成的,所以如果想对系统底层的原理作深入的了解,掌握各种系统调用是初步的要求。

进一步,若想成为一名Linux下编程高手,也就是我们常说的Hacker,其标志之一也是能对各种系统调用有透彻的了解。

即使除去上面的原因,在平常的编程中你也会发现,在很多情况下,系统调用是实现你的想法的简洁有效的途径,所以有可能的话应该尽量多掌握一些系统调用,这会对你的程序设计过程带来意想不到的帮助。

调用性能问题

系统调用需要从用户空间陷入内核空间,处理完后,又需要返回用户空间。其中除了系统调用服务例程的实际耗时外,陷入/返回过程和系统调用处理程序(查系统调用表、存储\恢复用户现场)也需要花销一些时间,这些时间加起来就是一个系统调用的响应速度。

系统调用不比别的用户程序,它对性能要求很苛刻,因为它需要陷入内核执行,所以和其他内核程序一样要求代码简洁、执行迅速。

幸好Linux具有令人难以置信的上下文切换速度,使得其进出内核都被优化得简洁高效同时所有Linux系统调用处理程序和每个系统调用本身也都非常简洁。

绝大多数情况下,Linux系统调用性能是可以接受的,但是对于一些对性能要求非常高的应用来说,它们虽然希望利用系统调用的服务,但却希望加快相应速度,避免陷入/返回和系统调用处理程序带来的花销。

因此采用由内核直接调用系统调用服务例程,最好的例子就HTTPD——它为了避免上述开销,从内核调用socket等系统调用服务例程。

参考资料:系统调用_百度百科

“ *** 作系统调用执行用户程序的入口程序”具体流程如下:

当处理器执行到系统调用指令时,其工作状态由用户态切换到核心态。处理器将由执行用户指令变为执行 *** 作系统指令,即执行系统调用处理程序,该程序的入口地址根据系统调用号从中断向量表中获得。

包括用户进程下一条指令地址(即返回地址在内)的处理器现场被保存起来,然后系统调用处理程序开始执行结束时,通过中断返回指令,用户进程的现场信息被恢复,处理器重返用户进程后续指令执行。

流程说明

1、硬件接收到中断信号,立刻保存现场,并查找中断向量表,将CPU控制权转交给系统调用总入口程序。

2、对于系统调用总入口程序,也要先保存现场,将参数保存在内核的堆栈中。然后查找系统调用表,将CPU控制权转交给对应的系统调用处理程序或者是内核函数。

3、执行系统调用处理程序

4、恢复现场,返回用户程序。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11561376.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存