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

Ядро 6.4

26.06.2023

После двух месяцев разработки Линус Торвальдс представил релиз ядра Linux 6.4. Среди наиболее заметных изменений: возможность создания kernel worker из пространства пользователя, продолжение интеграции поддержки языка Rust, поддержка механизма Intel LAM (Linear Address Masking), дедупликация страниц памяти на уровне процессов, поддержка привычных итераторов в BPF, поддержка перехода в спящий режим для систем RISC-V, возможность трассировки пользовательских процессов, новый механизм управления памятью модулей ядра, запрет отключения SELinux во время работы, поддержка шифрования RPC-пакетов NFS, удаление SLOB slab allocator.

В новую версию принято 16012 исправлений от 2080 разработчиков, размер патча - 81 МБ (изменения затронули 14220 файлов, добавлено 1006924 строк кода, удалено 597615 строк). Около 43% всех представленных в 6.4 изменений связаны с драйверами устройств, примерно 14% изменений имеют отношение к обновлению кода, специфичного для аппаратных архитектур, 10% связано с сетевым стеком, 4% - с файловыми системами и 3% c внутренними подсистемами ядра.

Основные новшества в ядре 6.4:

  • Память и системные сервисы
    • Предоставлена возможность создания работающих на уровне ядра обработчиков (kernel worker) из процессов в пространстве пользователя. В отличие от использования API kthread, создаваемые из пространства пользователя обработчики наследуют свойства процессов и выполняются с учётными данными процесса пространства пользователя, что позволяет более жёстко изолировать их и применять к ним ограничения RLIMIT. Реализация оптимизирована для совместного использования с io_uring.
    • Из ветки Rust-for-Linux продолжен перенос дополнительной функциональности, связанной с использованием языка Rust в качестве второго языка для разработки драйверов и модулей ядра (поддержка Rust не активна по умолчанию, и не приводит ко включению Rust в число обязательных сборочных зависимостей к ядру). Добавлен API pin-init для безопасной инициализации прикреплённых структур данных. Добавлены примитивы блокировок LockClassKey, Lock/Guard, Mutex и SpinLock. Реализованы типы: ARef (always-refcounted) для ссылок на объект, к которому применяется механизм подсчёта ссылок, Task для работы со структурой task_struct и LockedBy для защиты данных через внешние блокировки. Добавлена поддержка условных переменных (CondVar). Реализован crate-пакет UAPI для взаимодействия с пространством пользователя. Добавлены функции для манипуляции с ioctl().
    • Добавлена поддержка предоставляемого в процессорах Intel режима LAM_U57 (Linear Address Masking), позволяющего использовать часть битов 64-разрядных указателей (c 57 по 62 биты) для хранения не связанных с адресацией метаданных. Для обычных программ не требуется столько памяти, что могут адресовать 64-разрядные указатели, поэтому верхние биты могут быть задействованы, например, для проверок, связанных с обеспечением безопасности.
    • Реализован вариант механизма объединения идентичных страниц памяти, работающий на уровне процессов и позволяющий значительно снизить потребление памяти за счёт дедупликации страниц с одинаковым содержимым. В отличие от ранее предложенного механизма KSM (Kernel Samepage Merging) в новой реализации включение поддержки дедупликации осуществляется через prctl(PR_SET_MEMORY_MERGE) для процесса целиком и наследуется для дочерних процессов, без необходимости активации для каждого диапазона памяти при помощи вызова madvise(MADV_MERGEABLE), что значительно упрощает применение.
    • Непривилегированным процессам разрешено получение информации от подсистемы ядра PSI (Pressure Stall Information), позволяющей в пространстве пользователя проанализировать сведения о времени ожидания получения различных ресурсов (CPU, память, ввод/вывод) для точной оценки уровня загруженности системы и характера замедления работы. Для непривилегированных процессов опрос PSI допускается не чаще чем каждые две секунды.
    • Добавлен механизм "User trace events", позволяющий создавать события трассировки из пользовательских процессов для отслеживания активности в пространстве пользователя.
    • В BPF добавлена поддержка типовых итераторов, упрощающих создание циклов в BPF-программах, используя шаблон организации цикла, состоящий из шагов "начать итерацию", "перейти к следующему элементу" и "закончить итерацию".

      В BPF также реализовано заполнение в режиме ротации буфера с логом проблем, выявляемых верификатором BPF-кода, т.е. теперь если данные не вмещаются в буфер, в логе сохраняются последние записи, а не начальные. Добавлена возможность сохранения указателей kptr в привязанных к CPU hashmap, LRU hashmap и локальных map-типах (sk, cgrp, task, inode). Улучшено использование kptr-типов с буферами пакетов и XDP. В функции bpf_timer_start() разрешено указание абсолютных значений времени.

    • Добавлена новая виртуальная файловая система /sys/kernel/tracing/touched_functions, позволяющая определить все функции ядра, доступные для трассировки и прикрепления BPF-программ.
    • В механизм ptrace добавлены новые операции PTRACE_GET_SYSCALL_USER_DISPATCH и PTRACE_SET_SYSCALL_USER_DISPATCH, позволяющими одному процессу управлять настройками диспетчеризации системных вызовов в другом процессе, что будет использовано в инструментарии CRIU, предназначенном для сохранения и восстановления состояния процессов в пространстве пользователя.
    • Добавлена поддержка механизма определения и коррекции ошибок EDAC (Error Detection And Correction) в серверах на базе процессоров Intel Sierra Forest.
    • В интерфейсе асинхронного ввода/вывода io_uring появилась возможность одновременной прямой записи в файл в несколько потоков (поддерживается в ext4 и XFS). В io_uring также добавлена опция "multishot" для повторяющейся генерации таймаутов без необходимости промежуточной перенастройки таймера.
    • В минимальной стандартной Си-библиотеке Nolibc реализована поддержка архитектуры LoongArch (в дополнение к поддержке ARM, AArch64, i386, x86_64, s390, RISC-V и MIPS).
    • Добавлено руководство по быстрой сборке урезанного варианта ядра.
    • Удалён SLOB (slab allocator), устаревший механизм распределения памяти slab, который был спроектирован для систем с небольшим объёмом памяти. Вместо SLOB следует использовать SLUB или SLAB.
    • Для систем на базе архитектуры RISC-V реализована поддержка перехода в спящий режим (hibernation) и предоставлена возможность сборки ядра в виде файла, скомпонованного в режиме PIE (Position-independent executables). Добавлен новый системный вызов riscv_hwprobe() для предоставления информации о производителе и архитектуре доступного оборудования. Для RISC-V также добавлена поддержка расширения Svnapot, позволяющего связывать группы страниц памяти, размером 4K, для создания более крупных страниц памяти.
    • Для архитектуры S390 реализована поддержка GCC-плагина STACKLEAK, обеспечивающего инициализацию всех хранимых в стеке переменных для предотвращения утечки информации из ядра через неинициализированные переменные, которые могут содержать остатки ранее сохранённых в стеке данных.
    • В системный вызов userfaultfd(), позволяющий создавать обработчики обращений к невыделенным страницам памяти (page faults) в пространстве пользователя, добавлены новые флаги: UFFD_FEATURE_WP_UNPOPULATED для защиты от записи незаполненных анонимных областей памяти и UFFDIO_CONTINUE_MODE_WP для частичной защиты от записи элементов таблицы страниц памяти.
    • Проведена работа по удалению макроса MODULE_LICENSE() из кода, который не может быть собран как модуль ядра.
    • Предложен более гибкий механизм управления памятью загружаемых модулей ядра - module_memory, также примечательный улучшениями, связанными с производительностью и безопасностью.
    • В драйвер amd-pstate добавлена поддержка управляемого автономного режима (Guided Autonomous Mode), при котором частота процессора выбирается автоматически, но не может выходить за пределы указанного диапазона.
    • В планировщике задач устранено регрессивное изменение, из-за которого в ядрах 6.2 и 6.3 снизилась производительность высоконагруженных систем с СУБД PostgreSQL.
  • Дисковая подсистема, ввод/вывод и файловые системы
    • В файловой системе tmpfs реализована опция монтирования "noswap", запрещающая использование системного раздела подкачки для хранения данных.
    • В XFS добавлены изменения, необходимые для реализации проверки ФС на лету (online scrub), включение которой ожидается в одном из следующих выпусков (при этом уже добавлена документация на online fsck).
    • В файловой системе Ext4 упрощена огранизация записи журнала (data=journal). Внесены оптимизации, связанные с предварительным распределением inode, позволившие ускорить работу в системах, в которых выполняется большое число случайных операций записи. Операции чтения и записи страниц памяти переведены на использование фолиантов страниц памяти (page folios).
    • В Btrfs переписан код для проверки ФС, который переведён на использование scrub_stripe, поддерживает проверку RAID56 и выполняется примерно на 10% быстрее. Повышена производительность журналирования каталогов (исключение перебора индексов при журналировании позволило в 4 раза сократить время, затрачиваемое на выполнение fsync).
    • В драйвере NTFS3 удалена опция монтирования "noacsrules", которая была некорректно реализована.
    • В сервер NFS добавлена поддержка RFC 9289, определяющего механизм TLS-шифрования RPC-вызовов.
    • В системном вызове open() запрещено одновременное указание флагов O_DIRECTORY и O_CREAT, которое теперь будет приводить к выводу ошибки EINVAL.
    • В файловой системе F2FS добавлена поддержка зонированных блочных устройств, в которых размер зон не кратен степени двойки.
    • Изменено кодирование ioctl-команд для драйвера ublk, выносящего специфичную логику на сторону процесса в пространстве пользователя. Для обеспечения совместимости со старыми обработчиками добавлена сборочная настройка UBLK_LEGACY_OPCODES.
  • Виртуализация и безопасность
    • В хранилище ключей (keyring) ".machine" реализован режим, допускающий размещения только ключей, заверенных цифровой подписью известного системе удостоверяющего центра. Хранилище ".machine" содержит ключи владельца системы (MOK, Machine Owner Keys), используемые в shim-загрузчике и применяемых для заверения цифровой подписью компонентов ядра, загружаемых на стадии после начальной загрузки, например, модулей ядра. Новый режим нацелен на предоставление возможности размещения в хранилище ".machine" ключей, используемых в подсистеме IMA (Integrity Measurement Architecture), предназначенной для проверки целостности компонентов операционной системы по цифровым подписям и хэшам.
    • Запрещено отключение и выгрузка модуля SELinux во время работы. Отключение SELinux теперь может производиться только на начальной стадии загрузки через передачу параметра "selinux=0" в командной строке ядра. В большинстве дистрибутивов Linux уже применяется подобный запрет, поэтому изменение не отразится на рабочих процессах.
    • В SELinux прекращена поддержка параметра "checkreqprot", позволявшего отключить проверку защиты памяти при обработке правил (параметр разрешал использование исполняемых областей памяти, независимо от предписаний, заданных в правилах).
    • Добавлена поддержка гипервызовов Hyper-V, применяемых для проброса PCI-устройств в гостевые системы с драйверами для Hyper-V. Добавлена начальная поддержка виртуальных уровней доверия Hyper-V (VTL, Virtual Trust Level).
    • В гипервизоре KVM реализован фреймворк для выноса обработки запросов SMCCC (Secure Monitor Call Calling Conventions) в пространство пользователя, что позволяет реализовывать многие операции, связанные с виртуализацией, в пространстве пользователя, без их добавления в ядро.
    • В драйвере AMD IOMMU (amd_iommu) появилась поддержка 5-уровневых таблиц страниц памяти, что позволяет выделять до 4 ПБ физической памяти гостевым системам.
  • Сетевая подсистема
    • Реализован универсальный программный интерфейс для управления светодиодными индикаторами на сетевых коммутаторах или сетевых платах. В структуру данных DeviceTree добавлены отдельные поля для привязки светодиодных индикаторов к устройствам.
    • Добавлен новый API на основе протокола Netlink, предназначенный для организации вызова ядром вспомогательных функций, выполняемых в пространстве пользователя. Новый API может использоваться для вызова обработчиков согласования соединения TLSv1.3 и установки сетевого сеанса, используя для этого функциональность из внешних библиотек.
    • Для протокола SCTP реализована поддержка планировщиков для справедливого распределения пропускной способности между потоками (Fair Capacity Scheduler) и справедливого заполнения очереди с учётом весовых коэффициентов (Weighted Fair Queueing Scheduler).
    • Добавлена возможность прикрепления BPF-программ для обработки хуков NetFilter, например, для создания обработчика, принимающего решение о перенаправлении пакетов (FORWARD) или выполнения действий на стадии до маршрутизации (PREROUTING).
  • Оборудование
    • В драйвере i915 (Intel) продолжена реализация поддержки GPU Meteor Lake.
    • В драйвер AMDGPU внесены изменения для управления энергопотреблением на системах на базе APU AMD Van Gogh.
    • Добавлен драйвер QAIC для PCIe-карты Qualcomm Cloud AI 100 (AIC100) с ускорителем операций для систем машинного обучения.
    • Удалены символьные драйверы для устаревших устройств с интерфейсом PCMCIA, такие как cm4000_cs, cm4040_cs и scr24x_cs.
    • Прекращена поддержка SoC Intel Thunder Bay (выпуск данного SoC был отменён Intel).
    • Добавлена поддержка игровых контроллеров Turtle Beach.
    • Добавлена начальная поддержка звука на системах с CPU Intel Lunar Lake. Добавлен драйвер AMD SoundWire Manager для управления звуковым сопроцессорами AMD.
    • Добавлена поддержка мониторинга состояния датчиков температуры через API hwmon для около 100 моделей плат ASUS.
    • В драйвере MediaTek MT76 добавлена поддержка WiFi 7.
    • Добавлена начальная поддержка систем Apple на базе ARM-чипа M2.
    • Добавлен драйвер msi-ec, позволяющий из пространства пользователя управлять расширенными функциями ноутбуков MSI, такими как выбор профиля энергопотребления, изменение скорости кулера, управление светодиодными индикаторами и задание уровней зарядки.

Одновременно латиноамериканский Фонд свободного ПО сформировал вариант полностью свободного ядра 6.4 - Linux-libre 6.4-gnu, очищенного от элементов прошивок и драйверов, содержащих несвободные компоненты или участки кода, область применения которых ограничена производителем. В выпуске 6.4 обновлён код чистки блобов в документации к микрокоду x86, x86-драйверах для планшетов Android, криптодрайверах QAT, а также в новых файлах devicetree для устройств qcom на базе архитектуры AArch64. Прекращена чистка драйвера vs6624, который был удалён из ядра. Улучшена очистка загрузчиков блобов в коде op-tee, rtl8710b и qcom Cloud AI. Проведена чистка реализации протокола bluetooth nxp.



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

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

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