Релиз на ядро Linux 6.11

След като разработката продължи два месеца, Линус Торвалдс представи версията на ядрото 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', които могат да се използват за отстраняване на някои проверки в пространството на потребителя по време на възстановяване на файловата система след срив. Реализацията на операцията за динамично връщане на групи блокове е преработена, за да се предотврати възникването на ситуации със недостатъчно свободно пространство при непълно запълване на файловата система.
    • В файловата система ntfs3 е реализирана поддръжка на атрибутите 'compressed' и 'immutable', определящи стиснатите и неизменяемите файлове.
    • В файловата система F2FS и Ext4 обработката на имената на файловете без оглед на регистрацията на символите (casefold) е опростена, като имената се съхраняват под формата на qstr-стрингове без излишни преобразувания на регистра.
    • В файловата система 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() е реализирано извеждане на опциите, зададени при монтиране на файловата система. В двата системни извода е разрешена работата при отсъствие на достъп до началното пространство на имената (когато се има достъп само до локалното или външното пространство на имената).
    • В файловата система Bcachefs е реализирана поддръжка за автоматично прозрачно възстановяване на проблемни данни, използвайки кодове за възстановяване на грешки — ако при четене възникне грешка при вход/изход или е изчислено несъответствие на контролната сума, проблемният блок данни автоматично се презаписва при наличие на излишък за неговото възстановяване.
  • Памет и системни услуги
    • Включени са пачове с реализация на нов механизъм за заключване на програмни обработвачи на прекъсвания (BH, bottom-half), който осигурява заключване на използваните структури от данни, без да блокира паралелното изпълнение на несвързан с тях код. Отбелязва се, че промяната е позволила не само да се намалят закъсненията за ядрото, работещо в режим realtime, но и да се повиши производителността на обикновените ядра (например, за определени натоварвания се наблюдава ръст на производителността на мрежовата подсистема от 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). В допълнение към вече споменатите средства за разработка на драйвери на блокови устройства, в новата версия са добавени абстракции за зареждане на фърмуер, достъп до пространството на потребителя (uaccess) и работа със структурата „page“.
    • За системи x86-64 е реализиран нов системен повик uretprobe(), оптимизиращ работата на механизма за трасировка uretprobe, позволяващ проследяване на стойностите, връщани от функциите в приложенията на пространството на потребителя.
    • Добавени са параметрите на командния ред на ядрото: «reserve_mem» за резервиране на именувана област от паметта по време на зареждане и «ramoops.mem_name» за използване в областта на паметта pstore, създадена чрез reserve_mem.
    • В контролера на паметта базиран на cgroup, в файла memory.reclaim, през който се определят настройките за освобождаване на памет, е добавен параметърът «swappiness», който позволява промяна на баланса между освобождаването на анонимни страници памет в swap файл и освобождаването на страници памет, заети от файловия кеш.
    • Добавен е ioctl интерфейс PROCMAP_QUERY за по-ефективно търсене на виртуални области на паметта (Virtual Memory Area) в /proc/PID/maps.
    • В системния повик mmap() е добавен флаг MAP_DROPPABLE за заявка на памет, която никога не ще бъде сброшена в swap файл, а при недостиг на памет може да бъде премахната.
    • За архитектурата 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 (Secure Nested Paging), предназначено за осигуряване на безопасна работа с вложени таблици на страниците на паметта. За допълнителна изолация на достъпа до ресурси от виртуалните машини, може да се прилага модулът SVSM (Linux Secure VM Service Module). В хипервизора KVM добавена е начална поддръжка за стартиране на гостуващи системи, защитени с помощта на AMD SEV-SNP.
    • Добавен е отделен bucket slab allocator, включващ се чрез параметъра 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 и управлението на потреблението на енергия. Обявена е поддръжка за устройства на базата на SoC Snapdragon X Elite, включително лаптопи ASUS Vivobook S15 и Lenovo Yoga Slim7x.

В същото време Латиноамериканският фонд за свободен софтуер представи вариант на напълно свободно ядро 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

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster