След два месеца работа, Линус Торвалдс представи релиза на ядрото Linux 6.19. Сред най-забележимите промени са: подкатегорията Live Update Orchestrator, поддръжка на PCIe Link Encryption, системен повик listns, режим Zero-Copy Receive в io_uring, поддръжка на ARM-разширението MPAM, klp-build за генериране на live-патчи, поддръжка на архитектура LoongArch32, QoS за s2idle, оптимизация на подкатегорията за одит, Intel LASS за защита от Spectre, поддръжка на хешове SHA-3 и BLAKE2b, механизъм Confidential VMBus, TX-оптимизации в мрежовата подкатегория и протокол CAN XL, API за хардуерно ускорение на HDR-изхода.
В анонса на новата версия Линус съобщи, че на следващото ядрено издание ще бъде присвоен номер 7.0, тъй като в клона 6.x са се натрупали достатъчно версии, за да се промени първото число в номера на версията (в свое време версия 6.0 беше съставена веднага след 5.19). Сменянето на номерацията се извършва по естетически причини и е формален акт, който отстранява дискомфорта от натрупването на голям брой версии в серията. Линус се шегува, че го объркват големите числа, за които не му стигат пръстите на ръцете и краката. Въпреки това формално съществува причина за значителна промяна на номера на версията, тъй като от следващото издание поддръжката на Rust ще бъде преместена от експерименталната в основните функции на ядрото.
В новото издание са приети 15657 поправки от 2237 разработчици, размерът на пача е 52 MB (промените засягат 13682 файла, добавени са 794649 реда код, а 335498 реда са изтрити). В предишното издание имаше 15035 поправки от 2217 разработчици, размерът на пача беше 45 MB. Около 40% от всички представени в 6.19 промени са свързани с драйвери за устройства, приблизително 13% от промените се отнасят до обновяване на код, специфичен за хардуерни архитектури, 12% са свързани с мрежовия стек, 5% с файловите системи и 3% с вътрешните подкатегории на ядрото.
Основните нововъведения в ядрото 6.19 (1, 2, 3):
- Дисковата подсистема, вход/изход и файловите системи
- В Btrfs процесите за проверка на ФС (scrub) и замяна на устройства вече не блокират прехода на системата в спящ режим (преди заспиване се запазва състоянието на scrub проверката; след излизане от сън scrub проверката продължава, а операцията по замяна на устройства започва отначало). В реализирания RAID56 е добавена поддръжка за блокове, размерите на които надхвърлят размера на страница памет. Подготовката за поддръжка на fscrypt е завършена. Производителността при работа с блокировки е повишена при изпълнение на операции, свързани с резервиране на пространство. Добавена е поддръжка на ioctl операцията „shutdown“, позволяваща превключване на ФС в състояние, при което се предприема опит за завършване на вече стартирани операции, като новите операции са блокирани.
- В файлова система Ext4 е реализирана поддръжка за блокове, размерите на които надхвърлят размера на страница памет (>4KB на системите x86). Използването на големи блокове подобрява производителността на буферираните операции на запис средно с 50%, но намалява производителността при директен вход/изход поради увеличеното време за изчисление на контролни суми. В новата версия също така са добавени оптимизации, увеличаващи пропускната способност при изпълнение на online дефрагментация.
- В подсистемата FUSE е подобрена поддръжката на буферирано четене при използване на големи фолиа от страници памет (large folios). Чрез iomap е реализирана възможност за проследяване на частично актуални фолиа за зареждане само на данни, които липсват в буфера.
- В VFS е добавена поддръжка на отзываемо делегиране на управление на директория (recallable directory delegation), позволяваща реализиране в NFS на предаване на управление на директория от сървър клиента, така че NFS клиентът без обращения към NFS сървъра самостоятелно да проследява състоянието на директорията на базата на локален кеш. Ако друг NFS клиент извърши промени, свързани с тази директория, делегирането на управление ще бъде отзовано у първия клиент.
- За NFS е добавена поддръжка за четене в режим на директен вход/изход (direct I/O). Реализирани настройки /sys/kernel/debug/nfsd/io_cache_read и /sys/kernel/debug/nfsd/io_cache_write за управление на включването на кеширане и операции с директен вход/изход. Манипулацията с тези настройки позволява да се намалят разходите на страна на NFS клиента при извършване на големи операции за вход/изход.
- В NTFS е реализирана поддръжка за ioctl операцията shutdown, включени по подразбиране опции за монтиране „acl“ и „prealloc“, добавена е поддръжка за време до 1 януари 1970 година.
- За блочни устройства и файлови системи по подразбиране е включено отделно кеширане на обекти „bio“ (Block I/O) за всяко CPU, определящи активните операции за вход-изход.
- Памет и системни услуги
- В ядрото е включена подсистемата Live Update Orchestrator (LUO), позволяваща изцяло рестартиране и обновление на ядрото без спиране на работата и без загуба на състоянието на системата, устройствата и процесите. Подсистемата LUO се базира на вече добавения в ядрото механизъм KHO (Kexec HandOver) и в допълнение към възможността за стартиране на ново ядро от старото без загуба на състоянието на системата решава и задачи като запазване на състоянието на устройствата и оперативната памет, както и осигуряване на непрекъснатост на операциите, свързани с DMA и обработка на прекъсвания. Състоянието се запазва до превключването на новото ядро и се възстановява след активирането на новото ядро без нарушаване на непрекъснатите операции с устройствата, извършвани от системата и приложенията в пространството на потребителя.
- Добавен е системен повик listns() за извеждане на списък на съществуващите в системата пространства на имена без необходимост от преглеждане на /proc//ns/ за всички процеси.
- В системата за асинхронен вход/изход io_uring е добавена поддръжка за разполагане на елементи с различен размер в опашката за изпращане (SQE, Submission Queue Entry), подобно на това как в предишното издание беше разрешено смесването на размера на съдържанието на опашката за резултати (CQE, Completion Queue Event). До този момент всички елементи в опашката трябваше да имат един и същи размер, което водеше до прекомерно потребление на памет поради необходимостта от използване на максималния размер за всички елементи в опашката.
В io_uring е добавена поддръжка на механизма zcrx (Zero-Copy Receive) за получаване на данни без копиране между ядрото и потребителското пространство. Поддръжката на заявки за разпределение на паметта за опашките SQ (Submission Queue) и CQ (Completion Queue) позволява извличането на информация за размера на кръговия буфер, необходима при потребителското разпределение на паметта с флаговете IORING_SETUP_NO_MMAP и IORING_MEM_REGION_TYPE_USER.
- За бърза трасировка на стека с помощта на утилити, като perf, е добавена поддръжка на формата SFrame с информация за разшифроването на стека от извиквания (unwind). SFrame вече се поддържа в GCC и binutils, не води до намаляване на производителността и, за разлика от формата DWARF, съдържа само минимален набор от информация, необходима за трасировка на стека.
- В утилитата perf е добавена поддръжка на унифицирани описания на метрики и събития в JSON формат, както и отложено разшифроване (deferred unwinding) на стека от извиквания в потребителското пространство.
- За AMD процесори е реализиран механизъм за подмяна на данни в кеша, който позволява на устройства за вход/изход директно да вмъкват данни в L3 кеша на CPU без предварителното им поставяне в RAM.
- Добавена е поддръжка на MPAM (Partitioning and Monitoring на ресурсите в паметта), разширение на архитектурата на командния набор ARMv8-A за маркиране на всяко обращение към паметта с идентификатор на секция (PARTID, Partition ID) и идентификатор на мониторингова група (PMG, Monitoring Group ID). В контекста на PARTID е възможно ограничаване на потреблението на ресурси, като пропускателната способност на паметта или размерът на кеша, така че някоя група задачи да не заема всички ресурси. В контекста на мониторинга комбинацията от PMG и PARTID може да се използва за проследяване на потреблението на ресурси в паметта при определени натоварвания.
- В случай на аварийно прекратяване на процеса след получаване на сигнал, друг процес, притежаващ pidfd на приключилия процес, вече може да определи номера на сигнала, довел до прекратяване на процеса.
- Реализацията на възобновяеми последователности (restartable sequences) е преработена, позволяваща на приложенията да организират псевдо-атомарно непрекъснато изпълнение на група инструкции (в случай на прекъсване от друг поток, се предприема нова опит за изпълнение на последователността). Новата реализация се отличава с по-добра висока производителност.
- За BPF-програмите са реализирани инструкциите BPF_JMP, BPF_X и BPF_JA за извършване на непреки преходи към определена позиция от таблицата на преходите. Добавена е концепцията за динамични указатели (dynptr), позволяващи четене на данни от структурирани файлове. Възможността за прикрепяне на множество байтове с метаданни към мрежовите пакети е добавена.
- Модулите на Python, използвани за обработка на документацията на ядрото, са преместени в отделна директория tools/lib/python.
- Добавена е функцията mempool_alloc_bulk() за безопасно разпределение на елементи от пул на паметта едновременно за няколко обекта.
- Продължава преносът на изменения от клон Rust-for-Linux, свързани с използването на езика Rust като втори език за разработка на драйвери и модули на ядрото (поддръжката на Rust не е активирана по подразбиране и не води до включване на Rust в задължителните зависимости за компилация на ядрото). В новата версия в ядрото е вградена библиотека «syn» с парсер за Rust-код, който улеснява написването на сложни макроси. Разширени са възможностите на библиотеките kernel, pin-init и rbtree. Добавена е библиотека ‘num’ с тип Integer за манипулиране на цели числа. В макроса «module!» е добавена поддръжка за целочислени параметри. Реализирана е възможността за указване на параметри при зареждане на модули на ядрото, написани на Rust. Реализирани са абстракции за подсистемите I2C и PWM (Pulse Width Modulation).
- Добавен е макрос «at_least» (например, «param[at_least 7]», който информира за минимално допустимия размер на масива, предаван на функцията. Ако в функцията бъде предаден масив с по-малко елементи, компилаторът ще изведе предупреждение.
- Включен е скриптът klp-build за генериране на модули на ядрото, внасящи изменения в работещо ядро (livepatch), на база файл с патч. В утилитата objtool са внесени промени, необходими за създаване на live-патчове.
- В User-mode Linux (стартиране на ядрото като потребителски процес) е добавена ограничена поддръжка за многопроцесорност, но нишките в един процес все още не могат да се изпълняват едновременно. Започна портироването на User-mode Linux на библиотеката nolibc.
- Добавена е поддръжка на архитектурата LoongArch32 (LA32R, LA32S) в допълнение към LoongArch64.
- Добавена е възможност за задаване на QoS ограничения за интензитета на събуждане на процесора в режим на икономия на енергия s2idle (Suspend-To-Idle), който замразява изпълнението на процесите в пространството на потребителя, но оставя активни някои обработвачи в ядрото.
- Добавена е поддръжка за управление на таблиците за страниците на паметта за контролерите IOMMU (Input-Output Memory Management Unit), които извършват транслация на виртуални адреси, видими за хардуерното устройство, в физически адреси, с възможност за филтриране на DMA операции по виртуални адреси, както и ограничаване и изолиране на входно-изходните операции.
- В събитията за проследяване на системни повиквания е реализирана възможност за четене на буфери от потребителското пространство и включване на съдържанието им (например, имена на файлове) в резултата от проследяването.
- Стратегическите страници на паметта (guard page), достъпът до които предизвиква изключение и аварийно завършване на процеса (SIGSEGV), вече се обозначават с особена етикета в файла /proc/PID/smaps.
- Добавена е възможност за управление на големи страници на паметта (transparent huge page) в частната памет на зонираните устройства.
- В устройството zram, прилагано за компресирано съхранение на раздела за разменна памет в паметта, е реализирана поддръжка за извеждане на множество структури „bio“ (Block I/O) в пакетен режим (writeback batching).
- Включен е шрифтът „Terminus 10×18“, който подобрява четимостта на информацията от конзолата на екраните на лаптопи със средно разрешение (1440×900).
- Работата на подсистемата за одит е значително оптимизирана — отбелязва се намаление на разходите два пъти.
- Виртуализация и сигурност
- Добавена е поддръжка за възможността за разделяне на линейното адресно пространство (LASS) предоставяна от процесорите Intel, което позволява хардуерно разделяне на диапазоните от адреси между пространството на потребителя и ядрото с цел повишаване на сигурността. Адресното пространство се разделя на базата на най-старшия бит в адреса — половината от адресното пространство с установен най-старши бит се използва за ядрото, а долната част — за пространството на потребителя. На ранен етап от изпълнението на инструкциите (преди спекулативното изпълнение) се извършва проверка за допустимост на достъпа от пространството на потребителя до адресите с установен най-старши бит и обратно. Това разделение позволява предотвратяването на течовете на памет от ядрото в пространството на потребителя чрез странични канали дори при спекулативно изпълнение на инструкциите, което дава възможност за прилагане на LASS за защита срещу атаки от клас Meltdown и Spectre, без да води до големи разходи.
- Добавена е възможност за активиране на разширения за усилване на сигурността на PCI Express шина — PCIe Link Encryption и PCIe Device Authentication, които позволяват проверка на автентичността и криптиране на комуникационния канал между PCIe устройство и виртуална машина, защитена чрез механизми Intel TDX (Trusted Domain Extensions) и AMD SEV-SNP (Secure Nested Paging). Реализираните технологии не позволяват улавяне, анализ и подмяна на данни в DMA трафика при наличие на достъп до хост системата или други устройства.
- Вграденият криптографски библиотек добавя поддръжка за алгоритмите SHA-3 (SHA3-224, SHA3-256, SHA3-384, SHA3-512), SHAKE128, SHAKE256 и BLAKE2b.
- За LSM модулите (Linux Security Modules), и по-специално за SELinux, е реализирана възможност за проследяване на създаването на дескриптори memfd за прилагане на политики за сигурност към свързаните с тях обекти.
- В LSM модула IPE (Integrity Policy Enforcement), който определя общата политика за осигуряване на целостта на цялата система, е добавена поддръжка за флага AT_EXECVE_CHECK във функцията execveat(), включваща проверка на целостта на скрипта преди неговото изпълнение от интерпретатора.
- Добавени са примитивите scoped_user_read_access(), scoped_user_write_access и scoped_user_rw_access() за ограничен достъп до данни в потребителското пространство с защита срещу спекулативни атаки.
- Добавена е поддръжка на механизма Confidential VMBus, използван в хипервизора HyperV за защита от намеса в взаимодействието между гостуващата система, работеща в конфиденциален режим (с криптиране на паметта и изолация на регистрите на базата на технологии AMD SNP и Intel TDX), и паравизора, който е отговорен за достъпа до устройствата, обработващи конфиденциални данни.
- Добавена е възможност за предаване на информация за аварийно завършения процес (за генериране на coredump) чрез механизма pidfd. Идентификаторът PIDFD е свързан с конкретен процес и не се променя, докато PID може да бъде свързан с друг процес след приключване на текущия процес, асоцииран с този PID. Използването на pidfd позволява блокиране на атаки по подмяна на аварийно завършилия suid-процес с друг процес, постигаща състояние на състезание в момента след стартиране на обработката от ядрото на аварийното завършване, но преди проверката на параметрите на процеса от обработчика в пространството на потребителя.
- Мрежова подсистема
- Внесени са оптимизации в мрежовата подсистема за подобряване на ефективността на предаване на данни (TX). Премахването на spin-блокировката от функцията __dev_queue_xmit() и използването на работа без блокировки структура llist позволи четирикратно увеличаване на производителността при висока натовареност и удвояване на интензивността на изпращането на пакети при намалена натовареност на CPU с два пъти.
- Предоставена е възможност за изключване на системните лимити за използване на паметта за отделни мрежови сокети (в този случай ще се използват общите лимити за паметта, задавани за отделни контейнери). За управление на изключването на лимитите е предложен sysctl net.core.bypass_prot_mem и флагът SK_BPF_BYPASS_PROT_MEM в функцията bpf_setsockopt.
- Добавена е поддръжка на разширението RFC 5837, което добавя в ICMP-сообщенията «Time Exceeded», връщани при изтичане на времето за живот (TTL) на пакета, данни за входящите мрежови интерфейси за получаване на по-подробна информация при трасировка на маршрути с помощта на утилитата traceroute.
- Добавена е поддръжка на непрекъснат активно пулинг (busy polling) в отделен поток на ядрото с цел извлечение на дескриптори от RX/TX-опашките за приложения, изискващи минимални забавяния.
- Добавена е поддръжка на протокола CAN XL (Controller Area Network eXtended Length), в който размерът на полето с данни е увеличен до 2048 байта, за да се осигури интеграция с TCP/IP мрежи, реализирана е възможност за тунелиране на Ethernet кадри и е добавена поддръжка на широтно-импулсната модулация, което позволява предаване на данни със скорости от 20 Мбит/с и нагоре.
- Добавена е поддръжка на структурата sockaddr_unsized, вариант на структурата sockaddr, използваща масив с гъвкави елементи вместо фиксиран масив (sa_data[] вместо sa_data[14], който по същество се е използвал за справки към други структури с по-голям размер).
- Добавена е възможност за използване на функционалността getsockname и getpeername чрез подсистемата io_uring.
- Добавени са sysctl net.ipv4.tcp_rcvbuf_low_rtt и net.ipv4.tcp_comp_sack_rtt_percent за оптимизиране на TCP.
- Добавена е поддръжка на връзки с пропускна способност 1600 Gbps (1.6T).
- Оборудване
- В подсистемата DRM (Direct Rendering Manager) е добавен API за използване на хардуерни възможности за преобразуване на цветове, позволяващи избягване на изпълнението на подобни преобразувания чрез шейдъри или изпълнение на код на CPU. За извеждане на съдържание на HDR монитор, сложни цветови преобразувания сега могат да се извършват от дисплейния контролер на стадий преди и след смесването на слоевете (blending), вместо софтуерно композиране на съдържанието в крайния буфер за отображение. Освен намаляването на разходите и енергопотреблението при организиране на извеждане в HDR, предложената функционалност може да се използва за коректна цветопредача в видео или изображенчески редактори.
- Добавен е драйверът „ethosu“ за NPU Arm Ethos U65 и U85, предназначен за хардуерно ускорение на изпълнението на AI модели.
- В драйвера i915 за GPU Lunar Lake и нови модели е добавена поддръжка за хардуерно повишаване на резолюцията на изображението (Sharpening).
- Продължава работата по drm-драйвера (Direct Rendering Manager) Xe за GPU, базирани на архитектурата Intel Xe, която се използва в видеокартите Intel от семейството Arc и интегрираната графика, започвайки от процесорите Tiger Lake. Добавена е начална поддръжка на архитектурата Xe3P, използвана в GPU Crescent Island и семейството на процесори с интегрирана графика Nova Lake.
- В драйвера AMDGPU е реализирана пълна поддръжка на видеокарти AMD от семейство GCN 1.0 «Southern Island» и 1.1 «Sea Islands», за работа с които преди това се използваше драйверът Radeon. Драйверът AMDGPU е доведен до паритет с възможностите на драйвера Radeon и е активиран по подразбиране за посочените GPU. Картите GCN 1.x са издавали от 2012 до 2019 година и обхващат модели като Radeon HD 77xx/78xx/79xx/87xx/88xx/89xx, Radeon R9 280, FirePro W4000-W9000, Radeon Sky 700/900, Radeon R9 265/270/370, Radeon R9 290/390, HD 7790/8870 и други видеокарти от семействата Radeon Rx 200/Rx 300. Освен повишаване на производителността средно с 24%, преминаването на AMDGPU позволява реализиране на поддръжка за графичния API Vulkan 1.3 за тези GPU. Освен това в AMDGPU е добавена поддръжка за аналогови конектори и Video Coding Engine 1.0, а също така по подразбиране е активиран стек DC (Display Core) за GPU, базирани на микроархитектурата Bonaire (Radeon HD 7700).
- В драйвера Nouveau е реализирана поддръжка на хардуерния ускорител NVJPG, присъстващ в SoC Tegra210.
- В драйвера Panthor е добавена поддръжка за GPU Mali-G1 и начална поддръжка на чипа MediaTek MT8196.
- Добавена е поддръжка на звуковата подсистема на чиповете Intel Nova Lake S, лаптопи HP с HDA CS35L41, а също така звукови интерфейси CIX IPBLOQ HD и Onkyo SE-300PCIE.
- Продължава интеграцията на компонентите на драйвера Nova за GPU NVIDIA, оборудвани с GSP-фърмуери, използвани от серията NVIDIA GeForce RTX 2000 на базата на микроархитектурата Turing. Драйверът е написан на Rust. В новата версия е започната работа по RPC и е завършена реализацията на зареждането на съпроцесора GSP (GPU System Processor).
- Добавена е поддръжка на ARM-платформи, SoC и устройства: Bananapi r4 pro, LinkEase EasePi R1, Qualcomm MSM8937 (Snapdragon 430), Renesas R-Car X5H, FriendlyElec NanoPi R76S, TI AM62L, Black Sesame Technologies C1200, Aspeed AST2600, Genio 1200 EVK, grinn geniosbc-510/700, Tanix TX9 Pro, Radxa Dragon Q6A, Tinker Board 3/3S, Aquila AM69, phyBOARD-Segin-i.MX91, i.MX 95 Verdin Evaluation Kit, Toradex SMARC iMX95, VIDIA Jetson Nano 2GB, Renesas rz/g3s, Indiedroid Nova, 24 варианта плат Enclustra Mercury.
- Добавена е поддръжка на смартфони и таблети на базата на SoC Mediatek MT6582 (Alcatel yarisxl), Nvidia Tegra124 (Xiaomi Mi Pad) и Qualcomm MSM8939 (ASUS ZenFone 2). Добавена е поддръжка на лаптопи на SoC Qualcomm sdm850, като Huawei MateBook E 2019.
- Добавена е поддръжка на SoC и платформи, базирани на архитектурата RISC-V: OrangePi R2S, OrangePi RV, Anlogic dr1v90, Tenstorrent Blackhole.
Едновременно латиноамериканският Фонд за свободен софтуер създаде вариант на напълно свободното ядро 6.19 — Linux-libre 6.19-gnu, премахнато от елементи на фърмуер и драйвери, съдържащи несвободни компоненти или участъци от код, чиято употреба е ограничена от производителя. В изданието 6.19 кодът за зареждане на бинарни фърмуери е премахнат от звуковата подсистема SDCA. Обновен е кодът за почистване на blob-овете в драйверите Intel XE, Nova-Core, Qualcomm Iris, Venus и Q6V5, TI PRUeth, Intel iwlwifi, Marvell mwifiex, FourSemi fs210x, Realtek rt1320 и звуковите кодеци TI tas2783. Извършено е почистване на имената на blob-овете в dts файловете (devicetree) за ARM чипове. Почистването на драйвера STM C8SECTPFE DVB е прекратено, като е премахнато от ядрото.
Източник: opennet.ru
