Введение

Свободный и открытый сервер отображения для X Window System

X.Org Server — это бесплатная и открытая реализация сервера отображения X Window System (X11), находящаяся под управлением Фонда X.Org. Реализации протокола X Window System на стороне клиента существуют в виде библиотек X11, которые служат удобными API для взаимодействия с сервером X. Существует две основные библиотеки X для X11. Первой из них была Xlib, оригинальный API X11 на языке C, но позже, в 2001 году, была создана другая библиотека X на языке C — XCB. Существуют также и другие небольшие библиотеки X, как интерфейсы для Xlib и XCB на других языках, так и небольшие автономные библиотеки X. Фонд X.Org оказывает поддержку X Server посредством упаковки релизов, сертификации (платной), оценки улучшений кода, разработки веб-сайта и обработки денежных пожертвований. Релизы разрабатываются, документируются и упаковываются разработчиками по всему миру.

Архитектура программного обеспечения

X. Org Server реализует серверную часть основного протокола X Window System версии 11 (X11) и расширения к нему, например RandR. Версия 1.16.0 включает поддержку запуска и управления на основе systemd, что повысило производительность и надежность загрузки системы. X-сервер обладает огромным количеством функциональных возможностей, которые необходимо реализовать для поддержки основного протокола X. Это включает таблицы кодов, растрирование и кэширование глифов, XLFD и основной API рендеринга, отвечающий за отрисовку графических примитивов.

Зависимый от устройства X (DDX)

Device Dependent X (DDX) — это часть X-сервера, взаимодействующая с аппаратным обеспечением. В исходном коде X.Org Server каждый каталог в директории "hw" соответствует одному DDX. Аппаратное обеспечение включает в себя графические карты, а также мыши и клавиатуры. Каждый драйвер специфичен для конкретного оборудования и реализован как отдельный загружаемый модуль.

Драйвер для 2D-графики

По историческим причинам сервер X.Org все еще содержит драйверы графических устройств, поддерживающие ту или иную форму 2D-ускорения рендеринга. В прошлом настройка режима отображения осуществлялась драйвером графического устройства X-сервера, специфичным для конкретного аппаратного обеспечения видеоконтроллера (например, GPU). К этой функциональности настройки режима была добавлена дополнительная поддержка 2D-ускорения, когда такая возможность появилась для различных GPU. Функциональность настройки режима была перенесена в DRM и предоставляется через интерфейс настройки режима DRM, а новый подход получил название "настройка режима ядра" (KMS). Однако 2D-ускорение рендеринга осталось. В Debian 2D-графические драйверы для X.Org Server упаковываются отдельно и называются xserver xorg video *. После установки файл 2D-графического драйвера можно найти в /usr/lib/xorg/modules/drivers/. Пакет xserver xorg video nouveau устанавливает nouveau drv.so размером 215 КиБ, проприетарный драйвер Nvidia GeForce устанавливает файл nvidia drv.so размером 8 МиБ, а Radeon Software устанавливает fglrx drv.so размером около 25 МиБ. Доступные свободные и открытые драйверы графических устройств разрабатываются в рамках проекта Mesa 3D. Хотя их можно перекомпилировать при необходимости, разработка проприетарных 2D-драйверов DDX значительно упрощается, когда X.Org Server сохраняет стабильный API/ABI в нескольких своих версиях. Начиная с версии 1.17, был включен универсальный метод настройки режима. Пакет xf86 video modesetting, в Debian называемый xserver xorg video modesetting, был снят с поддержки, а универсальный DDX настройки режима, который он содержал, был перемещен в пакет сервера, чтобы стать DDX по умолчанию с поддержкой KMS, обеспечивающим работу с подавляющим большинством GPU AMD, Intel и NVidia. 7 апреля 2016 года сотрудник AMD Мишель Данцер выпустил xf86 video ati версии 7.7.0 и xf86 video amdgpu версии 1.1.0, последняя из которых включает поддержку их микроархитектуры Polaris.

Архитектуры ускорения

Существуют (как минимум) XAA (XFree86 Acceleration Architecture), EXA, UXA и SNA. В системе X Window System, XFree86 Acceleration Architecture (XAA) — это архитектура драйверов, предназначенная для обеспечения доступа сервера X к аппаратному 2D-ускорению видеокарты. Она была разработана Хармом Ханемайером в 1996 году и впервые выпущена в версии XFree86 3.3. Она была полностью переписана для XFree86 4.0 и впоследствии удалена из сервера X.Org 1.13. Большинство драйверов реализуют ускорение, используя модуль XAA. XAA включена по умолчанию, однако ускорение отдельных функций может быть отключено при необходимости в файле конфигурации сервера (XF86Config или xorg.conf). Драйвер для чипсета ARK служил первоначальной платформой для разработки XAA. В версиях X.Org Server 6.9/7.0 была выпущена EXA как замена XAA, поскольку XAA практически не даёт прироста производительности для современных видеокарт. EXA рассматривается как промежуточный этап на пути к переходу всего сервера X на использование OpenGL.

Гламур

Glamor — это универсальный, аппаратно независимый 2D драйвер ускорения для X-сервера, который преобразует X-примитивы в операции OpenGL, используя любые доступные 3D драйверы OpenGL. Таким образом, он функционально аналогичен Quartz Extreme и QuartzGL (ускорению 2D-графики) для Apple Quartz Compositor. Основная цель GLAMOR — устареть и заменить все 2D графические драйверы устройств и архитектуры ускорения DDX, что позволит избежать необходимости написания специализированных 2D драйверов X для каждого поддерживаемого графического чипсета. Glamor требует 3D драйвер с поддержкой шейдеров. Работа над оптимизацией производительности Glamor была принята к участию в Google Summer of Code 2014. Glamor поддерживает Xephyr и DRI3 и может увеличить скорость некоторых операций на 700–800%. После включения в основную ветку версии 1.16 X.Org Server разработка Glamor продолжалась, и были опубликованы патчи для выпуска 1.17.

Виртуализация

Существует отдельный и специализированный DDX для экземпляров сервера X.Org, работающих на гостевой системе в виртуализированной среде: xf86-video-qxl, драйвер для "видеоустройства QXL". SPICE использует этот драйвер, хотя и функционирует без него. В репозиториях Debian он называется xserver-xorg-video-qxl, см. https://packages.debian.org/buster/xserver-xorg-video-qxl

Входный стек

В Debian драйверы, связанные с устройствами ввода, находятся в каталоге /usr/lib/xorg/modules/input/. Эти драйверы имеют имена, например, evdev drv.so, mouse drv.so, synaptics drv.so или wacom drv.so. Начиная с версии 1.16, X.Org Server получил поддержку библиотеки libinput в виде обертки xf86-input-libinput. На конференции XDC 2015 в Торонто libratbag был представлен как универсальная библиотека для поддержки настраиваемых мышей. xserver-xorg-input-joystick – это модуль ввода для сервера X.Org, предназначенный для обработки классических джойстиков и геймпадов, который не предназначен для игр под X, а для управления курсором с помощью джойстика или геймпада.

МПК

Сервер X.Org и любой клиент X работают как отдельные процессы. В Unix/Linux процесс не имеет информации о других процессах. Для взаимодействия с другим процессом он полностью полагается на ядро для управления обменом данными через доступные механизмы межпроцессного взаимодействия (IPC). Для связи с процессами, работающими на той же машине, используются сокеты домена Unix. Специальные вызовы функций сокетов являются частью интерфейса системных вызовов. Хотя сокеты домена Internet могут использоваться локально, сокеты домена Unix более эффективны, поскольку не имеют накладных расходов протокола (контрольных сумм, порядка байтов и т.п.). Сервер X.Org не использует D-Bus. Сокеты – наиболее распространенный метод межпроцессного взаимодействия (IPC) между процессами сервера X и его клиентами X. Он предоставляет интерфейс прикладного программирования (API) для связи в домене TCP/IP, а также локально – только в домене UNIX. В интерфейсе X Transport Interface описаны другие API, например, TLI (Transport Layer Interface). Другие варианты IPC для взаимодействия между клиентом и сервером X требуют расширений системы X Window, например, расширение общей памяти MIT (MIT SHM).

История

Современный X. Org Foundation появился в 2004 году, когда организация, контролировавшая стандарты X и опубликовавшая официальную эталонную реализацию, объединилась с бывшими разработчиками XFree86. X11R6.7.0, первая версия сервера X. Org, была создана на основе XFree86 4.4 RC2, что привело к двойному выпуску к концу года. В X11R7.0.0 была добавлена новая модульная система сборки на основе GNU Autotools, а X11R6.9.0 сохранила старую систему сборки imake, при этом оба выпуска использовали одну и ту же кодовую базу. С тех пор ветвь X11R6.9 поддерживается в замороженном состоянии, а вся текущая разработка ведется на модульной ветви. Новая система сборки также привела к использованию стандартного динамического компоновщика dlloader для загрузки плагинов и драйверов, отказавшись от прежнего проприетарного метода. В результате модулизации бинарные файлы X11 перемещались из собственного дерева каталогов /usr/X11R6 в глобальное дерево /usr во многих Unix-системах. В июне 2006 года была предпринята еще одна попытка перенести исходный код сервера X. Org из CVS в git. Обе эти попытки преследовали долгосрочную цель привлечения новых разработчиков к проекту. Как сказал Алан Куперсмит:

В выпуске 7.1 фреймворк KDrive (небольшая реализация X, написанная Китом Паккардом, которая не основывалась на XFree86 и использовалась разработчиками X. Org в качестве полигона для новых идей, таких как EXA) был интегрирован в основную кодовую базу сервера X. Org. В 2008 году новый DRI2, основанный на драйвере настройки режима ядра (KMS), заменил DRI. Это изменение также стало важной вехой в архитектуре сервера X. Org, поскольку драйверы были перемещены из серверного и пользовательского пространства (UMS) в пространство ядра. В 2013 году Кит Паккард написал и реализовал первые версии расширений DRI3 и Present для обеспечения более быстрого и плавного 2D-рендеринга. К концу года Адам Джексон из Red Hat переписал реализацию GLX.

Релизы

ВерсияДатаX11 ВыпускОсновные характеристикиformat=dmyX11R7.0 (1.0.1)Первоначальный модульный X-сервер, архитектура EXAformat=dmyX11R7.1 (1.1.0)Интеграция KDrive, поддержка AIGLXformat=dmyX11R7.2 (1.2.0)Автоконфигурация, расширенная поддержка композитных менеджеров на основе GLformat=dmyRandR 1.2format=dmyX11R7.3 (1.4.0)Поддержка горячего подключения устройств вводаformat=dmyX11R7.4 (1.5.1)MPXformat=dmyRandR 1.3, DRI2, XInput 1.5format=dmyX11R7.5 (1.7.1)XInput 2.0, многоуказательный Xformat=dmy, обработка ввода udevformat=dmyX11R7.6 (1.9.3)format=dmyX Синхронизирующие огражденияformat=dmyformat=dmyX11R7.7 (1.12.2)XInput 2.2 (включая поддержку мультитач)format=dmyНовый API драйвера DDX, DRI2 offload, RandR 1.4, контексты OpenGL 3.x+, удаление XAAformat=dmyXInput 2.3format=dmyРасширения DRI3 и Presentformat=dmyXWayland DDX, ускорение GLAMOR, поддержка не PCI устройств, поддержка systemd logind (rootless X), получена поддержка библиотеки libinput в форме обертки под названием xf86 input libinputformat=dmyИнтеграция бывшего драйвера xf86 video modesetting generic DRM/KMS, добавлена поддержка DRI2 с GLAMORformat=dmyRandR 1.5format=dmyПотоковый ввод, синхронизация PRIME, ограничение и искажение указателя XWayland, поддержка расширения Windows DRIformat=dmyУлучшения системы сборки Meson, GLXVND позволяет использовать отдельные драйверы OpenGL для разных X-экранов, RandR leasing улучшает поддержку Steam VRformat=dmyСистема сборки Meson теперь на одном уровне с Autotools, поддержка переменной частоты обновления, жесты на тачпаде через XInput 2.4