Интерфейсы ядра Linux - Linux kernel interfaces

Image
Linux API, Linux ABI и встроенные в ядро ​​API и ABI

Ядро Linux предоставляет несколько интерфейсов для приложений пользовательского пространства, которые используются для разных целей и имеют разные свойства по своей конструкции. В ядре Linux есть два типа интерфейса прикладного программирования (API) , которые не следует путать: API "ядро – пользовательское пространство" и API "внутреннее ядро".

Linux API

Image
Linux API состоит из интерфейса системы вызовов в Linux ядра, в GNU C Library (по GNU ), libcgroup , libdrm , libalsa и libevdev (по freedesktop.org ).
Image
Linux API против POSIX 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

Image
Библиотека GNU C - это оболочка интерфейса системных вызовов ядра Linux.

Стандартная библиотека 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, а с тех пор была перенесена и на другие операционные системы.

Другие библиотеки

Linux ABI

Image
Linux API и 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 абстракции

Image
OpenGL действительно представляет собой API абстракции, позволяющий использовать различные графические процессоры от нескольких поставщиков без необходимости программировать для каждого из них отдельно.
Image
Но реализация спецификации OpenGL выполняется на CPU в контексте работающей операционной системы. Одна из целей разработки Vulkan заключалась в том, чтобы сделать «графический драйвер», то есть реализацию графического API, меньше.

Для некоторых случаев использования Linux API считается слишком низкоуровневым, и используются API более высокого уровня абстракции. Это, конечно, все еще должно работать поверх низкоуровневых API Linux. Примеры:

Смотрите также

  • Программный интерфейс Linux , Майкл Керриск
  • Семафор (программирование)
  • системный вызов  - это функция для облегчения программам запрашивать службы у ядра
    • eventfd ()
    • netlink  - семейство сокетов, используемых для IPC между процессами ядра и пользовательского пространства, разработанное как преемник ioctl ; Netlink был добавлен Аланом Коксом во время разработки ядра Linux 1.3 в качестве интерфейса символьного драйвера для обеспечения множественных двунаправленных каналов связи между ядром и пользовательским пространством. Затем Алексей Кузнецов расширил его во время разработки ядра Linux 2.1, чтобы обеспечить гибкий и расширяемый интерфейс обмена сообщениями с новой усовершенствованной инфраструктурой маршрутизации. С тех пор сокеты Netlink стали одним из основных интерфейсов, которые подсистемы ядра предоставляют приложениям пользовательского пространства в Linux. Современные драйверы WNIC используют его для связи с пользовательским пространством.
  • Windows API  - статья о различных API, доступных в операционных системах Microsoft Windows
  • Wine  - слой совместимости между Linux и программами, написанными для Microsoft Windows.
  • libhybris - уровень совместимости между Linux и программами, написанными для Android

использованная литература

внешние ссылки