В чем разница между системным вызовом и вызовом библиотеки?

может кто-нибудь объяснить различия для этих двух в linux? Пожалуйста, заходите как можно глубже в каждый шаг операционной системы.

4 ответов


вызовы ядра низкого уровня, которые обрабатываются ядром, являются системными вызовами.

на главной странице написано:

2 системных вызова (функции, предоставляемые ядром)

3 вызова библиотеки (функции в программных библиотеках)

живописное изображение может сделать его ясным:

enter image description here

и

enter image description here


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

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

немного упрощение здесь - - - общий метод, используемый процессорами, заключается в том, чтобы процесс явно инициировал исключение (Intel имеет альтернативный метод SYSCALL).

система будет иметь набор векторов прерываний / исключений (указатель на процедуры обработчика) для ответа на исключение или прерывания (например, ошибка страницы, деление на ноль). Система определит некоторый набор векторов (обычно с низкими номерами) для аппаратных исключений и прерываний. Однако они обычно оставляют слоты для использования операционной системой.

инструкция что-то вроде:

   INT #12

будет явно вызовите исключение и вызовите 12-ю процедуру в векторе. Система может позволить вам имитировать деление на ноль исключения, делая это

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

   INT #123

вызовет системную службу. Система может зарезервировать отдельный вектор для каждой системной службы или использовать его и отправлять.

таким образом, вы сделали бы что-то вроде этого:

  MOVL  #23, R0
  INT  #123

значение 23 в регистре 0 сообщает обработчику прерываний вызвать системную службу #23.

таким образом, вы можете видеть, что все это требует ассемблера. Каждая операционная система создает оболочку, которая может быть вызвана как функции из языков высокого уровня.

Это и есть последовательность того, что происходит:

  1. пользователь вызывает именованную оболочку с обычными параметрами. Оболочка настраивает регистры и стек для системной службы.

  2. В оболочка запускает исключение, которое отправляется в системную службу.

  3. затем системная служба должна проверить все параметры. Это одна из причин, по которой Системные службы имеют высокие накладные расходы. Исключения в режиме ядра вызывают синие экраны смерти. Если системной службе необходимо записать в буфер, предоставленный пользователем, она должна убедиться, что каждый байт, в который она записывает, является записываемой памятью.

  4. системная служба делает все, что ей нужно делать.

  5. системная служба выполняет аппаратную инструкцию для возврата из исключения или прерывания. Это возвращает в пользовательский режим и обратно к функции-оболочке.

  6. обертка может распаковывать параметры, возвращенные в регистрах.

  7. обертка возвращается вызывающему объекту.


системные вызовы и вызовы библиотек аналогичны в том, что они предоставляются приложению средой. Разница между ними заключается в том, что системные вызовы реализуются в ядре, а библиотечные-в пользовательском пространстве. Чтобы сделать системный вызов, приложение должно выполнить специальную аппаратно - и системно-зависимую инструкцию (обычно прерывание или специальное SYSENTER call) инструкция, которая запускает переключатель контекста и передает управление ядру. Библиотечные звонки, on с другой стороны, ничем не отличается от обычных вызовов функций (единственное отличие заключается в том, что код находится не в основном исполняемом файле, а в общих библиотеках).


библиотечные функции-это обычная функция, которая помещается в коллекцию функций, называемую библиотекой .

системные вызовы-это запрос на обслуживание ОС.