Релиз ядра Linux 5.8: крупнейшее обновление в истории

3 августа 2020 года

Wikinews-logo-ru.svg

После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.8. Среди наиболее заметных изменений: детектор состояний гонки KCSAN, универсальный механизм доставки уведомлений в пространство пользователя, поддержка оборудования для inline-шифрования, расширенные механизмы защиты для ARM64, поддержка российского процессора Baikal-T1, возможность раздельного монтирования экземпляров procfs, реализация для ARM64 механизмов защиты Shadow Call Stack и BTI.

Ядро 5.8 стало самым крупным по числу изменений из всех ядер за всё время существования проекта. При этом изменения не связаны с какой-то одной подсистемой, а охватывают разные части ядра и в основном связаны с внутренними переработками и чисткой. Больше всего изменений наблюдается в драйверах. В новую версию принято 17606 исправлений от 2081 разработчиков, которые затронули примерно 20% всех файлов в репозитории с кодом ядра. Размер патча - 65 МБ (изменения затронули 16180 файлов, добавлено 1043240 строк кода, удалено 489854 строк). Для сравнения в ветке 5.7 было внесено 15033 исправлений, а размер патча составлял 39 МБ. Около 37% всех представленных в 5.8 изменений связаны с драйверами устройств, примерно 16% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 11% связано с сетевым стеком, 3% - с файловыми системами и 4% c внутренними подсистемами ядра.

Основные новшества:

  • Виртуализация и безопасность
  • Обеспечена блокировка загрузки модулей ядра, имеющих секции с кодом, в которых одновременно выставлены биты, разрешающие исполнение и запись. Изменение реализовано в рамках более крупного проекта по избавлению ядра от применения страниц памяти, допускающих одновременно исполнение и запись.
  • Появилась возможность создания отдельных экземпляров procfs, позволяющих использовать несколько точек монтирования procfs, смонтированных с разными опциями, но отражающими одно пространство имён идентификаторов процессов (pid namespace). Ранее все точки монтирования procfs лишь отзеркаливали одно внутреннее представление и любое изменение параметров монтирования сказывалось на всех остальных точках монтирования, связанных с тем же пространством имён идентификаторов процессов. Из областей, в которых может быть востребовано монтирование с разными опциями отмечается реализация легковесной изоляции для встраиваемых систем с возможностью скрытия в procfs определённых типов процессов и информационных узлов.
  • Для платформы ARM64 реализована поддержка механизма Shadow-Call Stack, предоставляемого компилятором Clang для защиты от перезаписи адреса возврата из функции в случае переполнения буфера в стеке. Суть защиты в сохранении после передачи управления функции адреса возврата в отдельном "теневом" стеке и извлечении данного адреса перед выходом из функции.
  • Для платформы ARM64 добавлена поддержка инструкций ARMv8.5-BTI (Branch Target Indicator) для защиты выполнения наборов инструкций, на которые не должны выполняться переходы при ветвлении. Блокирование переходов на произвольные участки кода реализовано для противодействия созданию гаджетов в эксплоитах, использующих приёмы возвратно-ориентированного программирования (ROP - Return-Oriented Programming, атакующий не пытается разместить свой код в памяти, а оперирует уже имеющимися кусками машинных инструкций, завершающихся инструкцией возврата управления, из которых выстраиваются цепочка вызовов для получения нужной функциональности).
  • Добавлена поддержка оборудования для inline-шифрования блочных устройств (Inline Encryption). Устройства inlinep-шифрования обычно встроены в накопитель, но логически размещается между системной памятью и диском, осуществляя прозрачное шифрование и расшифровку ввода/вывода на основе заданных ядром ключей и алгоритма шифрования.
  • Добавлен параметр командной строки ядра "initrdmem", позволяющий указать физический адрес размещения initrd в памяти при размещении начального загрузочного образа в ОЗУ.
  • Добавлены новые capability: CAP_PERFMON для доступа к подсистеме perf и выполнения мониторинга производительности. CAP_BPF, разрешающий выполнение некоторых операций с BPF (например, загрузка BPF-программ), которые раньше требовали прав CAP_SYS_ADMIN (теперь полномочия CAP_SYS_ADMIN разделены на комбинацию CAP_BPF, CAP_PERFMON и CAP_NET_ADMIN).
  • Добавлено новое устройство virtio-mem, позволяющее реализовать горячее подключение и отключение памяти к гостевым системам.
  • Реализован отзыв операций маппинга в /dev/mem, если драйвер устройства использует перекрывающиеся области памяти.
  • Добавлена защита от уязвимости CROSSTalk/SRBDS, позволяющей восстановить результаты выполнения некоторых инструкций, выполняемых на другом ядре CPU.
  • Память и системные сервисы
  • В документ, определяющий правила оформления кода, приняты рекомендации по применению инклюзивной терминологии. Разработчикам не рекомендуется использовать связки 'master / slave' и 'blacklist / whitelist', а также отдельно слово 'slave'. Рекомендации касаются только нового использования данных терминов. Уже имеющиеся в ядре упоминания указанных слов останутся нетронутыми. В новом коде использование отмеченных терминов разрешено если того требует поддержание выдаваемого в пространство пользователя API и ABI, а также при обновлении кода для поддержки существующего оборудования или протоколов, спецификации на которые предписывают использование определённых терминов.
  • В состав включён отладочный инструмент KCSAN (Kernel Concurrency Sanitizer), предназначенный для динамического выявления состояний гонки внутри ядра. Использование KCSAN поддерживается при сборке в GCC и Clang, и требует добавления специальных модификаций на этапе компиляции для отслеживания доступа к памяти (применяются точки останова, срабатывающие при чтении или изменении памяти). Основное внимание при разработке KCSAN уделено предотвращению ложных срабатываний, масштабируемости и простоте использования.
  • Добавлен универсальный механизм доставки уведомлений из ядра в пространство пользователя. Механизм основан на штатном драйвере pipe и позволяет эффективно сплетать уведомления от ядра в каналы, открытые в пространстве пользователя. Точки приёма уведомлений представляют собой pipe-ы, открытые в специальном режиме и позволяющие накапливать в кольцевом буфере поступающие от ядра сообщения. Чтение осуществляется обычной функцией read(). Владелец канала определяет, какие из источников в ядре необходимо отслеживать и может определить фильтр для игнорирования сообщений и событий определённого типа. Из событий пока поддерживаются только операции с ключами, такие как добавление/удаление ключей и изменение их атрибутов. Указанные события планируют использовать в GNOME.
  • Продолжено развитие функциональности 'pidfd', помогающей обрабатывать ситуации с повторным использованием PID (pidfd связывается с конкретным процессом и не меняется, в том время как PID может быть привязан к другому процессу после завершения текущего процесса, ассоциированного с этим PID). В новой версии добавлена поддержка использования pidfd для прикрепления процесса к пространствам имён (указание pidfd при выполнении системного вызова setns). Применение pidfd позволяет одним вызовом управлять прикреплением процесса к подмножеству пространств имён, существенно сокращая число необходимых системных вызовов и реализуя прикрепление в атомарном режиме (если при прикреплении к одному из пространств имён возникнет сбой, то не подключатся и остальные).
  • Добавлен новый системный вызов faccessat2(), отличающийся от faccessat() дополнительным аргументом с флагами, соответствующими рекомендациям POSIX (ранее данные флаги эмулировались в Си-библиотеке, а новый faccessat2 позволяет реализовать их в ядре).
  • В Cgroup добавлена настройка memory.swap.high, которую можно использовать для замедления задач, занимающих слишком много места в разделе подкачки.
  • В интерфейс асинхронного ввода/вывода io_uring добавлена поддержка системного вызова tee().
  • Добавлен механизм "BPF iterator, предназначенный для вывода в пространство пользователя содержимого структур ядра.
  • Предоставлена возможность использования кольцевого буфера для обмена данными между BPF-программами.
  • В механизм padata, предназначенный для организации параллельного выполнения задач в ядре, добавлена поддержка многопоточных задач с балансировкой нагрузки.
  • В механизм pstore, позволяющий сохранить отладочную информацию о причине краха в области памяти, не теряемые между перезагрузками, добавлен бэкенд для сохранения информации в блочные устройства.
  • Из ветки ядра PREEMPT_RT перенесена реализация локальных блокировок.
  • Добавлен новый API AF_XDP выделения буферов, нацеленный на упрощение написания сетевых драйверов с поддержкой XDP (eXpress Data Path).
  • Для архитектуры RISC-V реализована поддержка отладки компонентов ядра при помощи KGDB.
  • До выпуска 4.8 повышены требования к версии GCC, которая может использоваться для сборки ядра. В одном из следующих выпуском планируется поднять планку до GCC 4.9.
  • Дисковая подсистема, ввод/вывод и файловые системы
  • В Device Mapper добавлен новый обработчик dm-ebs (emulate block size), который может применяться для эмуляции меньшего размера логического блока (например, для эмуляции 512-байтных секторов на дисках с размером сектора 4K).
  • В файловой системе F2FS появилась поддержка сжатия с использованием алгоритма LZO-RLE.
  • В dm-crypt добавлена поддержка шифрованных ключей.
  • В Btrfs улучшена обработка операций чтения в режиме прямого ввода/вывода. При монтировании ускорена проверка удалённых подразделов и каталогов, оставшихся без родителя.
  • В CIFS добавлен параметр "nodelete", допускающий штатные проверки прав на сервере, но запрещающий клиенту удалять файлы или каталоги.
  • В Ext4 улучшена обработка ошибки ENOSPC при использовании многопоточности. В xattr добавлена поддержка пространства имён gnu.*, используемого в GNU Hurd.
  • Для Ext4 и XFS включена поддержка операций DAX (прямой доступ к ФС в обход страничного кэша без применения уровня блочных устройств) в привязке к отдельным файлам и каталогам.
  • В системный вызов statx() добавлен флаг STATX_ATTR_DAX, при указании которого информация извлекается с использованием механизма DAX.
  • В EXFAT добавлена поддержка верификации загрузочной области.
  • В FAT улучшена упреждающая загрузка элементов ФС. Тестирование медленного 2ТБ USB-накопителя показало сокращение времени прохождения теста с 383 до 51 сек.
  • Сетевая подсистема
  • В код управления работой сетевых мостов добавлена поддержка протокола MRP (Media Redundancy Protocol), позволяющего обеспечить отказоустойчивость, закольцевав несколько Ethernet-коммутаторов.
  • В систему управления трафиком (Tc) добавлено новое действие "gate", дающее возможность определить временные интервалы для обработки и отбрасывания определённых пакетов.
  • В ядро и утилиту ethtool добавлена поддержка функций тестирования присоединённого сетевого кабеля и самодиагностики сетевых устройств.
  • В IPv6-стек добавлена поддержка алгоритма MPLS (Multiprotocol Label Switching) для маршрутизации пакетов с использованием многопротокольной коммутации по меткам (для IPv4 MPLS поддерживался и ранее).
  • Добавлена поддержка передачи пакетов IKE (Internet Key Exchange) и IPSec поверх TCP (RFC 8229) для обхода возможных блокировок UDP.
  • Добавлено сетевое блочное устройство rnbd, позволяющее организовать удалённый доступа к блочному устройству при помощи транспорта RDMA (InfiniBand, RoCE, iWARP) и протокола RTRS.
  • В TCP-стеке добавлена поддержка сжатия диапазонов в ответах выборочного подтверждения (selective acknowledgment, SACK).
  • Для IPv6 реализована поддержка TCP-LD (RFC 6069, Long Connectivity Disruptions).
  • Оборудование
  • В DRM-драйвере i915 для видеокарт Intel включена по умолчанию поддержки чипов Intel Tiger Lake (GEN12), для которых также реализована возможность использования системы динамической подстройки частоты и напряжения SAGV (System Agent Geyserville) в зависимости от требований к энергопотреблению или производительности.
  • В драйвере amdgpu добавлена поддержка пиксельного формата FP16, реализована возможность работы с шифрованными буферами в видеопамяти (TMZ, Trusted Memory Zone).
  • Добавлена поддержка датчиков энергопотребления процессоров AMD Zen и Zen2, а также датчиков температуры AMD Ryzen 4000 Renoir. Для AMD Zen и Zen2 обеспечена поддержка извлечения информации об энергопотреблении через интерфейс RAPL (Running Average Power Limit.
  • В драйвере Nouveau добавлена поддержка формата модификаторов NVIDIA. Для gv100 реализована возможность использования чересстрочных режимов развёртки. Добавлено определение vGPU.
  • В драйвере MSM (Qualcomm) добавлена поддержка GPU Adreno A405, A640 и A650.
  • Добавлен внутренний фреймворк для управления ресурсами DRM (Direct Rendering Manager).
  • Добавлена поддержка смартфонов Xiaomi Redmi Note 7 и Samsung Galaxy S2, а также ноутбуков Elm/Hana Chromebook.
  • Добавлены драйверы для LCD-панелей: ASUS TM5P5 NT35596, Starry KR070PE2T, Leadtek LTK050H3146W, Visionox rm69299, Boe tv105wum-nw0.
  • Добавлена поддержка ARM-плат и платформ Renesas "RZ/G1H", Realtek RTD1195, Realtek RTD1395/RTD1619, Rockchips RK3326, AMLogic S905D, S905X3, S922XH, Olimex A20-OLinuXino-LIME-eMMC, Check Point L-50, , Beacon i.MX8m-Mini, Qualcomm SDM660/SDM630, Xnano X5 TV Box, Stinger96, Beaglebone-AI.
  • Добавлена поддержка MIPS-процессора Loongson-2K (сокращённый Loongson64). Для CPU Loongson 3 добавлена поддержка виртуализации с использованием гипервизора KVM.
  • Добавлена поддержка российского процессора Baikal-T1 и основанной на нём системы на кристалле BE-T1000. Процессор Baikal-Т1 содержит два суперскалярных ядра P5600 MIPS 32 r5, работающих на частоте 1.2 ГГц. Чип содержит кэш L2 (1 Мб), контроллер памяти DDR3-1600 ECC, 1 порт 10Gb Ethernet, 2 порта 1Gb Ethernet, контроллер PCIe Gen.3 х4, 2 порта SATA 3.0, USB 2.0, GPIO, UART, SPI, I2C. Процессор предоставляет аппаратную поддержку виртуализации, инструкции SIMD и интегрированный аппаратный ускоритель криптографических операций, поддерживающий ГОСТ 28147-89. Чип разработан с использованием лицензированного у компании Imagination Technologies блока процессорного ядра MIPS32 P5600 Warrior.

Одновременно латиноамериканский Фонд свободного ПО сформировалвариант полностью свободного ядра 5.8 - Linux-libre 5.8-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске отключена загрузка блобов в драйверах для Atom ISP Video, MediaTek 7663 USB/7915 PCIe, Realtek 8723DE WiFi, Renesas PCI xHCI, HabanaLabs Gaudi, Enhanced Asynchronous Sample Rate Converter, Maxim Integrated MAX98390 Speaker Aimplifier, Microsemi ZL38060 Connected Home Audio Processor, и I2C EEPROM Slave. Обновлён код чистки блобов в драйверах и подсистемах Adreno GPU, HabanaLabs Goya, x86 touchscreen, vt6656 и btbcm.

 

ИсточникиПравить

Эта статья содержит материалы из статьи «Релиз ядра Linux 5.8», опубликованной OpenNET и распространяющейся на условиях лицензии Creative Commons Attribution (CC BY) — указание автора, источник и лицензию.
Эта статья загружена автоматически ботом NewsBots и ещё не проверялась редакторами Викиновостей.
Любой участник может оформить статью: добавить иллюстрации, викифицировать, заполнить шаблоны и добавить категории.
Любой редактор может снять этот шаблон после оформления и проверки.
 

Комментарии:Релиз ядра Linux 5.8: крупнейшее обновление в истории