Интерфейс прикладного программирования linux

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

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

  • 1 Linux API
    • 1.1 Интерфейс системных вызовов ядра Linux
    • 1.2 Стандартная библиотека C
      • 1.2.1 Дополнения к POSIX

      Linux API

      Linux API состоит из интерфейса системных вызовов ядра Linux, библиотеки GNU C (от GNU ), libcgroup, libdrm, libalsa и libevdev (от freedesktop.org ). Linux API против POSIX API

      Linux API — это API-интерфейс ядра и пользовательского пространства, который позволяет программам в пользовательском пространстве получать доступ к системным ресурсам и службам ядра Linux. Он состоит из интерфейса системных вызовов ядра Linux и подпрограмм из библиотеки GNU C (glibc). Основное внимание при разработке Linux API было уделено предоставлению полезных функций спецификаций, определенных в POSIX, таким образом, чтобы это было разумно y совместимый, надежный и производительный, а также для предоставления дополнительных полезных функций, не определенных в 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

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

      Библиотека GNU C — это оболочка для системных вызовов ядра Linux; Комбинация интерфейса системных вызовов ядра Linux и glibc — вот что строит Linux API.

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

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

      • cgroups подсистема, система вызывает это вводит и libcgroup
      • Системные вызовы Direct Rendering Manager, особенно частные ioctl драйвера для отправки команд, не являются частью спецификаций POSIX.
      • Advanced Linux Sound Архитектура может устанавливать системные вызовы, которые не являются частью спецификаций POSIX
      • Системные вызовы futex (быстрый мьютекс в пользовательском пространстве), epoll , splice , dnotify , fanotify и inotify до сих пор были эксклюзивными для ядра Linux.
      • Системный вызов getrandom был представлен в версии 3.17 основной ветки ядра Linux
      • , предложенной разработчиками kdbus
        • был объединен с основной веткой ядра Linux в версии ядра 3.17.

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

        Дополнительные библиотеки

        • libdrm (для Direct Rendering Manager )
        • libnl (набор libnl представляет собой набор библиотеки, предоставляющие API для интерфейсов ядра Linux на основе протокола netlink.)
        • libevdev (для evdev )
        • libasound (Advanced Linux Sound Architecture )

        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 / Clang.

        Фактически, конечные пользователи заинтересованы не в Linux API (или Windows API), а в ABI.

        Внутренние API-интерфейсы

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

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

        In-kernel ABI

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

        API абстракции

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

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

        • реализация спецификаций OpenGL и Vulkan в проприетарных графических драйверах Linux и бесплатная реализация с открытым исходным кодом в Mesa
        • реализации Спецификация OpenAL
        • Simple DirectMedia Layer : API абстракции для ввода / звука / и т. Д. доступен для многих операционных систем
        • Простая и быстрая мультимедийная библиотека : как указано выше

        См. также

        • Портал Linux
        • Интерфейс программирования 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

        Ссылки

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

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

        Источник

        Linux. Системное программирование.

        Данная книга рассказывает о системном программировании в Linux. Системное программирование — это практика написания системного ПО, низкоуровневый код которого взаимодействует непосредственно с ядром и основными системными библиотеками. Иными словами, речь далее пойдет в основном о системных вызовах Linux и низкоуровневых функциях, в частности тех, которые определены в библиотеке C. Есть немало пособий, посвященных системному программированию для UNIX-систем, но вы почти не найдете таких, которые рассматривают данную тему достаточно подробно и фокусируются именно на Linux. Еще меньше подобных книгучитывают новейшие релизы Linux и продвинутые интерфейсы, ориентированные исключительно на Linux. Эта книга не только лишена всех перечисленных недостатков, но и обладает важным достоинством: дело в том, что я написал массу кода для Linux, как для ядра, так и для системных программ, расположенных непосредственно «над ядром». На самом деле я реализовал на практике ряд системных вызовов и других функций, описанных далее. Соответственно книга содержит богатый материал, рассказывая не только о том, как должны работать системные интерфейсы, но и о том, как они действительно работают и как вы сможете использовать их с максимальной эффективностью. Таким образом, данная книга одновременно является и руководством по системному программированию для Linux, и справочным пособием, описывающим системные вызовы Linux, и подробным повествованием о том, как создавать более интеллектуальный и быстрый код. Текст написан простым, доступным языком. Независимо от того, является ли создание системного кода вашей основной работой, эта книга научит полезным приемам, которые помогут вам стать по-настоящему высокопрофессиональным программистом.

        Источник

        Читайте также:  Arch linux переменные окружения
Оцените статью
Adblock
detector