Ядро 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.
|
|