Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
iakovlev.org

Ядро 5.3

16.09.2019

После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 5.3. Среди наиболее заметных изменений: поддержка GPU AMD Navi, процессоров Zhaoxi и технологии управления энергопотреблением Intel Speed Select, возможность использования инструкций umwait для ожидания без использования циклов, повышающий интерактивность режим 'utilization clamping' для асимметричных CPU, системный вызов pidfd_open, возможность использования IPv4-адресов из подсети 0.0.0.0/8, возможность аппаратного ускорения nftables, поддержка HDR в подсистеме DRM, интеграция гипервизора ACRN.

В анонсе нового выпуска Линус напомнил всем разработчикам о главном правиле разработки ядра - сохранение неизменности поведения для компонентов пространства пользователя. Изменения в ядре никаким образом не должны нарушать уже работающие приложения и приводить к регрессиям на пользовательском уровне. При этом нарушение поведения может вызвать не только изменение ABI, удаление устаревшего кода или появление ошибок, но и косвенное влияние корректно работающих полезных улучшений. В качестве наглядного примера была отброшена полезная оптимизация в коде Ext4, сокращающая число обращений к накопителю за счёт отключения упреждающего чтение таблицы inode при мелких запросах ввода/вывода.

Оптимизация привела к тому, что из-за снижения дисковой активности энтропия для генератора случайных чисел getrandom() стала накапливаться медленнее и в некоторых конфигурациях при определённом стечении обстоятельств могли наблюдаться подвисания во время загрузки до заполнения пула энтропии. Так как оптимизация действительно полезная, среди разработчиков возникла дискуссия, в которой предлагалось устранить проблему за счёт отключения по умолчанию блокирующего режима работы вызова getrandom() с добавлением опционального флага для ожидания энтропии, но подобное изменение повлияет на качество случайных чисел на начальном этапе загрузки. В коммите с откатом изменения Линус отметил, что планирует вернуть оптимизацию обратно, как только проблема с getrandom() будет решена.

В новую версию принято 15794 исправлений от 1974 разработчиков, размер патча - 92 Мб (изменения затронули 13986 файлов, добавлено 258419 строк кода, удалено 599137 строк). Около 39% всех представленных в 5.3 изменений связаны с драйверами устройств, примерно 12% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 11% связано с сетевым стеком, 3% - файловыми системами и 3% c внутренними подсистемами ядра.

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

  • Память и системные сервисы
    • Продолжено развитие функциональности 'pidfd', помогающей обрабатывать ситуации с повторным использованием PID (pidfd связывается с конкретным процессом и не меняется, в том время как PID может быть привязан к другому процессу после завершения текущего процесса, ассоциированного с этим PID). Ранее в ядро уже был добавлен системный вызов pidfd_send_signal() и флаг CLONE_PIDFD в вызове clone(), позволяющий получить pidfd для использования в idfd_send_signal(). При использовании вызова clone() с флагом CLONE_PIDFD могли возникать проблемы с сервисными менеджерами или системой принудительного завершения процессов при нехватке памяти в платформе Android. В этом случае для запуска используется вызов fork() или clone() без CLONE_PIDFD.

      В ядре 5.3 представлен системный вызов pidfd_open(), позволяющий получить проверяемый pidfd для произвольного существующего процесса, созданного не через вызов clone() с флагом CLONE_PIDFD. Также добавлена поддержка поллинга pidfd при помощи poll() и epoll(), что позволяет в менеджерах процессов отслеживать завершения произвольных процессов, не опасаясь состояния гонки в случае присвоения PID новому процессу. Механизм уведомления о завершении работы процесса, связанного с pidfd, аналогичен информированию о завершении своего дочернего процесса;

    • В планировщик задач добавлена поддержка механизма закрепления нагрузки (Utilization clamping), позволяющего придерживаться минимального или максимального диапазонов частот, в зависимости от активных на CPU задач. Представленный механизм ускоряет задачи, которые напрямую влияют на качество взаимодействия с пользователем, через запуск этих задач как минимум в нижней границе "запрошенной" частоты. Низкоприоритетные задачи, не сказывающиеся на работе пользователя, запускаются c использованием верхнего лимита "разрешённой" частоты. Лимиты задаются через атрибуты sched_uclamp_util_min и sched_uclamp_util_max в системном вызове sched_setattr().
    • Добавлена поддержка технологии управления энергопотреблением Intel Speed Select, доступной на некоторых серверах с процессорами Intel Xeon. Указанная технология позволяет устанавливать настройки производительности и пропускной способности разделов для разных ядер CPU, что позволяет сделать более приоритетной производительность для задач, выполняемых на определённых ядрах, жертвуя производительностью на других ядрах;
    • Процессам в пространстве пользователя предоставлена возможность ожидания в течение небольшого времени без использования циклов при помощи инструкции umwait. Данная инструкция, вместе с инструкциями umonitor и tpause, будет предложена в готовящихся к выпуску чипах Intel "Tremont", и позволит реализовывать задержки, эффективные с точки зрения энергопотребления и не влияющие на производительность других потоков при использовании Hyper Threading;
    • Для архитектуры RISC-V добавлена поддержка больших страниц памяти (huge pages);
    • В механизм трассировки "kprobes" добавлена возможность разыменования указателей ядра в пространство пользователя, что может применяться, например, для оценки содержимого структур, передаваемых в системные вызовы. Также добавлена возможность установки проверок на этапе загрузки.
    • В файл конфигурации добавлена опция PREEMPT_RT для работы в режиме реального времени. Сам код для поддержки режима реального времени пока не добавлен в ядро, но появление опции является хорошим знаком, что многолетняя эпопея по интеграции патчей Realtime-Preempt близится к финалу;
    • Добавлен системный вызов clone3() c реализацией более расширяемого варианта интерфейса clone(), допускающего указание большего числа флагов;
    • Добавлен обработчик bpf_send_signal(), позволяющий BPF-программам отправлять сигналы произвольным процессам;
    • Для событий perf в окружении гипервизора KVM добавлен новый механизм фильтрации событий, позволяющий администратору определить типы событий, допустимые или не допустимые для мониторинга на стороне гостевой системы;
    • В механизм верификации eBPF-приложений добавлена возможность обработки программ с циклами, если выполнение цикла ограничено и не может привести к превышению лимита на максимальное число инструкций;
  • Дисковая подсистема, ввод/вывод и файловые системы
    • Для файловой системы XFS реализована возможность многопоточного обхода inode (например, при проверке квот). Добавлены новые ioctl BULKSTAT и INUMBERS, предоставляющие доступ к возможностям, появившимся в пятой редакции формата ФС, таким как время рождения inode и возможность задания параметров BULKSTAT и INUMBERS для каждой группы AG (Allocation Groups);
    • В Ext4 добавлена поддержка пустот в каталогах (не привязанных блоков). Обеспечена обработка флага "i" (immutable) для открытых файлов (запрет записи в ситуации, если флаг был установлен в момент, когда файл уже был открыт);
    • В Btrfs обеспечено определение быстрой реализации crc32c на всех архитектурах;
    • В CIFS с кода для поддержки smbdirect снят признак экспериментальной разработки. В SMB3 добавлена возможность использования криптоалгоритмов в режиме GCM. Добавлена новая опция монтирования для извлечения параметров режима из записей ACE (Access Сontrol Entry). Оптимизирована производительность вызова open();
    • В F2FS добавлена опция для ограничения сборщика мусора при работе в режиме checkpoint=disable. Добавлен ioctl для удаления диапазонов блоков из F2FS, что позволяет реализовать корректировку размера раздела на лету. Добавлена возможность размещения в F2FS файла подкачки с обеспечением прямого ввода/вывода. Для всех пользователей добавлена поддержка закрепления файла и выделения блоков для подобных файлов;
    • В интерфейс для асинхронного ввода/вывода io_uring добавлена поддержка асинхронных операций sendmsg() и recvmsg();
    • В файловую систему UBIFS добавлена поддержка сжатия с использованием алгоритма zstd и возможность верификации подписанных образов ФС;
    • В ФС Ceph добавлена поддержка меток безопасности SELinux для файлов;
    • Для NFSv4 реализована новая опция монтировния "nconnect=", определяющая число установленных с сервером соединений. Трафик между этими соединениями будет распределяться с использованием балансировки нагрузки. Кроме того, сервером NFSv4 теперь создаётся каталог /proc/fs/nfsd/clients с информацией о текущих клиентах, включая сведения об открытых ими файлах;
  • Виртуализация и безопасность
    • В состав ядра включён гипервизор для встраиваемых устройств ACRN, который написан с оглядкой на готовность для выполнения задач реального времени и пригодность к использованию в критически важных системах. ACRN обеспечивает минимальные накладные расходы, гарантирует низкие задержки (low latency) и адекватную отзывчивость при взаимодействии с оборудованием. Поддерживается виртуализация ресурсов CPU, ввода/вывода, сетевой подсистемы, операций с графикой и звуком. ACRN может применяться для запуска нескольких изолированных виртуальных машин в электронных блоках управления, приборных панелях, автомобильных информационных системах, потребительских IoT-устройств и другой встраиваемой техники;
    • В User-mode Linux добавлен режим "путешествия во времени", позволяющий замедлить или ускорить время в виртуальном окружении UML для упрощения отладки связанного со временем кода. Кроме того добавлен параметр time-travel-start, позволяющий стартовать системные часы с указанного момента в epoch-формате;
    • Добавлены новые опции командной строки ядра "init_on_alloc" и "init_on_free", при указании которых включается обнуление выделяемых и освобождаемых областей памяти (заполнение нулями при malloc и free), что позволяет усилить безопасность за счёт дополнительных накладных расходов на инициализацию;
    • Добавлен новый драйвер virtio-iommu с реализацией паравиртализированного устройства, позволяющего отправлять IOMMU-запросы, такие как ATTACH, DETACH, MAP и UNMAP, поверх транспорта virtio без эмуляции таблиц страниц памяти;
    • Добавлен новый драйвер virtio-pmem, представляющий доступ к устройствам хранения, отражённым в физическое адресное пространство, таким как NVDIMM;
    • Реализована возможность прикрепления криптографических ключей к пользовательскому или сетевому пространству имён (ключи становятся недоступны за пределами выбранного пространства имён), а также защиты ключей при помощи ACL;
    • В криптоподсистему добавлена поддержка очень быстрого алгоритма некриптографичекого хэширования xxhash, скорость которого упирается в производительность памяти;
  • Сетевая подсистема
    • Обеспечена обработка адресов IPv4 в диапазоне 0.0.0.0/8, который ранее был недоступен для использования. Введение данной подсети позволит распределить ещё 16 млн адресов IPv4;
    • В Netfilter для nftables добавлена поддержка механизмов аппаратного ускорения фильтрации пакетов за счёт применения добавленного в драйверы Flow Block API. На сторону сетевых адаптеров могут выноситься целые таблицы правил со всеми цепочками. Включение производится через привязку флага NFT_TABLE_F_HW к таблице. Поддерживаются простые метаданные протоколов 3 и 4 уровней, действия принять/отбросить, сопоставления по IP и сетевым портам отправителя/получателя и типу протокола;
    • Добавлена встроенная поддержка отслеживания соединений для сетевых мостов, не требующая применения эмулирующей прослойки br_netfilter;
    • В nf_tables добавлена поддержка модуля SYNPROXY, повторяющего аналогичную функциональность из iptables, а также реализована возможность проверки в правилах по отдельным опциям в заголовке IPv4;
    • Добавлена возможность прикрепления BPF-программ к системным вызовам setsockopt() и getsockopt(), что, например, позволяет прикрепить свои обработчики доступа к этим вызовам. Кроме того, добавлена новая точка вызова (hook), при помощи которой можно организовать вызов BPF-программы один раз за каждый интервал RTT (round-trip-time, время пинга);
    • Для IPv4 и IPv6 добавлен новый механизм хранения данных маршрутизации nexthop, нацеленный на увеличение масштабируемости таблиц маршрутизации. Проведённые тесты показали, что при использовании новой системы набор в 743 тысяч маршрутов был загружен в ядро всего за 4.3 секунды;
    • Для Bluetooth реализована функциональность, необходимая для поддержки LE ping;
  • Оборудование
    • Добавлена поддержка x86-совместимых процессоров компании Zhaoxin, развиваемых в результате совместного проекта VIA Technologies и муниципалитета Шанхая. Семейство CPU ZX построено на базе архитектуры x86-64 Isaiah, продолжающей развитие технологий VIA Centaur;
    • В подсистему DRM (Direct Rendering Manager), а также в графические драйверы amdgpu и i915, добавлена поддержка разбора, обработки и отправка через HDMI-порт метаданных HDR (расширенный динамический диапазон), позволяющего использовать HDR-панели и экраны, способные отображать дополнительные диапазоны яркости;
    • В драйвер amdgpu добавлена начальная поддержка GPU AMD NAVI (RX5700), которая включает базовый драйвер, код для взаимодействия с экранами (DCN2), поддержку GFX и вычислений (GFX10), SDMA 5 (System DMA0), средства управления питанием и мультимедийные кодировщики/декодировщики (VCN2). В amdgpu также улучшена поддержка карт на базе GPU Vega12 и Vega20, для которых добавлены дополнительные возможности управления памятью и энергопотреблением;
    • В драйвер amdkfd (для дискретных GPU, такие как Fiji, Tonga, Polaris) добавлена поддержка карт на базе GPU VegaM;
    • В DRM-драйвере для видеокарт Intel для чипов Icelake реализован новый мультисегментный режим гамма-коррекции. Добавлена возможность вывода через DisplayPort в формате YCbCr4:2:0. Добавлены новые прошивки GuC для SKL, BXT, KBL, GLK и ICL. Реализована возможность отключения питания экрана в асинхронном режиме. Добавлена поддержка сохранения и восстановления контекста рендеринга для чипов Ironlake (gen5) и gen4 (Broadwater - Cantiga), что позволяет из пространства пользователя восстанавливать состояние GPU при перехода от выполнения одних пакетных операций к другим;
    • В драйвере Nouveau обеспечено определение чипсета NVIDIA Turing TU116;
    • Расширены возможности DRM/KMS-драйвера для ускорителей экранных операций ARM Komeda (Mali D71), добавлена поддержка масштабирования, разделения/слияния слоёв, поворота, отложенной записи, AFBC, SMMU и форматов кодирования цвета Y0L2, P010, YUV420_8/10BIT;
    • В драйвер MSM добавлена поддержка серии A540 GPU Adreno, применяемой в процессорах Qualcomm, а также поддержка DSI-контроллера MSM8998 для Snapdragon 835;
    • Добавлены драйверы для LCD-панелей Samsung S6E63M0, Armadeus ST0700, EDT ETM0430G0DH6, OSD101T2045-53TS, Evervision VGG804821, FriendlyELEC HD702E, KOE tx14d24vm1bpa, TFC S9700RTWV43TR-01B, EDT ET035012DM6 и VXT VL050-8048NT-C01;
    • Добавлен драйвер для задействования средств ускорения декодирования видео, доступных в SoC Amlogic Meson;
    • В драйвере v3d (для GPU Broadcom Video Core V, используемого в Raspberry Pi) появилась поддержка диспетчеризации вычислительных шейдеров;
    • Добавлен драйвер для SPI-клавиатур и трекпадов, применяемых в современных моделях ноутбуков Apple MacBook и MacBookPro;
    • Добавлена дополнительная защита ioctl-вызовов, связанных с драйвером floppy, а сам драйвер помечен как оставленный без сопровождения ("orphaned"), что подразумевает прекращение его тестирования. Драйвер пока сохраняется в ядре, но его корректная работа не гарантируется. Драйвер рассматривается как устаревший, так как для его тестирования трудно найти работающее оборудование - все актуальные внешние накопители, как правило, используют интерфейс USB.
    • Добавлен cpufreq-драйвер для плат Raspberry Pi, позволяющий динамически управлять изменением частоты процессора;
    • Добавлена поддержка новых ARM SoC Mediatek mt8183 (4x Cortex-A73 + 4x Cortex-A53), TI J721E (2x Cortex-A72 + 3x Cortex-R5F + 3 DSPs + MMA) и Amlogic G12B (4x Cortex-A73 + 2x Cortex-A53), а также плат:
      • Purism Librem5,
      • Aspeed BMC,
      • Microsoft Olympus BMC,
      • Kontron SMARC,
      • Novtech Meerkat96 (i.MX7),
      • ST Micro Avenger96,
      • Google Cheza (Qualcomm SDM845),
      • Qualcomm Dragonboard 845c (Qualcomm SDM845),
      • Hugsun X99 TV Box (Rockchip RK3399),
      • Khadas Edge/Edge-V/Captain (Rockchip RK3399),
      • HiHope RZ/G2M,
      • NXP LS1021A-TSN.

Одновременно Латиноамериканский Фонд свободного ПО сформировал вариант полностью свободного ядра 5.3 - Linux-libre 5.3-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В новом выпуске отключена загрузка блобов в драйверах qcom, hdcp drm, allegro-dvt и meson-vdec. Обновлён код чистки блобов в драйверах и подсистемах amdgpu, i915, netx, r8169, brcmfmac, rtl8188eu, adreno, si2157, pvrusb2, touchscreen_dmi, звуковом драйвере для skylake, а также в документации к микрокоду.

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

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

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