Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
 Kernels
 Boot 
 Memory 
 File system
 0.01
 1.0 
 2.0 
 2.4 
 2.6 
 3.x 
 4.x 
 5.x 
 6.x 
 Интервью 
 Kernel
 HOW-TO 1
 Ptrace
 Kernel-Rebuild-HOWTO
 Runlevel
 Linux daemons
 FAQ
NEWS
Последние статьи :
  Тренажёр 16.01   
  Эльбрус 05.12   
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
 
TOP 20
 Secure Programming for Li...6501 
 Linux Kernel 2.6...5278 
 Trees...1112 
 Максвелл 3...1046 
 William Gropp...984 
 Go Web ...953 
 Ethreal 3...921 
 Gary V.Vaughan-> Libtool...911 
 Ethreal 4...908 
 Ext4 FS...898 
 Clickhouse...896 
 Rodriguez 6...895 
 Ethreal 1...888 
 Steve Pate 1...877 
 C++ Patterns 3...858 
 Assembler...845 
 Ulrich Drepper...838 
 DevFS...779 
 MySQL & PosgreSQL...761 
 Стивенс 9...752 
 
  01.01.2024 : 3621733 посещений 

iakovlev.org

Ядро 5.8

03.08.2020

После двух месяцев разработки Линус Торвальдс представил релиз ядра 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.

Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье