Интерфейсы ядра Linux - Linux kernel interfaces
Эта статья поднимает множество проблем. Пожалуйста помоги Улучши это или обсудите эти вопросы на страница обсуждения. (Узнайте, как и когда удалить эти сообщения-шаблоны) (Узнайте, как и когда удалить этот шаблон сообщения)
|
Ядро Linux предоставляет несколько интерфейсов для приложений пользовательского пространства, которые используются для разных целей и имеют разные свойства по своей конструкции. Есть два типа интерфейс прикладного программирования (API) в Ядро Linux которые не следует путать: API "ядро – пользовательское пространство" и API "внутреннее ядро".
Linux 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
А Стандартная библиотека C это оболочка системных вызовов ядра Linux; Комбинация интерфейса системных вызовов ядра Linux и стандартной библиотеки C - вот что создает Linux API.
Дополнения к POSIX
Как и в других Unix-подобный систем, существуют дополнительные возможности ядра Linux, которые не являются частью POSIX:
- cgroups подсистема, которую она вызывает, и libcgroup[1]
- Системные вызовы Менеджер прямого рендеринга, особенно частные ioctl драйвера для отправки команды нет часть спецификаций POSIX.
- Расширенная звуковая архитектура Linux мог установить системные вызовы, которые не являются частью спецификаций POSIX
- Системные вызовы
фьютекс
(быстрый мьютекс пользовательского пространства),эполл
,сращивание
,уведомлять
,фантазировать
, иinotify
до сих пор были эксклюзивными для ядра Linux. - Системный вызов
getrandom
был представлен в версии 3.17 Основная линия ядра Linux[12] memfd
был предложен разработчиками kdbus[13]memfd_create
был включен в основную ветку ядра Linux в версии ядра 3.17
читать вперед
инициирует "упреждающее чтение" файла в кеш страницы
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, LLVM /Лязг.
На самом деле конечных пользователей интересует не Linux API (или Windows API), а ABI.
Внутриядерные API
Существует множество внутренних API-интерфейсов ядра, чтобы все подсистемы взаимодействовали друг с другом. Они достаточно стабильны, но нет никаких гарантий стабильности. В случае, если новое исследование или идеи делают изменение благоприятным, API изменяется, все необходимые переписывания и тестирования должны выполняться автором.
Ядро Linux - это монолитное ядро, поэтому драйверы устройств являются компонентами ядра. Чтобы облегчить бремя компаний, поддерживающих свои (проприетарные) драйверы устройств вне дерева, неоднократно запрашивались стабильные API-интерфейсы для драйверов устройств. Разработчики ядра Linux неоднократно отрицали гарантии стабильных встроенных в ядро API для драйверов устройств. Обеспечение таких гарантий привело бы к остановке разработки ядра Linux в прошлом и все еще в будущем, и из-за природы бесплатного программного обеспечения с открытым исходным кодом в этом нет необходимости. Следовательно, по выбору, ядро Linux не имеет стабильный в ядре API.[15]
Внутриядерные ABI
Поскольку в ядре нет стабильных API-интерфейсов, стабильных API-интерфейсов в ядре быть не может.[16]
API абстракции
Для некоторых случаев использования Linux API считается слишком низкоуровневым, и используются API более высокого уровня абстракции. Это, конечно, все еще должно работать поверх низкоуровневых API Linux. Примеры:
- реализация OpenGL и Вулкан спецификации проприетарных графических драйверов Linux и бесплатную реализацию с открытым исходным кодом в Меса
- реализация 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
- Вино - уровень совместимости между Linux и программами, написанными для Microsoft Windows
- libhybris - уровень совместимости между Linux и программами, написанными для Android
Рекомендации
- ^ а б "ControlGroupInterface". freedesktop.org.
- ^ "либевдев". freedesktop.org.
- ^ Алессандро Рубини (02.11.2006). "Системные вызовы ядра". linux.it. Получено 2014-11-11.
- ^ Линус Торвальдс (23 декабря 2012 г.). «Re: [Регрессия с патчем] Фиксация носителя приводит к неправильному использованию пространства пользователя (было: Re: Linux 3.8-rc1)». Список рассылки ядра Linux. Получено 2014-08-26.
Если изменение приводит к нарушению работы пользовательских программ, это ошибка ядра. Мы НИКОГДА не виним пользовательские программы.
- ^ «Выбор между портативностью и инновациями». LWN.net. 2011-03-02.
- ^ «Интервью: Леннарт Поеттеринг - Леннарт Поеттеринг расскажет о« Systemd: за пределами init »на FOSDEM 2011». fosdem.org. 2011 г.. Получено 2014-06-16.
Фактически, то, как я вижу вещи, Linux API взял на себя роль POSIX API а Linux - центральная точка всей разработки свободного программного обеспечения. В связи с этим я могу только порекомендовать разработчикам попытаться взломать только Linux и ощутить свободу и возможности, которые он предлагает вам. Итак, получите себе копию Программный интерфейс Linux, игнорируйте все, что в нем говорится POSIX совместимость и взломайте ваше потрясающее программное обеспечение для Linux. Это очень успокаивает!
- ^ Майкл Керриск (2016-01-31). «Как разработать API ядра Linux». Получено 2016-02-04.
- ^ «Организация системного вызова».
- ^ "Создание универсального списка системных вызовов?". 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 (новый сфинкс формат)
- API ядра Linux 2.6.20 и 4.12 (в устаревшем формате htmldocs)
- Обзор изменений API / ABI для Linux
- Программный интерфейс Linux книга, Linux и glibc Изменения API поскольку Программный интерфейс Linux был выпущен в 2010 году
- Интерактивная карта ядра Linux с основными функциями и структурами API, PDF версия
- Драйверы устройств Linux Джонатан Корбет, Грег Кроа-Хартман и Алессандро Рубини, 3-е издание
- Объяснение связанного списка ядра Linux