След две месеца разработка, Линус Торвалдс представи версия на ядрото Linux 6.11. Сред най-забележимите промени: поддръжка на атомарни записи на блочно ниво, поддръжка на операции bind() и listen() в io_uring, нов механизъм за заключване на софтуерни обработчици на прекъсвания, възможност за запис в отразени в паметта изпълнявани файлове, поддръжка за разработка на драйвери за блочни устройства на езика Rust, оптимизация на повикването на getrandom(), нова реализация на AES-GCM.
В новата версия са приети 15130 корекции от 2078 разработчици, размерът на пача е 85 MB (промените засягат 13282 файла, добавени са 985857 реда код, изтрити са 268915 реда). В предишното издание имаше 14564 корекции от 1989 разработчици, размерът на пача бе 41 MB (двойно по-малко от пача за ядрото 6.11). Около 46% от всички представени промени в 6.11 са свързани с драйвери на устройства, приблизително 17% от промените имат отношение към обновяване на код, специфичен за хардуерни архитектури, 10% са свързани с мрежовия стек, 5% — с файлови системи и 3% — с вътрешни подсистеми на ядрото.
Основни нововъведения в ядрото 6.11:
- Дискова подсистема, вход/изход и файлови системи
- Реализирана е поддръжка на атомарни операции за запис на блочно ниво, при които на устройството се записва или целият указан набор от блокове, или нито един, което позволява защита от ситуации, при които след повреда на оборудването се записва само част от блоковете, а в друга част остава стара информация. За включване на атомарен режим на запис в системния повик pwritev() е добавен флагът RWF_ATOMIC. Информация за поддръжката на атомарен запис (atomic_write_unit_min, atomic_write_unit_max и atomic_write_segments_max) спрямо отделни файлове може да се получи с помощта на функцията statx().
- Предоставена е поддръжка за запис в изпълнявани файлове, свързани с работещи процеси. Преди това, както и в други Unix-подобни системи, ядрото извеждаше грешка при опит за запис в изпълняем файл на стартиран процес. Това ограничение е премахнато, тъй като е лишено от практическо значение.
- Реализирана е възможност за разработка на драйвери за блочни устройства на езика Rust. Като пример в ядрото е добавен драйвер rnull, който представлява аналог на драйвера null_blk, написан на езика Rust.
- В файловата система Btrfs в опцията за монтиране «rescue=» е реализирана поддръжка на новите режими «ignoremetacsums» и «ignoresuperflags», които могат да се използват за извеждане на някои проверки в потребителското пространство при възстановяване на FS след срив. Реализацията на операцията за динамично възстановяване на групи блокове е преоформена, за да се изключи възникването на ситуация на недостиг на свободно пространство при непълно запълване на FS.
- В файловата система ntfs3 е реализирана поддръжка на атрибутите «compressed» и «immutable», определящи компресирани и некоригируеми файлове.
- В FS F2FS и Ext4 обработката на имената на файловете без оглед на регистра (casefold) е опростена чрез съхраняване на имената под формата на qstr-стрингове без излишни преобразувания на регистра.
- В FS Ext4 реализацията на функцията jbd2_transaction_committed е оптимизирана за повишаване на производителността на много бързи носители (в тестовете е отчетено увеличаване на обработваните операции в секунда, достигащо 20%).
- В системния израз statx() е разрешено предаването на указател NULL вместо празен низ с файловия път, в случай че е зададен флагът AT_EMPTY_PATH.
- В системния израз open_by_handle_at() са смекчени проверките за правата на достъп до файла, в случай на липса на правомощия CAP_DAC_READ_SEARCH за търсене в началното пространство от имена. Преди наличието на правомощия CAP_DAC_READ_SEARCH към началното пространство от имена не позволяваше използването на системния израз open_by_handle_at() в контейнери.
- Разширени са възможностите на системните изрази listmount() и statmount(). В listmount() е добавен флаг LISTMOUNT_REVERSE за извеждане на съдържанието на таблицата с точки за монтиране в обратен ред (най-новите записи отгоре). В statmount() е реализиран извеждането на опциите, зададени при монтиране на FS. В двата системни израза е разрешена работа при отсъствие на достъп до началното пространство от имена (когато има само достъп до локалното или външното пространство от имена).
- В FS Bcachefs е реализирана поддръжка на автоматично прозрачно възстановяване на проблемни данни, използвайки кодове за възстановяване на грешки — ако при четене възникне грешка при вход/изход или се изчисли несъответствие на контролна сума, проблемният блок данни автоматично се презаписва при наличие на излишност за неговото възстановяване.
- Памет и системни услуги
- Въведени са пачове с нов механизъм за блокиране на софтуерни обработчици на прекъсвания (BH, bottom-half), който осигурява блокиране на използваните структури данни, без да блокира паралелното изпълнение на несвързан с тях код. Отбелязва се, че промените не само че са снижавали забавянията за ядра, работещи в режим реаlтайм, но и увеличават производителността на обикновените ядра (например, за определени натоварвания се наблюдава увеличение на производителността на мрежовата подсистема с 14.5%).
- В подсистемата за асинхронен вход/изход io_uring е добавена поддръжка за операции, реализиращи функциите bind() и listen(), които се използват за създаване на приемни мрежови сокети.
- Добавен е набор от ioctl-операции за псевдо-ФС NSFS (NameSpace FS), предназначен за работа с пространства от имена. Новите ioctl позволяват преобразуване на идентификатори на процеси и групи потоци между различни пространства от имена на идентификатори на процеси (PID namespace). Подобни ioctl, които позволяват на базата на pidfd-идентификатори да определят файлови дескриптори на процеси в отделни пространства от имена, също са добавени в псевдо-ФС pidfd.
- За BPF-програмите е добавена поддръжка на нов итератор за работа с битови маски, който може да се използва, например, за итерация над отделни битове в области на паметта, като cpumask. Добавен е механизъм за изпращане на уведомления на процесите в потребителското пространство за отключване (detach/unregister) на обекта struct_ops. Разширен е обхватът от типове, които могат да се използват в масиви (например, могат да се обявяват масиви, съдържащи елементи с типове kptr, bpf_rb_root и bpf_list_head). Предложен е по-надежден механизъм Split BTF (BPF Type Format), използван за проверка на типове в псевдокод на BPF.
- Добавена е подсистема, позволяваща организиране на подаването на електрическа енергия на устройства в определен ред, в случай че едно устройство трябва да бъде активирано преди друго (например, при активиране на безжични чипове на платформи Qualcomm).
- Добавен е модул „Sloppy logic analyzer“, позволяващ създаването на опростени логически анализатори на сигнал, използващи GPIO и работещи на отделно ядро на CPU.
- Добавена поддръжка на runtime-константи, които могат да се използват вместо променливи, инициализирани веднъж. Например, runtime-константите могат да се прилагат вместо променливи, съхраняващи указатели и размери за кеша на dentry. Тези променливи се задават по време на зареждане и след това никога не се променят. Идеята е да се заменят стойностите на подобни променливи директно в инструкциите в кода, изключвайки разходите, свързани с манипулации с указатели.
- Продължава преносът на изменения от клон Rust-for-Linux, свързани с използването на Rust като втори език за разработка на драйвери и модули на ядрото (поддръжката на Rust не е активирана по подразбиране и не води до включване на Rust в набор от задължителни зависимости за компилиране на ядрото). Добавена е поддръжка за версия 1.80 на Rust (като минимална версия все още се поддържа 1.78 на Rust). Освен предишно отбелязаните средства за разработка на драйвери на блокови устройства, в новата версия са добавени абстракции за зареждане на фърмуер, достъп до пространство на потребителя (uaccess) и работа със структурата „page“.
- За системи x86-64 е реализирана нова системна функция uretprobe(), оптимизираща механизма за трасировка uretprobe, позволяваща проследяване на стойности, които функциите връщат в приложенията на пространството на потребителя.
- Добавени са параметри за командния ред на ядрото: „reserve_mem“ за резервиране на именуван участък от памет по време на зареждане и „ramoops.mem_name“ за използване в pstore областта на паметта, създадена чрез reserve_mem.
- В контролната система на паметта на базата на cgroup в файла memory.reclaim, през който се определят настройките за изхвърляне на памет, е добавен параметър „swappiness“, позволяващ да се промени балансът между изхвърлянето на анонимни страници от паметта в свързаното хранилище и освобождаването на страници от паметта, заети от файловия кеш.
- Добавен е ioctl-интерфейс PROCMAP_QUERY за по-ефективно търсене на виртуални области на паметта (Virtual Memory Area) в /proc/PID/maps.
- В системната функция mmap() е добавен флаг MAP_DROPPABLE за заявка на памет, която никога няма да бъде изхвърлена в свързаното хранилище, а в случай на недостиг на памет може да бъде премахната.
- За архитектурата ARM64 е реализирана поддръжка за горещо свързване (превод в режимите online/offline) на физически и виртуални CPU в системи с ACPI.
- За архитектурата RISC-V е осигурена поддръжка на горещо свързване на паметта и е добавена поддръжка на GCC плъгина STACKLEAK (извършва инициализация на всички променливи, съхранявани в стека, за предотвратяване на изтичането на информация от ядрото чрез неинициализирани променливи, които могат да съдържат остатъци от преди записани в стека данни).
- Премахнат е механизмът на фалшивото картографиране на паметта EFI (fake EFI memory map) по време на зареждане. Този механизъм не е бил използван в практиката и е пречел на разработки в областта на конфиденциалното изпълнение. на виртуални машини.
- Подкрепата за платформата PowerPC 40x е прекратена.
- Повишени са изискванията за версията на GNU Make — за компилация на ядрото се изисква поне версия на GNU Make, публикувана през 2013 година.
- Виртуализация и безопасност
- Интегрирани са пачове, които значително (до 15 пъти) ускоряват получаването на случайни числа чрез системния повик getrandom(). Оптимизацията е основана на използването на механизма vDSO (виртуален динамичен споделен обект), който позволява прехвърляне на обработчика на системния повик от ядрото в пространството на потребителя и избягване на превключвания на контекста. Зареждането на имплементацията на системния повик в адресното пространство на процеса става директно от ядрото.
- За системи x86-64 е включена нова реализация на алгоритъма за криптиране AES-GCM, която поддържа използването на векторни инструкции VAES, VPCLMULQDQ и AVX512/AVX10 за ускорение на изчисленията. В проведените тестове увеличението на производителността след преминаването на новата реализация достига 156%. Асемблерната реализация на AES-GCM е напълно пренаписана с оглед на коректността, производителността, размера и изчерпателната документация на кода.
- Реализирана е възможността за стартиране на ядрото в качеството на гостуваща система в виртуализирани среди, използващи разширението на процесора AMD SEV-SNP (Сигурно вложено страниране), предназначено за осигуряване на безопасна работа с вложени таблици на паметта. За допълнителна изолация на достъпа до ресурсите от виртуалните машини може да се използва модулът SVSM (Linux Secure VM Service Module). В хипервизора KVM е добавена начална поддръжка за стартиране на гостуващи системи, защитени с помощта на AMD SEV-SNP.
- Добавен е отделен allocator за bucket slab, включван чрез параметъра CONFIG_SLAB_BUCKETS и осигуряващ защита срещу атаки с техниката „heap spraying“.
- В хипервизор KVM е добавен ioctl-вик за предварително разпределяне на памет за гост системата до нейното фактическо стартиране.
- Мрежовата подсистема
- Добавен е параметър sysctl net.tcp_rto_min_us, чрез който може да се настройва минималния таймаут за повторно предаване (retransmission timeout) за TCP сокети.
- В утилитата ethtool е добавена възможност за прецизно настройване на конфигурацията на обработчиците на прекъсвания за мрежови интерфейси, използващи интерфейса Net DIM.
- Оборудване
- В драйвера AMDGPU е включена начална поддръжка на GPU AMD RDNA4 ("GFX12"). Добавена е поддръжка на технологии DCN 4.0.x, GC 12.0, GMC 12.0, SDMA 7.0, MES12 и MMHUB 4.1.
- Продължена е работата по drm-драйвера (Direct Rendering Manager) Xe за GPU, базиран на архитектурата Intel Xe, който се използва в видеокартите Intel семейство Arc и интегрирана графика, започвайки от процесорите Tiger Lake. Подобрен е поддръжката на GPU, базиран на микроархитектурите Battlemage, Arrow Lake и Lunar Lake.
- В подсистемата DRM (Direct Rendering Manager) е пренаписан обработчикът на параметрите EDID (Extended Display Identification Data), предоставяни от монитора.
- В драйвера i915 е добавена поддръжка на GPU Battlemage Xe2 и е включен по подразбиране режим CMRR (Content Match Refresh Rate).
- В DRM-драйвера msm (GPU Qualcomm Adreno) е добавена поддръжка на платформата SM7150 и GPU X185 и a505.
- Добавена е поддръжка за дисплейните панели Lincoln Tech Sol LCD185-101CT, Microtips Technology 13-101HIEBCAF0-C, Microtips Technology MF-103HIEB0GA0, BOE nv110wum-l60, IVO t109nw41, WL-355608-A8, PrimeView PM070WL4, Lincoln Technologies LCD197, Ortustech COM35H3P70ULC, AUO G104STN01, K&d kd101ne3-40ti.
- В звуковата подсистема е добавена поддръжка на чипове и кодеци Intel Panther Lake, Asahi Kasei AK4619, Cirrus Logic CS530x, Everest Semiconductors ES8311, NXP i.MX95, LPC32xx, Qualcomm LPASS v2.5, WCD937x, Realtek RT1318, RT1320 и Texas Instruments PCM5242.
- Внесена е финалната порция промени, осигуряващи поддръжка на ARM SoC Snapdragon X Elite, в който се използва собствен 12-ядрен CPU Qualcomm Oryon и GPU Qualcomm Adreno. Чипът е насочен към употреба в лаптопи и настолни компютри и по много тестове превъзхожда чиповете Apple M3 и Intel Core Ultra 155H. Добавените в ядрото 6.11 промени са свързани с поддръжка на GPU Adreno X1-85 и управление на енергийната консумация. Обявена е поддръжка на лаптопи ASUS Vivobook S15 и Lenovo Yoga Slim7x, базирани на SoC Snapdragon X Elite.
Съвместно Латиноамериканският Фонд за свободен софтуер създаде версия на напълно свободното ядро 6.11 — Linux-libre 6.10-gnu, освободено от елементи на фърмуер и драйвери, съдържащи несвободни компоненти или код, чиято област на приложение е ограничена от производителя. В изданието 6.11 е обновен кодът за почистване на блобовете в драйверите mdgpu, adreno, vgxy61, atomisp, btnxpuart, prueth и tas2781. Извършено е почистване на новите драйвери amdgpu isp, tn40, rtl8192du, cs40l50, rt1320 и pcie-rcar-gen4. Осъществено е почистване на имената на блобовете в dts-файловете (devicetree) за архитектурата Aarch64. Добавена е версия на примитивите за зареждане на фърмуер, която не издава предупреждения и заявки (nowait-nowarn). Добавен е код за определяне на примитивите за зареждане на фърмуер в кода на езика Rust.
Източник: opennet.ru
