Answers:
从概念上讲,库功能是您过程的一部分。
在运行时,您的可执行代码和它依赖的任何库的代码(例如libc.so)都被链接到单个进程中。因此,当您在此类库中调用函数时,该函数将以相同的资源和特权在您的流程中执行。这与调用您自己编写的函数的想法相同(可能有例外,如PLT和/或蹦床函数,您可以在需要时查找它们)。
从概念上讲,系统调用是一种特殊的接口,用于从您的代码(通常是无特权的)到内核(该内核有权根据需要提升特权)进行调用。
例如,请参阅Linux man brk。当C程序调用malloc
分配内存时,它正在glibc中调用库函数。
如果在进程内部已经有足够的空间用于分配,则它可以执行任何必要的堆管理并将内存返回给调用方。
如果不是,则glibc需要从内核请求更多的内存:它(可能)调用brk
glibc函数,该函数又调用brk
syscall。只有通过syscall将控制权传递给内核之后,才能修改全局虚拟内存状态以保留更多内存,并将其映射到进程的地址空间。
添加到“无用”的答案:
库函数比系统调用更快,并且通常不包含权限/安全性考虑,因为它们以进程的特权及其内存运行。
另一方面,由于Syscall在内核中运行,因此可以访问系统中的所有内容,因此它们需要控制调用过程在调用它们时可以执行的操作(验证它是否具有打开文件的权限,例如例如,此外,由于系统调用位于内核中,因此调用它们需要在CPU中进行上下文切换,相对于仅调用库调用而言,这是一个非常繁重的过程。
系统调用通常反映为监视程序中的系统CPU使用率。
库调用-调用链接到应用程序的子例程(通过包含或添加库)。
系统调用-将控制权转移到OS(用户-> system proc-> OS),并将处理器置于特权模式