Conceitualmente, uma função de biblioteca faz parte do seu processo.
No tempo de execução, o código executável e o código de quaisquer bibliotecas (como libc.so) dependem e ficam vinculados em um único processo. Assim, quando você chama uma função em tal biblioteca, ela é executada como parte de seu processo, com os mesmos recursos e privilégios. É conceitualmente o mesmo que chamar uma função que você mesmo escreveu (com possíveis exceções, como as funções PLT e / ou trampolim, que você pode procurar se você se importa).
Conceitualmente, uma chamada de sistema é uma interface especial usada para fazer uma chamada de seu código (que geralmente não é privilegiado) para o kernel (que tem o direito de escalar privilégios conforme necessário).
Por exemplo, veja o Linux man brk .
Quando um programa em C chama malloc
para alocar memória, ele está chamando uma função de biblioteca na glibc.
Se já houver espaço suficiente para a alocação dentro do processo , ele poderá fazer qualquer gerenciamento de heap necessário e retornar a memória ao chamador.
Se não, o glibc precisa solicitar mais memória do kernel: ele (provavelmente) chama a função brk
glibc, que por sua vez chama o brk
syscall. Somente depois que o controle passar para o kernel, via syscall, o estado da memória virtual global pode ser modificado para reservar mais memória e mapeá-lo para o espaço de endereço do processo.