Я получил ответ на этот вопрос, но не совсем понимаю разницу между системными вызовами и функциями библиотеки. Концептуально, в чем разница между этими двумя?
источник
Я получил ответ на этот вопрос, но не совсем понимаю разницу между системными вызовами и функциями библиотеки. Концептуально, в чем разница между этими двумя?
Концептуально библиотечная функция является частью вашего процесса.
Во время выполнения ваш исполняемый код и код любых библиотек (например, libc.so), от которых он зависит, будут связаны в один процесс. Поэтому, когда вы вызываете функцию в такой библиотеке, она выполняется как часть вашего процесса с теми же ресурсами и привилегиями. Это та же идея, что и вызов функции, которую вы написали самостоятельно (с возможными исключениями, такими как функции PLT и / или батут, которые вы можете посмотреть, если вам не все равно).
Концептуально системный вызов - это специальный интерфейс, используемый для вызова из вашего кода (который обычно непривилегирован) в ядро (которое имеет право при необходимости повышать привилегии).
Например, смотрите Linux man brk . Когда C-программа вызывает malloc
выделение памяти, она вызывает библиотечную функцию в glibc.
Если внутри процесса уже достаточно места для распределения , он может выполнить любое необходимое управление кучей и вернуть память вызывающей стороне.
Если нет, glibc должен запросить больше памяти у ядра: он (вероятно) вызывает brk
функцию glibc, которая, в свою очередь, вызывает brk
системный вызов. Только когда управление передается ядру через системный вызов, состояние глобальной виртуальной памяти можно изменить, чтобы зарезервировать больше памяти и отобразить его в адресное пространство вашего процесса.
Добавление к бесполезному ответу:
функции библиотеки выполняются быстрее, чем системные вызовы, и, как правило, не содержат соображений, связанных с разрешениями и безопасностью, поскольку они работают с привилегиями процесса и его памятью.
С другой стороны, системные вызовы, поскольку они запускаются в ядре, имеют доступ ко всему в системе, и поэтому им необходимо контролировать, что может делать вызывающий процесс при его вызове (убедитесь, что у него есть разрешения на открытие файла, для пример), кроме того, поскольку системные вызовы находятся в ядре, для их вызова требуется переключение контекста в ЦП, что является очень тяжелым процессом по сравнению с простым вызовом библиотечного вызова.
Системные вызовы обычно отражаются как загрузка ЦП системы в программах мониторинга.
вызов библиотеки - вызывает подпрограмму, связанную с приложением (посредством включения или добавления библиотеки).
системный вызов - передает управление ОС (пользователь-> системный процесс-> ОС) и переводит процессор в привилегированный режим.