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

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

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

Linux API

В Linux API состоит из интерфейса системных вызовов ядра Linux, Библиотека GNU CGNU ), libcgroup,[1] libdrm, libalsa и libevdev[2]freedesktop.org ).
Linux API vs. POSIX API

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

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

Много доступно бесплатное программное обеспечение с открытым исходным кодом написан для POSIX API. Поскольку в ядро ​​Linux идет гораздо больше разработки по сравнению с другими POSIX-совместимыми комбинациями ядра и стандартной библиотеки C,[нужна цитата ] ядро Linux и его API были дополнены дополнительными функциями. Поскольку эти дополнительные функции обеспечивают техническое преимущество, программирование для Linux API предпочтительнее, чем для POSIX-API. Хорошо известные современные примеры: udev, systemd и Вестон.[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.

Дополнения к POSIX

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

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

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

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, LLVM /Лязг.

На самом деле конечных пользователей интересует не Linux API (или Windows API), а ABI.

Внутриядерные API

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

Ядро Linux - это монолитное ядро, поэтому драйверы устройств являются компонентами ядра. Чтобы облегчить бремя компаний, поддерживающих свои (проприетарные) драйверы устройств вне дерева, неоднократно запрашивались стабильные API-интерфейсы для драйверов устройств. Разработчики ядра Linux неоднократно отрицали гарантии стабильных встроенных в ядро ​​API для драйверов устройств. Обеспечение таких гарантий привело бы к остановке разработки ядра Linux в прошлом и все еще в будущем, и из-за природы бесплатного программного обеспечения с открытым исходным кодом в этом нет необходимости. Следовательно, по выбору, ядро ​​Linux не имеет стабильный в ядре API.[15]

Внутриядерные ABI

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

API абстракции

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

Рекомендации

  1. ^ а б "ControlGroupInterface". freedesktop.org.
  2. ^ "либевдев". freedesktop.org.
  3. ^ Алессандро Рубини (02.11.2006). "Системные вызовы ядра". linux.it. Получено 2014-11-11.
  4. ^ Линус Торвальдс (23 декабря 2012 г.). «Re: [Регрессия с патчем] Фиксация носителя приводит к неправильному использованию пространства пользователя (было: Re: Linux 3.8-rc1)». Список рассылки ядра Linux. Получено 2014-08-26. Если изменение приводит к нарушению работы пользовательских программ, это ошибка ядра. Мы НИКОГДА не виним пользовательские программы.
  5. ^ «Выбор между портативностью и инновациями». LWN.net. 2011-03-02.
  6. ^ «Интервью: Леннарт Поеттеринг - Леннарт Поеттеринг расскажет о« Systemd: за пределами init »на FOSDEM 2011». fosdem.org. 2011 г.. Получено 2014-06-16. Фактически, то, как я вижу вещи, Linux API взял на себя роль POSIX API а Linux - центральная точка всей разработки свободного программного обеспечения. В связи с этим я могу только порекомендовать разработчикам попытаться взломать только Linux и ощутить свободу и возможности, которые он предлагает вам. Итак, получите себе копию Программный интерфейс Linux, игнорируйте все, что в нем говорится POSIX совместимость и взломайте ваше потрясающее программное обеспечение для Linux. Это очень успокаивает!
  7. ^ Майкл Керриск (2016-01-31). «Как разработать API ядра Linux». Получено 2016-02-04.
  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.

внешняя ссылка