12 декабря 2022 года

Комбинация маскотов GNU и Linux

После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 6.1. Среди наиболее заметных изменений: поддержка разработки драйверов и модулей на языке Rust, модернизация механизма определения используемых страниц памяти, специальный менеджер памяти для BPF-программ, система диагностики проблем с памятью KMSAN, механизм защиты KCFI (Kernel Control-Flow Integrity), внедрение структуры Maple tree.

В новую версию принято 15115 исправлений от 2139 разработчиков, размер патча — 51 МБ, что примерно в 2 раза меньше размера патчей от ядер 6.0 и 5.19. Изменения затронули 13165 файлов, добавлено 716247 строк кода, удалено 304560 строк. Около 45 % всех представленных в 6.1 изменений связаны с драйверами устройств, примерно 14 % изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 14 % связано с сетевым стеком, 3 % — с файловыми системами и 3 % c внутренними подсистемами ядра.

Основные новшества в ядре 6.1:

  • Память и системные сервисы:
    • Добавлена возможность использования языка Rust в качестве второго языка для разработки драйверов и модулей ядра. Основным мотивом поддержки Rust является упрощение написания безопасных и качественных драйверов устройств за счёт снижения вероятности совершения ошибок при работе с памятью. Поддержка Rust неактивна по умолчанию и не приводит к включению Rust в число обязательных сборочных зависимостей к ядру. В ядро пока принят минимальный урезанный вариант патчей, который сокращён с 40 до 13 тысяч строк кода и обеспечивает только необходимый минимум, достаточный для сборки простого модуля ядра, написанного на языке Rust. В дальнейшем планируется постепенно наращивать имеющуюся функциональность, перенося и другие изменения из ветки Rust-for-Linux. Параллельно развиваются проекты по использованию предложенной инфраструктуры для разработки на языке Rust драйверов накопителей NVMe, сетевого протокола 9p и GPU Apple M1.
    • Для систем на базе архитектур AArch64, RISC-V и LoongArch с EFI реализована возможность прямой загрузки сжатых образов ядра. Добавлены обработчики для загрузки, запуска и выгрузки образов ядра, вызываемые напрямую из EFI zboot. Также добавлены обработчики установки и удаления протоколов из БД протоколов EFI. Ранее распаковка осуществлялась отдельным загрузчиком, а теперь это может делать обработчик в самом ядре — образ ядра формируется в виде EFI-приложения.
    • В состав принята часть патчей с реализацией многоуровневневой модели управления памятью, позволяющей разделять банки памяти с разными характеристиками производительности. Например, наиболее интенсивно используемые страницы могут размещаться в наиболее быстрой памяти, а редко используемые страницы могут хранится в относительно медленной памяти. В ядро 6.1 принят механизм для определения нахождения интенсивно используемых страниц в медленной памяти для их продвижения в быструю память, а также реализована общая концепция уровней памяти и их относительной производительности.
    • В состав включён механизм MGLRU (Multi-Generational LRU), который заменил собой старую реализацию LRU (Least Recently Used) на основе двух очередей на многоступенчатую структуру, лучше определяющую какие страницы памяти по настоящему используются, а какие можно вытеснить в раздел подкачки.
    • Добавлена поддержка предложенной инженерами Oracle структуры данных «maple tree», которая позиционируется как более эффективная замена структуре «красно-чёрного дерева». Maple tree представляет собой вариант B-дерева, поддерживающий индексацию по диапазонам значений и спроектированный для эффективного использования кэша современных процессоров. На maple tree уже переведены некоторые подсистемы управления памятью, что положительно отразилось на их производительности. В будущем maple tree может использоваться для реализации блокировок по диапазонам (range locking).
    • В подсистему BPF добавлена возможность создания «деструктивных» BPF-программ, специально рассчитанных на инициирование аварийного завершения работы через вызов crash_kexec(). Подобные BPF-программы могут потребоваться в отладочных целях для инициирования создания crash-дампа в определённый момент времени. Для доступа к деструктивным операциям при загрузке BPF-программы требуется указание флага BPF_F_DESTRUCTIVE, активация sysctl kernel.destructive_bpf_enabled и наличие прав CAP_SYS_BOOT.
    • Для BPF-программ предоставлена возможность перебора элементов cgroup, а также перебора ресурсов (файлы, vma, процессы и т. п.) определённого потока или задачи. Реализован новый map-тип для создания пользовательских кольцевых буферов (user ring buffer).
    • Добавлен специальный вызов для выделения памяти в BPF-программах (memory allocator), который обеспечивает более безопасное распределение памяти в контексте BPF, чем штатный kmalloc().
    • Интегрирована первая часть изменений, обеспечивающих возможность создания драйверов для устройств ввода с интерфейсом HID (Human Interface Device), реализуемых в форме BPF-программ.
    • Из ядра полностью удалён код для поддержки формата исполняемых файлов a.out, который был переведён в разряд устаревших в выпуске 5.1, а начиная с версиях 5.18 и 5.19 был отключён для основных архитектур. Формат a.out давно не применяется на системах с Linux, а генерация файлов a.out не поддерживается современными инструментальными средствами в конфигурациях для Linux по умолчанию. Загрузчик для a.out файлов может быть реализован целиком в пространстве пользователя.
    • Для систем на базе архитектуры набора команд LoongArch, применяемой в процессорах Loongson 3 5000 и реализующей новый RISC ISA, похожий на MIPS и RISC-V, реализована поддержка событий измерения производительности (perf event), kexec, kdump, SysRq-x (TLB Dump), qspinlock и JIT-компиляции BPF. Добавлен типовой драйвер для ноутбуков, использующий ACPI.
    • В интерфейсе асинхронного ввода/вывода io_uring предложен новый режим IORING_SETUP_DEFER_TASKRUN, позволяющий временно отложить выполнение связанных с кольцевым буфером работ до момента, пока не поступит запрос от приложения, что может использоваться для организации выполнения работ в пакетном режиме и предотвращения проблем с задержками из-за вытеснения приложения в неподходящий момент.
    • Процессам в пространстве пользователя предоставлена возможность инициирования преобразования диапазона обычных страниц памяти в набор больших страниц памяти (Transparent Huge-Pages).
    • Добавлена реализация устройства /dev/userfaultfd, позволяющего организовать доступ к функциональности системного вызова userfaultfd() с использованием прав доступа в ФС. Функциональность userfaultfd позволяет создавать обработчики обращений к невыделенным страницам памяти (page faults) в пространстве пользователя.
    • Повышены требования к версии утилиты GNU Make — для сборки ядра теперь требуется как минимум версия 3.82.
  • Дисковая подсистема, ввод/вывод и файловые системы:
    • В файловую систему Btrfs внесены существенные оптимизации производительности, среди прочего на порядки увеличена производительность операций fiemap и lseek (проверка совместного использования экстентов ускорена в 2-3 раза, а смена позиции в файлах ускорена в 1.3-4 раза). Кроме того ускорено журналирование inode для каталогов (в тесте dbench прирост производительности на 25 % и снижение задержек на 21 %), улучшен буферизированный ввод/вывод и сокращено потребление памяти.
    • Добавлена поддержка асинхронной буферизированной записи для приложений, использующих io_uring, применение которого демонстрирует двухкратное ускорение пропускной способности при записи и существенное снижение задержек (от 2 до 150 раз). В операцию «send» добавлена поддержка файлов, защищённых при помощи fs-verity. Сокращено потребление памяти при выполнении проверки целостности ФС. Добавлена структура block-group-tree для отслеживания групп блоков, позволяющая заметно ускорить монтирование многотерабайтных ФС.
    • В ФС ext4 добавлены оптимизации производительности, связанные с поддержанием журнала и работой в режиме только для чтения. Прекращена поддержка устаревших атрибутов noacl и nouser_xattr.
    • В файловой системе EROFS (Enhanced Read-Only File System), предназначенной для использования на разделах, доступных в режиме только для чтения, реализована возможность совместного хранения данных, дублирующихся в разных ФС.
    • В системный вызов statx() добавлена возможность вывода сведений о возможности применения к файлу прямого ввода/вывода.
    • В подсистему FUSE (Filesystems in User Space) добавлена поддержка создания временных файлов с флагом O_TMPFILE.
    • В CIFS улучшена поддержка уведомлений об изменениях в разделах SMB3, включено кэширование каталогов и улучшена обработка символических ссылок в SMB2 и SMB3.
  • Виртуализация и безопасность:
    • Заменена реализация механизма защиты CFI (Control-flow integrity), добавляющего перед каждым косвенным вызовом функции проверки для выявления некоторых форм неопределённого поведения, которые потенциально могут привести к нарушению нормального порядка выполнения (control flow) в результате применения эксплоитов, изменяющих хранимые в памяти указатели на функции. Штатная реализация CFI от проекта LLVM заменена на вариант, также основанный на использовании Clang, но специально адаптированный для защиты низкоуровневых подсистем и ядер операционных систем. В LLVM новая реализация будет предложена в выпуске Clang 16 и будет включаться опцией «-fsanitize=kcfi». Ключевым отличием новой реализации является то, что она не привязана к оптимизациям на этапе связывания (LTO) и не приводит к замене указателей функций на ссылки в таблице переходов.
    • Для LSM-модулей (Linux Security Module) предоставлена возможность создания обработчиков, перехватывающих операции по созданию пространств имён.
    • Предоставлены средства для верификации цифровых подписей PKCS#7 в BPF-программах.
    • В /dev/random возвращена возможность открытия в неблокирующем режиме (O_NONBLOCK), которая была по недосмотру удалена в ядре 5.6.
    • На системах с архитектурой x86 добавлен вывод предупреждения в случае маппинга подсистемами ядра страниц памяти, одновременно допускающими исполнение и запись. В дальнейшем рассматривается возможность полностью запретить подобный маппинг памяти.
    • Добавлен отладочный механизм KMSAN (Kernel Memory Sanitizer) для выявления использования неинициализированной памяти в ядре, а также утечек неинициализированной памяти между пространством пользователя и устройствами.
    • Внесены улучшения в криптонадёжный генератор псевдослучайных чисел CRNG, используемый в вызове getrandom. Изменения подготовлены Джейсоном Доненфилдом (англ. Jason A. Donenfeld), автором VPN WireGuard и нацелены на повышение безопасности извлечения псевдослучайных целых чисел.
  • Сетевая подсистема:
    • В TCP-стеке реализована возможность (отключена по умолчанию) раздельного использования хэш-таблиц сокетов для каждого пространства имён, что позволяет повысить производительность систем с большим числом пространств имён.
    • Удалён код для поддержки устаревшего протокола DECnet. Для пространства пользователя оставлены заглушки API, позволяющие компилировать приложения, использующие DECnet, но данные приложения не смогут подключиться к сети.
    • Документирован протокол netlink. Добавлена возможность определения отсутствующих атрибутов netlink.
    • Добавлена начальная поддержка Ethernet PSE (Power Sourcing Equipment) для организации питания устройств через Ethernet.
    • Реализована возможность создания mesh-сетей на базе Bluetooth.
    • Для MPTCP (MultiPath TCP) реализована поддержка режима быстрой установки соединения (TCP_FASTOPEN_CONNECT) и разрешены привилегированные операции из пространств имён идентификаторов пользователей. MPTCP представляет собой расширения протокола TCP для организации работы TCP-соединения с доставкой пакетов одновременно по нескольким маршрутам через разные сетевые интерфейсы, привязанные к разным IP-адресам.
    • Во встроенную в ядро реализацию протокола TLS добавлена поддержка алгоритма ARIA-GCM и возможность применения 256-разрядных ключей при использовании offload-ускорения.
  • Оборудование:
    • В драйвере amdgpu добавлена поддержка проброса DSC (Display Stream Compression) для сжатия данных без потерь при обмене информацией с экранами, поддерживающими очень большое разрешение. Продолжена работа по обеспечению поддержки платформ AMD RDNA3 (RX 7000) и CDNA (Instinct). Добавлена поддержка IP-компонентов DCN 3.2, SMU 13.x, NBIO 7.7, GC 11.x, PSP 13.x, SDMA 6.x и GMC 11.x. В драйвере amdkfd (для дискретных GPU AMD, таких как Polaris) реализована поддержка GFX 11.0.3.
    • В драйвере i915 (Intel) включена поддержка GPU Meteor Lake. Для Meteor Lake и более новых GPU обеспечена поддержка интерфейса DP 2.0 (DisplayPort). Добавлены идентификаторы для видеокарт на базе микроархитектуры Alder Lake S.
    • Добавлена поддержка звуковых подсистем, реализованных в процессорах Apple Silicon, Intel SkyLake и Intel KabyLake. В звуковом драйвере CS35L41 HDA обеспечена поддержка перехода в спящий режим. Добавлена поддержка ASoC (ALSA System on Chip) для встроенных звуковых чипов Apple Silicon, AMD Rembrant DSPs, AMD Pink Sardine ACP 6.2, Everest ES8326, Intel Sky Lake и Kaby Lake, Mediatek MT8186, NXP i.MX8ULP DSPs, Qualcomm SC8280XP, SM8250, SM8450 и Texas Instruments SRC4392
    • Добавлена поддержка LCD-панелей Samsung LTL101AL01, B120XAN01.0, R140NWF5 RH, Densitron DMT028VGHMCMI-1A TFT, AUO B133UAN02.1, IVO M133NW4J-R3, Innolux N120ACA-EA1, AUO B116XAK01.6, BOE NT116WHM-N21, INX N116BCA-EA2, INX N116BCN-EA1, Multi-Inno Technology MI0800FT-9.
    • Добавлена поддержка AHCI SATA-контроллеров, используемых в SoC Baikal-T1.
    • Добавлена поддержка Bluetooth-чипов MediaTek MT7921, Intel Magnetor (CNVi, Integrated Connectivity), Realtek RTL8852C, RTW8852AE и RTL8761BUV (Edimax BT-8500).
    • В драйвер ath11k для беспроводных модулей Qualcomm добавлена поддержка спектрального сканирования в диапазоне 160 MHz, реализован многопоточный NAPI, улучшена поддержка Wi-Fi чипов Qualcomm WCN6750.
    • Добавлены драйверы для клавиатуры к PinePhone, тачпадов InterTouch (ThinkPad P1 G3), X-Box Adaptive Controller, PhoenixRC Flight Controller, VRC-2 Car Controller, DualSense Edge Controller, управляющих панелей IBM (IBM Operation Panel), пультов XBOX One Elite, планшетов XP-PEN Deco Pro S и Intuos Pro Small (PTH-460).
    • Добавлен драйвер для криптографических ускорителей Aspeed HACE (Hash and Crypto Engine).
    • Добавлена поддержка интегрированных Thunderbolt/USB4 контроллеров Intel Meteor Lake.
    • Добавлена поддержка смартфонов Sony Xperia 1 IV, Samsung Galaxy E5, E7 и Grand Max, Pine64 Pinephone Pro.
    • Добавлена поддержка ARM SoC и плат: AMD DaytonaX, Mediatek MT8186, Rockchips RK3399 и RK3566, TI AM62A, NXP i.MX8DXL, Renesas R-Car H3Ne-1.7G, Qualcomm IPQ8064-v2.0, IPQ8062, IPQ8065, Kontron SL/BL i.MX8MM OSM-S, MT8195 (Acer Tomato), Radxa ROCK 4C+, NanoPi R4S Enterprise Edition, JetHome JetHub D1p. Обновлены драйверы для SoC Samsung, Mediatek, Renesas, Tegra, Qualcomm, Broadcom и NXP.

Одновременно латиноамериканский Фонд свободного ПО сформировал вариант полностью свободного ядра 6.1 — Linux-libre 6.1-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске проведена чистка нового драйвера rtw8852b и DTS-файлов для разных SoC Qualcomm и MediaTek с процессорами на базе архитектуры AArch64. Обновлён код чистки блобов в драйверах и подсистемах amdgpu, i915, brcmfmac, r8188eu, rtw8852c, Intel ACPI. Откорректирована чистка устаревших драйверов tm6000 TV cards, cpia2 v4l, sp8870, av7110.

Источники

править
 
 
Creative Commons
Эта статья содержит материалы из статьи «Релиз ядра Linux 6.1», опубликованной OpenNET и распространяющейся на условиях лицензии Creative Commons Attribution (CC BY) — указание автора, источник и лицензию.

Комментарии

Викиновости и Wikimedia Foundation не несут ответственности за любые материалы и точки зрения, находящиеся на странице и в разделе комментариев.