Интерфейсы ядра Linux - Linux kernel interfaces
Ядро Linux предоставляет несколько интерфейсов для приложений пользовательского пространства, которые используются для разных целей и имеют разные свойства по своей конструкции. В ядре Linux есть два типа интерфейса прикладного программирования (API) , которые не следует путать: API "ядро – пользовательское пространство" и API "внутреннее ядро".
Linux API
Linux API - это API-интерфейс ядра и пользовательского пространства, который позволяет программам в пользовательском пространстве получать доступ к системным ресурсам и службам ядра Linux. Он состоит из интерфейса системных вызовов ядра Linux и подпрограмм библиотеки GNU C (glibc). Основное внимание при разработке Linux API было направлено на обеспечение полезных функций спецификаций, определенных в POSIX, в разумно совместимом, надежном и производительном виде, а также на предоставление дополнительных полезных функций, не определенных в POSIX, как и ядро - API пользовательского пространства других систем, реализующих POSIX API, также предоставляют дополнительные функции, не определенные в POSIX.
Linux API по своему выбору сохранялся стабильным на протяжении десятилетий за счет политики не вносить критические изменения; эта стабильность гарантирует переносимость исходного кода . В то же время разработчики ядра Linux исторически консервативно и скрупулезно относились к введению новых системных вызовов.
Для POSIX API написано много доступного бесплатного программного обеспечения с открытым исходным кодом . Поскольку в ядро Linux идет гораздо больше разработки по сравнению с другими POSIX-совместимыми комбинациями ядра и стандартной библиотеки C, ядро Linux и его API были дополнены дополнительными функциями. Поскольку эти дополнительные функции обеспечивают техническое преимущество, программирование для Linux API предпочтительнее, чем для POSIX-API. Хорошо известными текущими примерами являются udev , systemd и Weston . Такие люди, как Леннарт Поеттеринг, открыто выступают за предпочтение Linux API перед POSIX API, где это дает преимущества.
На FOSDEM 2016 Майкл Керриск объяснил некоторые предполагаемые проблемы с API-интерфейсом пользовательского пространства ядра Linux, описав, что он содержит множество ошибок проектирования, будучи нерасширяемым, неподдерживаемым, чрезмерно сложным, ограниченным по назначению, нарушающим стандарты и непоследовательным. . Большинство этих ошибок невозможно исправить, потому что это нарушит ABI, который ядро представляет пользовательскому пространству.
Интерфейс системного вызова ядра Linux
Интерфейс системного вызова - это обозначение всех реализованных и доступных системных вызовов в ядре. Различные подсистемы, такие как DRM, определяют свои собственные системные вызовы, и все это называется интерфейсом системных вызовов.
Публично обсуждаются различные вопросы, связанные с организацией системных вызовов ядра Linux. На проблемы указывали Энди Лютомирски, Майкл Керриск и другие.
Стандартная библиотека C
Стандартная библиотека C обертка вокруг системных вызовов ядра Linux; Комбинация интерфейса системных вызовов ядра Linux и стандартной библиотеки C - вот что строит Linux API.
Дополнения к POSIX
Как и в других Unix-подобных системах, существуют дополнительные возможности ядра Linux, которые не являются частью POSIX:
- Подсистема cgroups , системные вызовы, которые она представляет, и libcgroup
- Системные вызовы Direct Rendering Manager , особенно частные ioctl драйвера для отправки команд, не являются частью спецификаций POSIX.
- Расширенная звуковая архитектура Linux может устанавливать системные вызовы, которые не являются частью спецификаций POSIX.
- Системные вызовы
futex(быстрый мьютекса) в пользовательском пространстве,epoll,splice,dnotify,fanotify, иinotifyбыл эксклюзивом для ядра Linux до сих пор. - Системный вызов
getrandomбыл представлен в версии 3.17 основной ветки ядра Linux. -
memfdбыл предложен разработчиками kdbus-
memfd_createбыл объединен с основной веткой ядра Linux в версии ядра 3.17
-
-
readaheadинициирует "упреждающее чтение" файла в кеш страницы
DRM имеет первостепенное значение для разработки и реализации четко определенных и эффективных бесплатных драйверов графических устройств с открытым исходным кодом, без которых ускорение рендеринга не было бы доступно вообще, или, что еще хуже, только 2D-драйверы были бы доступны в X.Org. Сервер . DRM была разработана для Linux, а с тех пор была перенесена и на другие операционные системы.
Другие библиотеки
- libdrm (для диспетчера прямого рендеринга )
- libnl (набор libnl представляет собой набор библиотек, предоставляющих API для интерфейсов ядра Linux на основе протокола netlink.)
- libevdev (для evdev )
- libasound ( Расширенная звуковая архитектура Linux )
- …
Linux ABI
Термин Linux ABI относится к ABI между ядром и пользовательским пространством. Применение двоичного интерфейса относится к скомпилированных бинарных файлов, в машинном коде . Следовательно, любой такой ABI привязан к набору команд . Определение полезного ABI и поддержание его стабильности - это не столько ответственность разработчиков ядра Linux или разработчиков библиотеки GNU C, сколько задача для дистрибутивов Linux и независимых поставщиков программного обеспечения (ISV), которые хотят продавать и обеспечивать поддержку своих проприетарное программное обеспечение в виде двоичных файлов только для такого одного Linux ABI, в отличие от поддержки нескольких Linux ABI.
ABI должен быть определен для каждого набора инструкций, такого как x86 , x86-64 , MIPS , ARMv7-A (32-разрядный), ARMv8-A (64-разрядный) и т. Д. С порядком байтов , если оба поддерживаются.
Он должен иметь возможность компилировать программное обеспечение с разными компиляторами в соответствии с определениями, указанными в ABI, и обеспечивать полную двоичную совместимость. Бесплатными компиляторами и программным обеспечением с открытым исходным кодом являются, например, GNU Compiler Collection , LLVM / Clang .
На самом деле конечных пользователей интересует не Linux API (или Windows API), а ABI.
Внутриядерные API
Существует множество внутренних API-интерфейсов ядра, чтобы все подсистемы взаимодействовали друг с другом. Они остаются достаточно стабильными, но нет никаких гарантий стабильности. В случае, если новое исследование или идеи делают изменения благоприятными, API изменяется, все необходимые переписывания и тестирования должны выполняться автором.
Ядро Linux - это монолитное ядро, поэтому драйверы устройств являются компонентами ядра. Чтобы облегчить бремя компаний, поддерживающих свои (проприетарные) драйверы устройств вне дерева, неоднократно запрашивались стабильные API-интерфейсы для драйверов устройств. Разработчики ядра Linux неоднократно отрицали гарантию стабильной работы встроенных в ядро API-интерфейсов для драйверов устройств. Обеспечение таких гарантий привело бы к остановке разработки ядра Linux в прошлом и все еще в будущем, и из-за природы бесплатного программного обеспечения и программного обеспечения с открытым исходным кодом в этом нет необходимости. Следовательно, ядро Linux по своему выбору не имеет стабильного встроенного API.
Внутриядерные ABI
Поскольку в ядре нет стабильных API-интерфейсов, не может быть стабильных встроенных в ядро ABI.
API абстракции
Для некоторых случаев использования Linux API считается слишком низкоуровневым, и используются API более высокого уровня абстракции. Это, конечно, все еще должно работать поверх низкоуровневых API Linux. Примеры:
- реализация спецификаций OpenGL и Vulkan в проприетарных графических драйверах Linux и бесплатная реализация с открытым исходным кодом в Mesa
- реализация спецификации OpenAL
- Простой уровень DirectMedia : API абстракции для ввода / звука / и т. Д. доступен для многих операционных систем
- Простая и быстрая мультимедийная библиотека : как указано выше
Смотрите также
- Программный интерфейс Linux , Майкл Керриск
- Семафор (программирование)
-
системный вызов - это функция для облегчения программам запрашивать службы у ядра
- eventfd ()
- netlink - семейство сокетов, используемых для IPC между процессами ядра и пользовательского пространства, разработанное как преемник ioctl ; Netlink был добавлен Аланом Коксом во время разработки ядра Linux 1.3 в качестве интерфейса символьного драйвера для обеспечения множественных двунаправленных каналов связи между ядром и пользовательским пространством. Затем Алексей Кузнецов расширил его во время разработки ядра Linux 2.1, чтобы обеспечить гибкий и расширяемый интерфейс обмена сообщениями с новой усовершенствованной инфраструктурой маршрутизации. С тех пор сокеты Netlink стали одним из основных интерфейсов, которые подсистемы ядра предоставляют приложениям пользовательского пространства в Linux. Современные драйверы WNIC используют его для связи с пользовательским пространством.
-
Windows API - статья о различных API, доступных в операционных системах Microsoft Windows
- windows.h - файл заголовка для языка программирования C, который содержит объявления для всех функций в Windows API.
- Wine - слой совместимости между Linux и программами, написанными для Microsoft Windows.
- libhybris - уровень совместимости между Linux и программами, написанными для Android
использованная литература
внешние ссылки
- Linux Kernel API 5.0 , API управления памятью 5.0 (новый формат sphinx )
- API ядра Linux 2.6.20 и 4.12 (в устаревшем формате htmldocs)
- Обзор изменений API / ABI для Linux
- Книга Linux Programming Interface , Linux и glibc API меняются с момента выпуска Linux Programming Interface в 2010 году.
- Интерактивная карта ядра Linux с основными функциями и структурами API, версия PDF
- Драйверы устройств Linux от Джонатана Корбета, Грега Кроа-Хартмана и Алессандро Рубини, 3-е издание
- Объяснение связанного списка ядра Linux