Ответы:
На самом деле не существует такого понятия, как «библиотечный вызов». Вы можете вызвать функцию, которая связана с общей библиотекой. И это просто означает, что путь к библиотеке ищется во время выполнения, чтобы определить местоположение вызываемой функции.
Системные вызовы - это вызовы ядра низкого уровня, обрабатываемые ядром.
Если вы наберете man man
в своей оболочке, вы увидите список разделов руководства
2 Системные вызовы (функции, предоставляемые ядром)
3 Библиотечные вызовы (функции внутри программных библиотек)
Например, вы найдете chmod
в разделе 2 руководства при вводе man chmod
. И fprintf
в разделе 3.
Системные вызовы обрабатываются непосредственно ядром.
Вызовы библиотеки обрабатываются динамической (или статически связанной) библиотекой. Программа, выполняющая вызов библиотеки, должна сначала импортировать эту библиотеку, прежде чем вызов будет работать. Сами библиотечные вызовы могут использовать системные вызовы.
Иногда библиотеки предоставляются как «внешние интерфейсы» для системных вызовов, чтобы обеспечить дополнительную функциональность или простоту использования, не предоставляемую ядром.
Системные вызовы - это функции, которые операционная система предоставляет приложениям для использования. Принимая во внимание, что такие функции, как в math.h, string.h и т. Д., Не имеют ничего общего с взаимодействием с операционной системой.
В основном есть два режима ядра Linux, а именно.
Любое ядро Linux переключается между этими двумя режимами. Обычно вызовы библиотеки выполняются в режиме пользователя, а системные вызовы выполняются в режиме ядра . С точки зрения операционной системы, режим ядра является атомарным по своей природе и находится в режиме супервизора. Почти все библиотечные вызовы нуждаются в помощи ядра для выполнения своих задач. Каждый библиотечный вызов, в свою очередь, вызывает основной системный вызов. Давайте сделаем идею более понятной, используя следующий пример
Всякий раз, когда в программе c, вы используете fopen () из заголовочного файла. Среда программирования вызывает системный вызов open () из ядра и выполняет задачу открытия файла. Снова после выполнения поток управления возвращается в режим пользователя.
Для иллюстрации этого выполните следующие задачи
man man
: здесь вы найдете раздел руководства с 1 по 8, каждый из которых имеет определенное назначение.man fopen
: вы увидите respose как FOPEN(3)
, здесь 3 обозначают ручной раздел 3 справочных страниц, который является разделом вызовов c-библиотеки.Do man open
: вы увидите respose как OPEN(2)
, здесь 2 обозначают ручной раздел 2 справочных страниц, который является разделом системных вызовов.
Надеюсь, вы поняли концепцию.
Просто добавлю к различиям, упомянутым здесь в других ответах.
Поскольку вызов библиотеки - это просто вызов функции, переключение с пространства пользователя на пространство ядра не происходит. С другой стороны, системный вызов приводит к переключению из пространства пользователя в пространство ядра, поскольку системный вызов работает в режиме ядра.