Suicide
03.08.2020, 20:09
После двух месяцев разработки Линус Торвальдс представил (https://lkml.org/lkml/2020/8/2/293) релиз ядра Linux 5.8 (https://kernel.org/). Среди наиболее заметных изменений: детектор состояний гонки 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 внутренними подсистемами ядра.
Основные (https://kernelnewbies.org/Linux_5.8) новшества (https://lwn.net/Articles/822527/):
Виртуализация и безопасность
Обеспечена блокировка загрузки модулей ядра, имеющих секции с кодом, в которых одновременно выставлены биты, разрешающие исполнение и запись. Изменение реализовано в рамках более крупного проекта по избавлению ядра от применения страниц памяти, допускающих одновременно исполнение и запись.
Появилась возможность создания отдельных экземпляров procfs, позволяющих использовать несколько точек монтирования procfs, смонтированных с разными опциями, но отражающими одно пространство имён идентификаторов процессов (pid namespace). Ранее все точки монтирования procfs лишь отзеркаливали одно внутреннее представление и любое изменение параметров монтирования сказывалось на всех остальных точках монтирования, связанных с тем же пространством имён идентификаторов процессов. Из областей, в которых может быть востребовано монтирование с разными опциями отмечается реализация легковесной изоляции для встраиваемых систем с возможностью скрытия в procfs определённых типов процессов и информационных узлов.
Для платформы ARM64 реализована поддержка механизма Shadow-Call Stack (https://clang.llvm.org/docs/ShadowCallStack.html), предоставляемого компилятором Clang для защиты от перезаписи адреса возврата из функции в случае переполнения буфера в стеке. Суть защиты в сохранении после передачи управления функции адреса возврата в отдельном "теневом" стеке и извлечении данного адреса перед выходом из функции.
Для платформы ARM64 добавлена поддержка инструкций ARMv8.5-BTI (https://developer.arm.com/docs/ddi0602/f/base-instructions-alphabetic-order/bti-branch-target-identification) (Branch Target Indicator) для защиты выполнения наборов инструкций, на которые не должны выполняться переходы при ветвлении. Блокирование переходов на произвольные участки кода реализовано для противодействия созданию гаджетов в эксплоитах, использующих приёмы возвратно-ориентированного программирования (ROP - Return-Oriented Programming, атакующий не пытается разместить свой код в памяти, а оперирует уже имеющимися кусками машинных инструкций, завершающихся инструкцией возврата управления, из которых выстраиваются цепочка вызовов для получения нужной функциональности).
Добавлена поддержка оборудования для inline-шифрования блочных устройств (Inline Encryption (https://www.kernel.org/doc/html/latest/block/inline-encryption.html)). Устройства inlinep-шифрования обычно встроены в накопитель, но логически размещается между системной памятью и диском, осуществляя прозрачное шифрование и расшифровку ввода/вывода на основе заданных ядром ключей и алгоритма шифрования.
Добавлен параметр командной строки ядра "initrdmem", позволяющий указать физический адрес размещения initrd в памяти при размещении начального загрузочного образа в ОЗУ.
Добавлены новые capability: CAP_PERFMON для доступа к подсистеме perf и выполнения мониторинга производительности. CAP_BPF (https://git.kernel.org/linus/a17b53c4a4b5), разрешающий выполнение некоторых операций с BPF (например, загрузка BPF-программ), которые раньше требовали прав CAP_SYS_ADMIN (теперь полномочия CAP_SYS_ADMIN разделены на комбинацию CAP_BPF, CAP_PERFMON и CAP_NET_ADMIN).
Добавлено (https://git.kernel.org/linus/5f1f79bbc9e2) новое устройство virtio-mem, позволяющее реализовать горячее подключение и отключение памяти к гостевым системам.
Реализован отзыв операций маппинга в /dev/mem, если драйвер устройства использует перекрывающиеся области памяти.
Добавлена защита от уязвимости CROSSTalk/SRBDS (https://www.opennet.ru/opennews/art.shtml?num=53126), позволяющей восстановить результаты выполнения некоторых инструкций, выполняемых на другом ядре CPU.
Память и системные сервисы
В документ, определяющий правила оформления кода, приняты (https://www.opennet.ru/opennews/art.shtml?num=53342) рекомендации по применению инклюзивной терминологии. Разработчикам не рекомендуется использовать связки 'master / slave' и 'blacklist / whitelist', а также отдельно слово 'slave'. Рекомендации касаются только нового использования данных терминов. Уже имеющиеся в ядре упоминания указанных слов останутся нетронутыми. В новом коде использование отмеченных терминов разрешено если того требует поддержание выдаваемого в пространство пользователя API и ABI, а также при обновлении кода для поддержки существующего оборудования или протоколов, спецификации на которые предписывают использование определённых терминов.
В состав включён отладочный инструмент KCSAN (https://www.kernel.org/doc/html/latest/dev-tools/kcsan.html) (Kernel Concurrency Sanitizer), предназначенный для динамического выявления состояний гонки (https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D 0%B5_%D0%B3%D0%BE%D0%BD%D0%BA%D0%B8) внутри ядра. Использование KCSAN поддерживается при сборке в GCC и Clang, и требует добавления специальных модификаций на этапе компиляции для отслеживания доступа к памяти (применяются точки останова, срабатывающие при чтении или изменении памяти). Основное внимание при разработке KCSAN уделено предотвращению ложных срабатываний, масштабируемости и простоте использования.
Добавлен универсальный механизм (https://www.kernel.org/doc/html/latest/watch_queue.html) доставки уведомлений из ядра в пространство пользователя. Механизм основан на штатном драйвере pipe и позволяет эффективно распределять уведомления от ядра по каналам, открытым в пространстве пользователя. Точки приёма уведомлений представляют собой pipe-ы, открытые в специальном режиме и позволяющие накапливать в кольцевом буфере поступающие от ядра сообщения. Чтение осуществляется обычной функцией read(). Владелец канала определяет, какие из источников в ядре необходимо отслеживать и может определить фильтр для игнорирования сообщений и событий определённого типа. Из событий пока поддерживаются только операции с ключами, такие как добавление/удаление ключей и изменение их атрибутов. Указанные события планируют использовать в GNOME.
Продолжено развитие функциональности 'pidfd', помогающей обрабатывать ситуации с повторным использованием PID (pidfd связывается с конкретным процессом и не меняется, в том время как PID может быть привязан к другому процессу после завершения текущего процесса, ассоциированного с этим PID). В новой версии добавлена поддержка использования pidfd для прикрепления процесса к пространствам имён (разрешено указание pidfd при выполнении системного вызова setns). Применение pidfd позволяет одним вызовом управлять прикреплением процесса к нескольким типам пространств имён, существенно сокращая число необходимых системных вызовов и реализуя прикрепление в атомарном режиме (если при прикреплении к одному из пространств имён возникнет сбой, то не подключатся и остальные).
Добавлен новый системный вызов faccessat2(), отличающийся от faccessat() (https://man7.org/linux/man-pages/man2/faccessat.2.html) дополнительным аргументом с флагами, соответствующими рекомендациям POSIX (ранее данные флаги эмулировались в Си-библиотеке, а новый faccessat2 позволяет реализовать их в ядре).
В Cgroup добавлена (https://git.kernel.org/linus/4b82ab4f2883) настройка memory.swap.high, которую можно использовать для замедления задач, занимающих слишком много места в разделе подкачки.
В интерфейс асинхронного ввода/вывода io_uring (https://www.opennet.ru/opennews/art.shtml?num=50631#io_uring) добавлена поддержка системного вызова tee().
Добавлен механизм "BPF iterator (https://lwn.net/Articles/818714/), предназначенный для вывода в пространство пользователя содержимого структур ядра.
Предоставлена (https://git.kernel.org/linus/97abb2b39682) возможность использования кольцевого буфера для обмена данными между BPF-программами.
В механизм padata (https://www.kernel.org/doc/html/latest/core-api/padata.html), предназначенный для организации параллельного выполнения задач в ядре, добавлена поддержка многопоточных задач с балансировкой нагрузки.
В механизм pstore, позволяющий сохранить отладочную информацию о причине краха в области памяти, не теряемые между перезагрузками, добавлен (https://git.kernel.org/linus/649304c936cd) бэкенд для сохранения информации на блочные устройства.
Из ветки ядра PREEMPT_RT перенесена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=91710728d172) реализация локальных блокировок.
Добавлен (https://git.kernel.org/linus/2b43470add8c) новый API выделения буферов (AF_XDP), нацеленный на упрощение написания сетевых драйверов с поддержкой XDP (eXpress Data Path).
Для архитектуры RISC-V реализована поддержка отладки компонентов ядра при помощи KGDB.
До выпуска 4.8 повышены требования к версии GCC, которая может использоваться для сборки ядра. В одном из следующих выпуском планируется поднять планку до GCC 4.9.
Дисковая подсистема, ввод/вывод и файловые системы
В Device Mapper добавлен (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d3c7b35c20d6) новый обработчик dm-ebs (emulate block size), который может применяться для эмуляции меньшего размера логического блока (например, для эмуляции 512-байтных секторов на дисках с размером сектора 4K).
В файловой системе F2FS появилась поддержка сжатия с использованием алгоритма LZO-RLE.
В dm-crypt добавлена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=27f5411a718c431c20007e3a2fbba6589942d04f) поддержка шифрованных ключей.
В Btrfs улучшена обработка операций чтения в режиме прямого ввода/вывода. При монтировании ускорена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a619b3c7abdd585cdd003effa1773e627aa8a44e) проверка удалённых подразделов и каталогов, оставшихся без родителя.
В CIFS добавлен параметр "nodelete", допускающий штатные проверки прав на сервере, но запрещающий клиенту удалять файлы или каталоги.
В Ext4 улучшена обработка ошибки ENOSPC (https://man7.org/linux/man-pages/man2/creat.2.html) при использовании многопоточности. В xattr добавлена поддержка пространства имён gnu.*, используемого в GNU Hurd.
Для Ext4 и XFS включена поддержка операций DAX (прямой доступ к ФС в обход страничного кэша без применения уровня блочных устройств) в привязке к отдельным файлам и каталогам.
В системный вызов statx() (https://man7.org/linux/man-pages/man2/statx.2.html) добавлен флаг STATX_ATTR_DAX (https://git.kernel.org/linus/83d9088659e8), при указании которого информация извлекается с использованием механизма DAX.
В EXFAT добавлена (https://git.kernel.org/linus/476189c0ef3b658de3f6b89fd0fdeb6dc451b564) поддержка верификации загрузочной области.
В FAT улучшена (https://git.kernel.org/linus/898310032b96c198014a8bbace0fd26259b2db77) упреждающая загрузка элементов ФС. Тестирование медленного 2ТБ USB-накопителя показало сокращение времени прохождения теста с 383 до 51 сек.
Сетевая подсистема
В код управления работой сетевых мостов добавлена (https://git.kernel.org/linus/45c9cbec425c) поддержка протокола MRP (https://en.wikipedia.org/wiki/Media_Redundancy_Protocol) (Media Redundancy Protocol), позволяющего обеспечить отказоустойчивость, закольцевав несколько Ethernet-коммутаторов.
В систему управления трафиком (Tc) добавлено (https://git.kernel.org/linus/a51c328df310) новое действие "gate", дающее возможность определить временные интервалы для обработки и отбрасывания определённых пакетов.
В ядро и утилиту ethtool добавлена поддержка функций тестирования присоединённого сетевого кабеля и самодиагностики сетевых устройств.
В IPv6-стек добавлена поддержка алгоритма MPLS (Multiprotocol Label Switching) для маршрутизации пакетов с использованием многопротокольной коммутации по меткам (для IPv4 MPLS поддерживался и ранее).
Добавлена поддержка передачи пакетов IKE (Internet Key Exchange) и IPSec поверх TCP (RFC 8229 (https://tools.ietf.org/html/rfc8229)) для обхода возможных блокировок UDP.
Добавлено (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=aa4d16e44f60) сетевое блочное устройство rnbd, позволяющее организовать удалённый доступа к блочному устройству при помощи транспорта RDMA (InfiniBand, RoCE, iWARP) и протокола RTRS.
В TCP-стеке добавлена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ccd0628fca440268711560a1dbacc727b4f9e214) поддержка сжатия диапазонов в ответах выборочного подтверждения (selective acknowledgment, SACK).
Для IPv6 реализована (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d29245692a44d71d5e2e0770463184a693696232) поддержка TCP-LD (RFC 6069 (https://tools.ietf.org/html/rfc6069), Long Connectivity Disruptions).
Оборудование
В DRM-драйвере i915 для видеокарт Intel включена по умолчанию поддержка чипов Intel Tiger Lake (GEN12), для которых также реализована (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8ca6d0237d1696060cd4f5a3ee93ee001c1a9d5b) возможность использования системы SAGV (System Agent Geyserville) для динамической подстройки частоты и напряжения в зависимости от требований к энергопотреблению или производительности.
В драйвер amdgpu добавлена поддержка пиксельного формата FP16 и реализована возможность работы с шифрованными буферами в видеопамяти (TMZ, Trusted Memory Zone).
Добавлена поддержка датчиков энергопотребления процессоров AMD Zen и Zen2, а также датчиков температуры AMD Ryzen 4000 Renoir. Для AMD Zen и Zen2 обеспечена поддержка извлечения информации об энергопотреблении через интерфейс RAPL (https://lore.kernel.org/lkml/20200515215733.20647-1-eranian@google.com/) (Running Average Power Limit).
В драйвер Nouveau добавлена поддержка формата модификаторов NVIDIA. Для gv100 реализована возможность использования чересстрочных режимов развёртки. Добавлено определение vGPU.
В драйвер MSM (Qualcomm) добавлена поддержка GPU Adreno A405, A640 и A650.
Добавлен (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9e1ed9fb1eb0a4bc43a26365c592d3095286038b) внутренний фреймворк для управления ресурсами 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.
Добавлена (https://www.opennet.ru/opennews/art.shtml?num=53231) поддержка российского процессора Baikal-T1 и основанной на нём системы на кристалле BE-T1000 (https://www.baikalelectronics.com/products/168/). Процессор 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.
Одновременно латиноамериканский Фонд свободного ПО сформировал (http://www.fsfla.org/ikiwiki/selibre/linux-libre/) вариант полностью свободного ядра 5.8 (http://www.fsfla.org/ikiwiki/selibre/linux-libre/) - Linux-libre 5.8-gnu (http://linux-libre.fsfla.org/pub/linux-libre/releases/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.
03.08.2020
https://www.opennet.ru/opennews/art.shtml?num=53479
Ядро 5.8 стало самым крупным по числу изменений из всех ядер за всё время существования проекта. При этом изменения не связаны с какой-то одной подсистемой, а охватывают разные части ядра и в основном связаны с внутренними переработками и чисткой. Больше всего изменений наблюдается в драйверах. В новую версию принято 17606 исправлений от 2081 разработчиков, которые затронули примерно 20% всех файлов в репозитории с кодом ядра. Размер патча - 65 МБ (изменения затронули 16180 файлов, добавлено 1043240 строк кода, удалено 489854 строк). Для сравнения в ветке 5.7 было внесено 15033 исправлений, а размер патча составлял 39 МБ. Около 37% всех представленных в 5.8 изменений связаны с драйверами устройств, примерно 16% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 11% связано с сетевым стеком, 3% - с файловыми системами и 4% c внутренними подсистемами ядра.
Основные (https://kernelnewbies.org/Linux_5.8) новшества (https://lwn.net/Articles/822527/):
Виртуализация и безопасность
Обеспечена блокировка загрузки модулей ядра, имеющих секции с кодом, в которых одновременно выставлены биты, разрешающие исполнение и запись. Изменение реализовано в рамках более крупного проекта по избавлению ядра от применения страниц памяти, допускающих одновременно исполнение и запись.
Появилась возможность создания отдельных экземпляров procfs, позволяющих использовать несколько точек монтирования procfs, смонтированных с разными опциями, но отражающими одно пространство имён идентификаторов процессов (pid namespace). Ранее все точки монтирования procfs лишь отзеркаливали одно внутреннее представление и любое изменение параметров монтирования сказывалось на всех остальных точках монтирования, связанных с тем же пространством имён идентификаторов процессов. Из областей, в которых может быть востребовано монтирование с разными опциями отмечается реализация легковесной изоляции для встраиваемых систем с возможностью скрытия в procfs определённых типов процессов и информационных узлов.
Для платформы ARM64 реализована поддержка механизма Shadow-Call Stack (https://clang.llvm.org/docs/ShadowCallStack.html), предоставляемого компилятором Clang для защиты от перезаписи адреса возврата из функции в случае переполнения буфера в стеке. Суть защиты в сохранении после передачи управления функции адреса возврата в отдельном "теневом" стеке и извлечении данного адреса перед выходом из функции.
Для платформы ARM64 добавлена поддержка инструкций ARMv8.5-BTI (https://developer.arm.com/docs/ddi0602/f/base-instructions-alphabetic-order/bti-branch-target-identification) (Branch Target Indicator) для защиты выполнения наборов инструкций, на которые не должны выполняться переходы при ветвлении. Блокирование переходов на произвольные участки кода реализовано для противодействия созданию гаджетов в эксплоитах, использующих приёмы возвратно-ориентированного программирования (ROP - Return-Oriented Programming, атакующий не пытается разместить свой код в памяти, а оперирует уже имеющимися кусками машинных инструкций, завершающихся инструкцией возврата управления, из которых выстраиваются цепочка вызовов для получения нужной функциональности).
Добавлена поддержка оборудования для inline-шифрования блочных устройств (Inline Encryption (https://www.kernel.org/doc/html/latest/block/inline-encryption.html)). Устройства inlinep-шифрования обычно встроены в накопитель, но логически размещается между системной памятью и диском, осуществляя прозрачное шифрование и расшифровку ввода/вывода на основе заданных ядром ключей и алгоритма шифрования.
Добавлен параметр командной строки ядра "initrdmem", позволяющий указать физический адрес размещения initrd в памяти при размещении начального загрузочного образа в ОЗУ.
Добавлены новые capability: CAP_PERFMON для доступа к подсистеме perf и выполнения мониторинга производительности. CAP_BPF (https://git.kernel.org/linus/a17b53c4a4b5), разрешающий выполнение некоторых операций с BPF (например, загрузка BPF-программ), которые раньше требовали прав CAP_SYS_ADMIN (теперь полномочия CAP_SYS_ADMIN разделены на комбинацию CAP_BPF, CAP_PERFMON и CAP_NET_ADMIN).
Добавлено (https://git.kernel.org/linus/5f1f79bbc9e2) новое устройство virtio-mem, позволяющее реализовать горячее подключение и отключение памяти к гостевым системам.
Реализован отзыв операций маппинга в /dev/mem, если драйвер устройства использует перекрывающиеся области памяти.
Добавлена защита от уязвимости CROSSTalk/SRBDS (https://www.opennet.ru/opennews/art.shtml?num=53126), позволяющей восстановить результаты выполнения некоторых инструкций, выполняемых на другом ядре CPU.
Память и системные сервисы
В документ, определяющий правила оформления кода, приняты (https://www.opennet.ru/opennews/art.shtml?num=53342) рекомендации по применению инклюзивной терминологии. Разработчикам не рекомендуется использовать связки 'master / slave' и 'blacklist / whitelist', а также отдельно слово 'slave'. Рекомендации касаются только нового использования данных терминов. Уже имеющиеся в ядре упоминания указанных слов останутся нетронутыми. В новом коде использование отмеченных терминов разрешено если того требует поддержание выдаваемого в пространство пользователя API и ABI, а также при обновлении кода для поддержки существующего оборудования или протоколов, спецификации на которые предписывают использование определённых терминов.
В состав включён отладочный инструмент KCSAN (https://www.kernel.org/doc/html/latest/dev-tools/kcsan.html) (Kernel Concurrency Sanitizer), предназначенный для динамического выявления состояний гонки (https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D0%BD%D0%B8%D 0%B5_%D0%B3%D0%BE%D0%BD%D0%BA%D0%B8) внутри ядра. Использование KCSAN поддерживается при сборке в GCC и Clang, и требует добавления специальных модификаций на этапе компиляции для отслеживания доступа к памяти (применяются точки останова, срабатывающие при чтении или изменении памяти). Основное внимание при разработке KCSAN уделено предотвращению ложных срабатываний, масштабируемости и простоте использования.
Добавлен универсальный механизм (https://www.kernel.org/doc/html/latest/watch_queue.html) доставки уведомлений из ядра в пространство пользователя. Механизм основан на штатном драйвере pipe и позволяет эффективно распределять уведомления от ядра по каналам, открытым в пространстве пользователя. Точки приёма уведомлений представляют собой pipe-ы, открытые в специальном режиме и позволяющие накапливать в кольцевом буфере поступающие от ядра сообщения. Чтение осуществляется обычной функцией read(). Владелец канала определяет, какие из источников в ядре необходимо отслеживать и может определить фильтр для игнорирования сообщений и событий определённого типа. Из событий пока поддерживаются только операции с ключами, такие как добавление/удаление ключей и изменение их атрибутов. Указанные события планируют использовать в GNOME.
Продолжено развитие функциональности 'pidfd', помогающей обрабатывать ситуации с повторным использованием PID (pidfd связывается с конкретным процессом и не меняется, в том время как PID может быть привязан к другому процессу после завершения текущего процесса, ассоциированного с этим PID). В новой версии добавлена поддержка использования pidfd для прикрепления процесса к пространствам имён (разрешено указание pidfd при выполнении системного вызова setns). Применение pidfd позволяет одним вызовом управлять прикреплением процесса к нескольким типам пространств имён, существенно сокращая число необходимых системных вызовов и реализуя прикрепление в атомарном режиме (если при прикреплении к одному из пространств имён возникнет сбой, то не подключатся и остальные).
Добавлен новый системный вызов faccessat2(), отличающийся от faccessat() (https://man7.org/linux/man-pages/man2/faccessat.2.html) дополнительным аргументом с флагами, соответствующими рекомендациям POSIX (ранее данные флаги эмулировались в Си-библиотеке, а новый faccessat2 позволяет реализовать их в ядре).
В Cgroup добавлена (https://git.kernel.org/linus/4b82ab4f2883) настройка memory.swap.high, которую можно использовать для замедления задач, занимающих слишком много места в разделе подкачки.
В интерфейс асинхронного ввода/вывода io_uring (https://www.opennet.ru/opennews/art.shtml?num=50631#io_uring) добавлена поддержка системного вызова tee().
Добавлен механизм "BPF iterator (https://lwn.net/Articles/818714/), предназначенный для вывода в пространство пользователя содержимого структур ядра.
Предоставлена (https://git.kernel.org/linus/97abb2b39682) возможность использования кольцевого буфера для обмена данными между BPF-программами.
В механизм padata (https://www.kernel.org/doc/html/latest/core-api/padata.html), предназначенный для организации параллельного выполнения задач в ядре, добавлена поддержка многопоточных задач с балансировкой нагрузки.
В механизм pstore, позволяющий сохранить отладочную информацию о причине краха в области памяти, не теряемые между перезагрузками, добавлен (https://git.kernel.org/linus/649304c936cd) бэкенд для сохранения информации на блочные устройства.
Из ветки ядра PREEMPT_RT перенесена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=91710728d172) реализация локальных блокировок.
Добавлен (https://git.kernel.org/linus/2b43470add8c) новый API выделения буферов (AF_XDP), нацеленный на упрощение написания сетевых драйверов с поддержкой XDP (eXpress Data Path).
Для архитектуры RISC-V реализована поддержка отладки компонентов ядра при помощи KGDB.
До выпуска 4.8 повышены требования к версии GCC, которая может использоваться для сборки ядра. В одном из следующих выпуском планируется поднять планку до GCC 4.9.
Дисковая подсистема, ввод/вывод и файловые системы
В Device Mapper добавлен (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d3c7b35c20d6) новый обработчик dm-ebs (emulate block size), который может применяться для эмуляции меньшего размера логического блока (например, для эмуляции 512-байтных секторов на дисках с размером сектора 4K).
В файловой системе F2FS появилась поддержка сжатия с использованием алгоритма LZO-RLE.
В dm-crypt добавлена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=27f5411a718c431c20007e3a2fbba6589942d04f) поддержка шифрованных ключей.
В Btrfs улучшена обработка операций чтения в режиме прямого ввода/вывода. При монтировании ускорена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=a619b3c7abdd585cdd003effa1773e627aa8a44e) проверка удалённых подразделов и каталогов, оставшихся без родителя.
В CIFS добавлен параметр "nodelete", допускающий штатные проверки прав на сервере, но запрещающий клиенту удалять файлы или каталоги.
В Ext4 улучшена обработка ошибки ENOSPC (https://man7.org/linux/man-pages/man2/creat.2.html) при использовании многопоточности. В xattr добавлена поддержка пространства имён gnu.*, используемого в GNU Hurd.
Для Ext4 и XFS включена поддержка операций DAX (прямой доступ к ФС в обход страничного кэша без применения уровня блочных устройств) в привязке к отдельным файлам и каталогам.
В системный вызов statx() (https://man7.org/linux/man-pages/man2/statx.2.html) добавлен флаг STATX_ATTR_DAX (https://git.kernel.org/linus/83d9088659e8), при указании которого информация извлекается с использованием механизма DAX.
В EXFAT добавлена (https://git.kernel.org/linus/476189c0ef3b658de3f6b89fd0fdeb6dc451b564) поддержка верификации загрузочной области.
В FAT улучшена (https://git.kernel.org/linus/898310032b96c198014a8bbace0fd26259b2db77) упреждающая загрузка элементов ФС. Тестирование медленного 2ТБ USB-накопителя показало сокращение времени прохождения теста с 383 до 51 сек.
Сетевая подсистема
В код управления работой сетевых мостов добавлена (https://git.kernel.org/linus/45c9cbec425c) поддержка протокола MRP (https://en.wikipedia.org/wiki/Media_Redundancy_Protocol) (Media Redundancy Protocol), позволяющего обеспечить отказоустойчивость, закольцевав несколько Ethernet-коммутаторов.
В систему управления трафиком (Tc) добавлено (https://git.kernel.org/linus/a51c328df310) новое действие "gate", дающее возможность определить временные интервалы для обработки и отбрасывания определённых пакетов.
В ядро и утилиту ethtool добавлена поддержка функций тестирования присоединённого сетевого кабеля и самодиагностики сетевых устройств.
В IPv6-стек добавлена поддержка алгоритма MPLS (Multiprotocol Label Switching) для маршрутизации пакетов с использованием многопротокольной коммутации по меткам (для IPv4 MPLS поддерживался и ранее).
Добавлена поддержка передачи пакетов IKE (Internet Key Exchange) и IPSec поверх TCP (RFC 8229 (https://tools.ietf.org/html/rfc8229)) для обхода возможных блокировок UDP.
Добавлено (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=aa4d16e44f60) сетевое блочное устройство rnbd, позволяющее организовать удалённый доступа к блочному устройству при помощи транспорта RDMA (InfiniBand, RoCE, iWARP) и протокола RTRS.
В TCP-стеке добавлена (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ccd0628fca440268711560a1dbacc727b4f9e214) поддержка сжатия диапазонов в ответах выборочного подтверждения (selective acknowledgment, SACK).
Для IPv6 реализована (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d29245692a44d71d5e2e0770463184a693696232) поддержка TCP-LD (RFC 6069 (https://tools.ietf.org/html/rfc6069), Long Connectivity Disruptions).
Оборудование
В DRM-драйвере i915 для видеокарт Intel включена по умолчанию поддержка чипов Intel Tiger Lake (GEN12), для которых также реализована (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=8ca6d0237d1696060cd4f5a3ee93ee001c1a9d5b) возможность использования системы SAGV (System Agent Geyserville) для динамической подстройки частоты и напряжения в зависимости от требований к энергопотреблению или производительности.
В драйвер amdgpu добавлена поддержка пиксельного формата FP16 и реализована возможность работы с шифрованными буферами в видеопамяти (TMZ, Trusted Memory Zone).
Добавлена поддержка датчиков энергопотребления процессоров AMD Zen и Zen2, а также датчиков температуры AMD Ryzen 4000 Renoir. Для AMD Zen и Zen2 обеспечена поддержка извлечения информации об энергопотреблении через интерфейс RAPL (https://lore.kernel.org/lkml/20200515215733.20647-1-eranian@google.com/) (Running Average Power Limit).
В драйвер Nouveau добавлена поддержка формата модификаторов NVIDIA. Для gv100 реализована возможность использования чересстрочных режимов развёртки. Добавлено определение vGPU.
В драйвер MSM (Qualcomm) добавлена поддержка GPU Adreno A405, A640 и A650.
Добавлен (https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9e1ed9fb1eb0a4bc43a26365c592d3095286038b) внутренний фреймворк для управления ресурсами 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.
Добавлена (https://www.opennet.ru/opennews/art.shtml?num=53231) поддержка российского процессора Baikal-T1 и основанной на нём системы на кристалле BE-T1000 (https://www.baikalelectronics.com/products/168/). Процессор 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.
Одновременно латиноамериканский Фонд свободного ПО сформировал (http://www.fsfla.org/ikiwiki/selibre/linux-libre/) вариант полностью свободного ядра 5.8 (http://www.fsfla.org/ikiwiki/selibre/linux-libre/) - Linux-libre 5.8-gnu (http://linux-libre.fsfla.org/pub/linux-libre/releases/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.
03.08.2020
https://www.opennet.ru/opennews/art.shtml?num=53479