Ядро 6.1
12.12.2022
После двух месяцев разработки Линус Торвальдс представил релиз ядра 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", которая позиционируется как более эффективная замена структуре "red-black tree". Maple tree представляет собой вариант B-tree, поддерживающий индексацию по диапазонам значений и спроектированный для эффективного использования кэша современных процессоров. На 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.
|
|