系统调用和库函数的区别

Gee*_*eek 12 libraries system-calls architecture

我已经完成了这个问题的答案,但不太明白系统调用和库函数之间的区别。从概念上讲,两者有什么区别?

Use*_*ess 19

从概念上讲,库函数是流程的一部分。

在运行时,您的可执行代码和它所依赖的任何库(例如 libc.so)的代码都会链接到一个进程中。因此,当您调用此类库中的函数时,它会作为您进程的一部分执行,并具有相同的资源和权限。这与调用您自己编写的函数的想法相同(可能有例外,例如 PLT 和/或蹦床函数,如果您愿意,可以查找)。

从概念上讲,系统调用是一个特殊的接口,用于从您的代码(通常没有特权)调用内核(它有权根据需要提升特权)。


例如,请参阅 Linux man brk。当 C 程序调用malloc分配内存时,它正在调用 glibc 中的库函数。

如果进程内部已经有足够的空间用于分配,它可以进行任何必要的堆管理并将内存返回给调用者。

如果没有,glibc 需要从内核请求更多内存:它(可能)调用brkglibc 函数,后者又调用brk系统调用。只有通过系统调用将控制权传递给内核后,才能修改全局虚拟内存状态以保留更多内存,并将其映射到进程的地址空间。


Did*_*hen 11

添加到 Useless 的答案:
库函数比系统调用更快,并且通常不包含权限/安全考虑,因为它们以进程的特权和内存运行。

另一方面,系统调用,因为它们在内核中运行,可以访问系统中的所有内容,因此它们需要控制调用进程在调用它们时可以做什么(验证它是否具有打开文件的权限,例如例如),此外,由于系统调用在内核中,因此调用它们需要在 CPU 中进行上下文切换,相对于仅调用库调用而言,这是一个非常繁重的过程。

系统调用通常反映为监控程序中的系统 CPU 使用率。