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