Abstract:
In
this article, we are going to see what is a library function and what
is a system call. Also we go through the basic implementation for system
call. Summary section explains about the conclusion about the summary.
What is a Library Function?
Library
functions in c Language are inbuilt functions, which are grouped
together and placed in a common place called library. Each library
function in c performs specific operation. We can make use of these
library functions to get the predefined output, instead of writing our
own code to get those outputs. These library functions are created by
the persons who designed and created C compilers. All C standard library
functions are declared in many header files and which are saved as file_name.h.
What is a system call?
At
a high level system calls are "Services" offered by the kernel to user
applications and they resemble library APIs in that they are described
as a function call with a name, parameters and return value.
However,
on a close look, we can see that system calls are actually not function
calls, but specific assembly instructions (architecture and kernel
specific) that do the following.
- setup information to identify the system call and its parameters
- trigger a kernel mode switch
- retrieve the result of the system call
In Summary, this is what happens during a system call:
- The application is setting up the system call number and parameters and it issues a trap instruction
- The execution mode switches from user to kernel; the CPU switches to a kernel stack; the user stack and the return address to user space is saved on the kernel stack
- The kernel entry point saves registers on the kernel stack
- The system call dispatcher identifies the system call function and runs it
- The user space registers are stored and execution is switched back to user (eg: calling IRET)
- The user space application resumes
Case study:
Library
functions run in user space; in that aspect, they are no different than
your own functions, They are executed by a simple far jump to the
function entry point and there's no involvement of the OS.
Other
hand, System calls run in kernel space, And system call is not a simple
far jump. It requires generating a software interrupt , which will
switch context from user process to kernel routine and then switch back.
The context switching is what makes the syscall slower than common
library/User function call.
Now,
let's take a brief look at system library. In general, system libraries
that are installed with the system, these may or may not make
syscalls. As per the process point of view, there is no difference in
making/calling a system call whether a function is provided by the user
binary or library or (shared) library installed with system; These are
just libraries loaded into memory and linked to the user program. The
addresses are resolved upon library loading.
Conclusion:
There
is no difference in making system call from your code or making it
transitively via library function. The library function is always faster
than the system call, as the system call involves context switching and
takes more CPU cycles (More Instructions).