Из Википедии, бесплатной энциклопедии
Перейти к навигации Перейти к поиску
Linux API, Linux ABI и встроенные в ядро ​​API и ABI

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

Linux API [ править ]

Linux API состоит из интерфейса системы вызовов в Linux ядра, в GNU C Library (по GNU ), libcgroup , [1] libdrm , libalsa и libevdev [2] (по freedesktop.org ).
Linux API против POSIX API

Linux API - это API-интерфейс ядра и пользовательского пространства, который позволяет программам в пользовательском пространстве получать доступ к системным ресурсам и службам ядра Linux. [3] Он состоит из интерфейса системных вызовов ядра Linux и подпрограмм библиотеки GNU C (glibc). Основное внимание при разработке Linux API было направлено на обеспечение полезных функций спецификаций, определенных в POSIX, в разумно совместимом, надежном и производительном виде, а также на предоставление дополнительных полезных функций, не определенных в POSIX, как и ядро ​​- API пользовательского пространства других систем, реализующих POSIX API, также предоставляют дополнительные функции, не определенные в POSIX.

Linux API по своему выбору сохранялся стабильным на протяжении десятилетий за счет политики не вносить критические изменения; эта стабильность гарантирует переносимость исходного кода . [4] В то же время разработчики ядра Linux исторически консервативно и скрупулезно относились к введению новых системных вызовов. [ необходима цитата ]

Для POSIX API написано много доступного бесплатного программного обеспечения с открытым исходным кодом . Поскольку в ядро ​​Linux идет гораздо больше разработки по сравнению с другими POSIX-совместимыми комбинациями ядра и стандартной библиотеки C, [ необходима цитата ] ядро Linux и его API были дополнены дополнительными функциями. Поскольку эти дополнительные функции обеспечивают техническое преимущество, программирование для Linux API предпочтительнее, чем для POSIX-API. Хорошо известными текущими примерами являются udev , systemd и Weston . [5] Такие люди, как Леннарт Поеттеринг, открыто выступают за предпочтение Linux API перед POSIX API, где это дает преимущества.[6]

На FOSDEM 2016 Майкл Керриск объяснил некоторые предполагаемые проблемы с API-интерфейсом пользовательского пространства ядра Linux, описав, что он содержит множество ошибок проектирования, будучи нерасширяемым, неподдерживаемым, чрезмерно сложным, ограниченным по назначению, нарушающим стандарты и непоследовательным. . Большинство этих ошибок невозможно исправить, потому что это нарушит ABI, который ядро ​​представляет пользовательскому пространству. [7]

Интерфейс системных вызовов ядра Linux [ править ]

Интерфейс системного вызова - это обозначение всех реализованных и доступных системных вызовов в ядре. Различные подсистемы, такие как DRM, определяют свои собственные системные вызовы, и все это называется интерфейсом системных вызовов.

Публично обсуждаются различные вопросы, связанные с организацией системных вызовов ядра Linux. На проблемы указывали Энди Лютомирски, Майкл Керриск и другие. [8] [9] [10] [11]

Стандартная библиотека C [ править ]

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

Стандартная библиотека C обертка вокруг системных вызовов ядра Linux; Комбинация интерфейса системных вызовов ядра Linux и стандартной библиотеки C - вот что строит Linux API.

  • Библиотека GNU C (glibc)
  • Встроенный GLIBC
  • uClibc
  • klibc
  • Newlib
  • мусл
  • диета
  • libbionic и libhybris

Дополнения к POSIX [ править ]

Как и в других Unix-подобных системах, существуют дополнительные возможности ядра Linux, которые не являются частью POSIX:

  • подсистема cgroups , системные вызовы, которые она представляет, и libcgroup [1]
  • Системные вызовы Direct Rendering Manager , особенно частные ioctl драйвера для отправки команд, не являются частью спецификаций POSIX.
  • Расширенная звуковая архитектура Linux может устанавливать системные вызовы, которые не являются частью спецификаций POSIX.
  • Системные вызовы futex(быстрый мьютекса) в пользовательском пространстве, epoll, splice, dnotify, fanotify, и inotifyбыл эксклюзивом для ядра Linux до сих пор.
  • Системный вызов getrandomбыл представлен в версии 3.17 основной ветки ядра Linux [12]
  • memfdбыл предложен разработчиками kdbus [13]
    • memfd_create был объединен с основной веткой ядра Linux в версии ядра 3.17
  • readahead инициирует "упреждающее чтение" файла в кеш страницы

DRM имеет первостепенное значение для разработки и реализации четко определенных и эффективных бесплатных драйверов графических устройств с открытым исходным кодом, без которых ускорение рендеринга не было бы доступно вообще, или, что еще хуже, только 2D-драйверы были бы доступны в X.Org. Сервер . DRM была разработана для Linux, а с тех пор была перенесена и на другие операционные системы. [14]

Другие библиотеки [ править ]

  • libdrm (для диспетчера прямого рендеринга )
  • libnl (набор libnl представляет собой набор библиотек, предоставляющих API для интерфейсов ядра Linux на основе протокола netlink.)
  • libevdev (для evdev )
  • libasound ( Расширенная звуковая архитектура Linux )

Linux ABI [ править ]

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. [15]

Внутриядерные ABI [ править ]

Поскольку в ядре нет стабильных API-интерфейсов, не может быть стабильных встроенных в ядро ​​ABI. [16]

API абстракции [ править ]

OpenGL действительно представляет собой API абстракции, позволяющий использовать различные графические процессоры нескольких производителей без необходимости программировать для каждого из них отдельно.
Но реализация спецификации OpenGL выполняется на CPU в контексте работающей операционной системы. Одна из целей разработки Vulkan заключалась в том, чтобы сделать «графический драйвер», то есть реализацию графического 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

Ссылки [ править ]

  1. ^ a b "ControlGroupInterface" . freedesktop.org .
  2. ^ "Либевдев" . freedesktop.org .
  3. ^ Алессандро Рубини (2006-11-02). «Системные вызовы ядра» . linux.it . Проверено 11 ноября 2014 .
  4. ^ Линус Торвальдс (2012-12-23). «Re: [Регрессия с патчем] Фиксация носителя приводит к неправильному использованию пользовательского пространства (было: Re: Linux 3.8-rc1)» . Список рассылки ядра Linux . Проверено 26 августа 2014 . Если изменение приводит к нарушению работы пользовательских программ, это ошибка ядра. Мы НИКОГДА не виним пользовательские программы.
  5. ^ «Выбор между портативностью и инновациями» . LWN.net . 2011-03-02.
  6. ^ «Интервью: Леннарт Поеттеринг - Леннарт Поеттеринг расскажет о« Systemd: за пределами init »на FOSDEM 2011» . fosdem.org. 2011 . Проверено 16 июня 2014 . На самом деле, как я вижу, Linux API взял на себя роль POSIX API, а Linux является центром всей разработки свободного программного обеспечения. В связи с этим я могу только порекомендовать разработчикам попытаться взломать только Linux и ощутить свободу и возможности, которые он предлагает вам. Итак, возьмите себе копию интерфейса программирования Linux , игнорируйте все, что в нем говорится о совместимости с POSIX, и взломайте свое потрясающее программное обеспечение для Linux. Это очень успокаивает!
  7. ^ Майкл Керриск (31.01.2016). «Как разработать API ядра Linux» . Проверено 4 февраля 2016 .
  8. ^ «Организация системных вызовов» .
  9. ^ "Создание универсального списка системных вызовов?" . LKML . 2014-02-27.
  10. ^ «Флаги как шаблон проектирования API системного вызова» . LWN.net . 2014-02-12.
  11. ^ "О vsyscalls и vDSO" . LWN.net . 2011-06-08.
  12. ^ "[PATCH, RFC] random: ввести системный вызов getrandom (2)" . LKML . 2014-07-17.
  13. ^ "memfd.c" . Архивировано из оригинала на 2014-04-22.
  14. ^ «NetBSD 7.0, наконец, получит драйверы DRM / KMS» . Фороникс . 2014-03-19.
  15. ^ «Интерфейс драйвера ядра Linux» .
  16. ^ «Анализ изменений ABI в ядре Linux» . Лаборатория ABI Андрея Пономаренко. 2016-03-15.

Внешние ссылки [ править ]

  • 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 меняются с момента выпуска The Linux Programming Interface в 2010 году.
  • Интерактивная карта ядра Linux с основными функциями и структурами API, версия PDF
  • Драйверы устройств Linux от Джонатана Корбета, Грега Кроа-Хартмана и Алессандро Рубини, 3-е издание
  • Объяснение связанного списка ядра Linux