В какой библиотеке Linux находятся системные вызовы и как эта библиотека связана с исполняемым объектным файлом, который содержит системные вызовы?

Я знаю, что системные вызовы не находятся в стандартной библиотеке C. Есть ли библиотека (какая-то системная библиотека), где системные вызовы?

Если есть такая библиотека, как эта библиотека связана с исполняемой программой?

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

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

Поэтому необходимы новые методы, которые переведут CPU в режим, позволяющий использовать любой код (привилегированный режим), и все же убедиться, что управление передано только ядру, поэтому никакой другой код не может случайно запускаться в привилегированном режиме. На x86 это обычно выполнялось с помощью инструкции int которая запускает мягкое прерывание, и kernel ​​обрабатывает это прерывание. На amd64 существует специальная syscall для ввода ядра.


В любом случае, C не знает о syscalls. Вы не можете напрямую выдать syscall в C (но вы можете с встроенной сборкой , если знаете свою целевую архитектуру). Библиотека C в Linux включает в себя множество функций, которые представляют собой крошечные обертки вокруг фактических системных вызовов, поэтому вы можете использовать их непосредственно из C.


Хотя это не входит в сферу вопросов: вопреки Linux, Windows скрывает системные вызовы до такой степени, что они даже не документируются и могут меняться в любое время. В Windows вы должны использовать только системные библиотеки (например, user32.dll ) для вашего прикладного программного обеспечения.

Системный вызов (указанный в syscalls (2) ) в основном интерпретируется kernelм linux. Библиотека C просто содержит код клей для взаимодействия с kernelм. С точки зрения приложения ( пользовательской точки) системный вызов является атомарным и представляет собой почти одну инструкцию машинного кода ( SYSCALL или SYSENTER на x86-64 ). ABI, используемый для вызова системных вызовов, не является C ABI. См. Также Linux Assembler HowTo и x86-64 ABI . Используйте strace (1), чтобы понять, какие системные вызовы выполняются какой-либо командой или процессом.

Читайте об операционных системах , системных вызовах , ядре linux .

SYSENTER инструкция SYSENTER (или SYSCALL ) переключает режим CPU из режима пользователя в режим ядра. Затем kernel ​​запускает много (миллионов) машинных инструкций в режиме привилегированного [ядра] и, наконец, выполнит SYSEXIT инструкцию SYSEXIT (или SYSRETURN ), чтобы вернуться в пользовательский режим. Ядро может даже запланировать другую задачу. Таким образом, с точки зрения приложения , системный вызов – это своего рода элементарная инструкция виртуальной машины; код приложения просто «видит» очень сложную машинную инструкцию, выполняющую весь системный вызов, и эта иллюзия обеспечивается kernelм.

См. Также этот ответ на соответствующий вопрос.

(Вы могли бы избежать libc, непосредственно делая syscalls в ассемблере, Bones – пример такой программы, но почти все программы в Linux используют некоторый libc).

Читайте также vdso (7) , ld-linux (8) , эльф (5) .

Библиотека является стандартной библиотекой C (libc). Обычно это glibc, но некоторые встроенные linux будут использовать musl, а Android использует bionic.

Linux как платформа довольно уникальна тем, что kernel ​​/ пользовательский интерфейс довольно стабильны, поэтому можно использовать различные библиотеки c.

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