Разница между системными вызовами и библиотечными функциями

Ответы:

19

Концептуально библиотечная функция является частью вашего процесса.

Во время выполнения ваш исполняемый код и код любых библиотек (например, libc.so), от которых он зависит, будут связаны в один процесс. Поэтому, когда вы вызываете функцию в такой библиотеке, она выполняется как часть вашего процесса с теми же ресурсами и привилегиями. Это та же идея, что и вызов функции, которую вы написали самостоятельно (с возможными исключениями, такими как функции PLT и / или батут, которые вы можете посмотреть, если вам не все равно).

Концептуально системный вызов - это специальный интерфейс, используемый для вызова из вашего кода (который обычно непривилегирован) в ядро ​​(которое имеет право при необходимости повышать привилегии).


Например, смотрите Linux man brk . Когда C-программа вызывает mallocвыделение памяти, она вызывает библиотечную функцию в glibc.

Если внутри процесса уже достаточно места для распределения , он может выполнить любое необходимое управление кучей и вернуть память вызывающей стороне.

Если нет, glibc должен запросить больше памяти у ядра: он (вероятно) вызывает brkфункцию glibc, которая, в свою очередь, вызывает brkсистемный вызов. Только когда управление передается ядру через системный вызов, состояние глобальной виртуальной памяти можно изменить, чтобы зарезервировать больше памяти и отобразить его в адресное пространство вашего процесса.

Бесполезный
источник
11

Добавление к бесполезному ответу:
функции библиотеки выполняются быстрее, чем системные вызовы, и, как правило, не содержат соображений, связанных с разрешениями и безопасностью, поскольку они работают с привилегиями процесса и его памятью.

С другой стороны, системные вызовы, поскольку они запускаются в ядре, имеют доступ ко всему в системе, и поэтому им необходимо контролировать, что может делать вызывающий процесс при его вызове (убедитесь, что у него есть разрешения на открытие файла, для пример), кроме того, поскольку системные вызовы находятся в ядре, для их вызова требуется переключение контекста в ЦП, что является очень тяжелым процессом по сравнению с простым вызовом библиотечного вызова.

Системные вызовы обычно отражаются как загрузка ЦП системы в программах мониторинга.

Диди Коэн
источник
0
  1. lib fun поддерживаются компилятором, а syscall - ОС
  2. Libcall специфичны, в то время как системные вызовы являются общими, как getc. Lib fun может получить доступ только к одному символу за раз, а не к строке или слово за словом, но открыть системный вызов можно, чтобы открыть текстовый файл, двоичный файл и многие другие типы файлов.
Прит
источник
0

вызов библиотеки - вызывает подпрограмму, связанную с приложением (посредством включения или добавления библиотеки).

системный вызов - передает управление ОС (пользователь-> системный процесс-> ОС) и переводит процессор в привилегированный режим.

Веды Дешпанде
источник