После двух месяцев разработки Линус Торвальдс выпустил ядро Linux 3.14. Среди наиболее заметных улучшений: новый класс планирования задач Deadline, блочное устройство zram для хранения раздела подкачки в ОЗУ с сжатом виде, поддержка режима PVH в Xen, расширение возможностей трассировки.
В новую версию принято более 12 тысяч исправлений от почти 1400 разработчиков, размер патча - 32 Мб (изменения затронули 10.6 тысяч файлов, добавлено 606195 строк кода, удалено 265086 строк). Около 46% всех представленных в 3.14 изменений связаны с драйверами устройств, примерно 19% изменений имеют отношение к обновлению кода специфичного для аппаратных архитектур, 16% связано с сетевым стеком, 5% - файловыми системами и 3% c внутренними подсистемами ядра. 10.2% изменений внесено сотрудниками компании Intel, 7.3% - Red Hat, 4.4% - Linaro, 5% - Samsung, 3.3% - SUSE, 2.9% - IBM, 2.7% - Google, 2.4% - TI, 2.1% - NVIDIA, 2.0% - FOSS Outreach Program for Women, 1.8% - Huawei, 1.3% - Oracle.
Из наиболее интересных новшеств можно отметить:
- Память и системные сервисы
Для планировщика задач добавлена поддержка класса SCHED_DEADLINE, реализующего алгоритм EDF (Earliest Deadline First), основанный на идее выбора для выполнения из очереди ожидающих процессов задачи, наиболее близкой к истечению крайнего расчётного времени (deadline). SCHED_DEADLINE поддерживает обеспечение работы процессов, требующих выполнения операций в режиме реального времени, предоставляя для подобных задач гарантированное время выполнения, независимо от общего количества обслуживаемых процессов, и реализуя возможность резервирования пропускной способности CPU для процессов.
Ранее доступный планировщик задач не мог обеспечить такое поведение, так как не способен гарантировать необходимое время выполнения задачи в заданном интервале времени (например, гарантировать выполнение задачи 10 мкс в интервале 100 мкс) из-за того, что переключение между задачами зависит от общего количества обслуживаемых процессов, каждый из которых может выполняться с произвольной задержкой и, таким образом, может задержать выполнение следующей задачи.
- Снятие ярлыка экспериментальной разработки и перенос из ветки staging в основное дерево ядра подсистемы zRAM, предназначенной для хранения раздела подкачки в памяти в сжатом виде. Суть zRAM сводится к тому, что в памяти создается блочное устройство на которое производится своппинг со сжатием. В настоящее время zRAM уже активно используется в различных потребительских устройствах, в том числе в телеприставках и портативных устройствах на базе платформы Android, ChromeOS и cyanogenmod.
- Поддержка триггеров в подсистеме обработки событий трассировки, позволяющей отследить обращение к тем или иным функциям ядра. Триггеры дополняют ранее присутствующую возможность установки контрольных проверок (probe) возможностью привязки условных команд, вызываемых при срабатывании контрольной проверки. Через данные команды можно выполнять такие действия, позволяющие получить дополнительные сведения, как включение или выключение других событий трассировки или активация трассировки стека. Каждая команда может задаваться с использованием фильтра событий, позволяющего триггеру срабатывать только при нужных условиях. Например, выполнение "echo 'stacktrace:5 if bytes_req >= 65536' > /sys/kernel/debug/tracing/events/kmem/kmalloc/trigger" приведёт к установке триггера выдающего трассировку стека для первых пяти запросов к kmalloc с размером больше 64 Кб.
- В системе контрольных проверок (userspace probes), используемой для анализа поведения выполняемых в пространстве пользователя приложений, добавлена поддержка извлечения данных из стека и памяти пользовательского процесса, а также обработка таких типов аргументов, как разыменования, битовые поля, возвращаемые функцией значения и смещения в файлах. Uprobes можно использовать для определения узких мест в производительности, накапливать отладочные данные и информацию о времени выполнения разных частей приложения в полностью прозрачном режиме, никаким образом не влияя на работу отслеживаемого процесса. Запустить и остановить сбор данных можно в любой момент, без перезапуска или модификации программы.
- В состав ядра принят набор патчей biovec, вносящий некоторые изменения в API блочного уровня ядра, в том числе добавляющий поддержку создания произвольных купных запросов ввода/вывода и увеличивающих эффективность работы.
- Обеспечена возможность использования реализованной на уровне ядра системы lockdep для отладки функционирования блокировок в пространстве пользователя (в частности для выявления взаимных блокировок в многопоточных программах).
- Добавлена возможность использования системного вызова kexec() на системах с EFI BIOS. Kexec предоставляет возможность загрузки нового экземпляра ядра из уже запущенного ядра Linux, обеспечивая вариант мягкой перезагрузки, без возвращения управления в BIOS;
- Значительно переработано внутреннее устройство виртуальной файловой системы sysfs. В итоге, представлена новая подсистема "kernfs", которая может выступать в качестве основы для других ФС, похожих на sysfs. Например, планируется создать виртуальную ФС для управления cgroup.
- Реализована инфраструктура компонентных подсистем ("componentized subsystems"), предназначенная для управления сложными устройствами, состоящих из нескольких взаимодействующих друг с другом более простых устройств.
- В подсистему perf events добавлена поддержка механизма учёта энергопотребления "RAPL", используемого в процессорах Intel; Добавлена серия новых опций в утилиту perf.
- В экспериментальную staging-ветку добавлен используемый в платформе Android механизм распределения памяти ION, нацеленный на эффективное решение проблем с фрагментацией памяти и поддерживающий предоставление совместного доступа к буферам при помощи DMABUF;
- Сетевая подсистема
- Добавлена новая возможность "TCP autocorking", позволяющая задержать передачу небольших порций данных для объединения их в более большие пакеты, что позволяет снизить нагрузку на CPU и обеспечить более эффективную пропускную способность. Для управления новой возможностью представлен sysctl tcp_autocorking. По умолчанию поддержка tcp_autocorking включена.
- Добавлен новый ioctl вызов SIOCGHWTSTAMP, позволяющий приложениям получить текущую конфигурацию меток времени (timestamping), без внесения в неё изменений.
- Дисковая подсистема, ввод/вывод и файловые системы
- Для файловой системы Btrfs расширен объём информации, предоставляемой через sysfs, в том числе теперь можно получить данные о доступных возможностях и использовании дискового пространства. Ранее указанные данные можно было получить через ioctl(), но sysfs гораздо удобнее для использования в скриптах или из командной строки.
- В распределённую файловую систему Ceph добавлена поддержка списков контроля доступа (ACL).
- Виртуализация и безопасность
- Интегрированы наработки проекта KASLR (аналог ASLR для ядра) с реализацией средств рандомизации раскладки адресного пространства ядра, которые позволили увеличить стойкость ядра к некоторым видам атак, эксплуатирующих уязвимости в ядре. KASLR уже успешно используется для повышения безопасности Chrome OS.
- Обеспечена возможность сборки ядра с включением улучшенного режима защиты от переполнения стека "-fstack-protector-strong", который появится в GCC 4.9. Сборка в режиме "-fstack-protector-strong" позволяет обеспечить защиту от переполнения стека в большем числе функций ядра, удержав при этом связанные с дополнительной проверкой накладные расходы на приемлемом уровне.
- В гипервизор Xen добавлена поддержка режима PVH для гостевых систем, который комбинирует элементы режимов паравиртуализации (PV) и полной виртуализации (HVM). В режиме PVH с одной стороны применяется полная виртуализация на уровне ограничения привилегированных инструкций, изоляции системных вызовов и виртуализации таблиц страниц памяти, но с другой стороны используются методы паравиртуализации для ввода/вывода, обработки прерываний, организации загрузки и взаимодействия с оборудованием. Таким образом, PVH, как и режим PV, обеспечивает высокую производительность, благодаря исключению накладных расходов на симуляцию аппаратных устройств, но использует вместо PV MMU свойственные HVM механизмы аппаратной виртуализации для обеспечения более строгой изоляции виртуальных окружений.
- При работе на системах с архитектурой ARM добавлена поддержка обеспечения защиты от модификации и выполнения блоков text и помеченных только на чтение данных в модулях ядра.
- Аппаратные архитектуры
- Добавлена поддержка семейства многопоточных многоядерных 32-разрядных процессоров interAptiv, построенных на базе архитектуры MIPS;
- Для архитектуры m68k обеспечена поддержка системного вызова kexec();
- В гипервизоре Xen прекращена поддержка архитектуры ia64;
- Для архитектуры AMD64 добавлена поддержка меток перехода (jump labels) и системы распределения памяти CMA (Contiguous Memory Allocator), которая оптимизирована на выделение больших непрерывных областей памяти с использованием техники перемещения страниц памяти.
- Поддержка платформ Intel Clovertrail (Atom Z2760), получившей распространение на планшетных ПК под управлением Windows, и Intel Merrifield MID (Atom Z3480), ориентированной на смартфоны.
- В коде поддержки архитектуры xtensa добавлена поддержка многопроцессорных систем.
- Оборудование
- Поддержка переключения видеорежимов в пространстве пользователя (UMS) для видедрайвера Intel i915 объявлена устаревшей и будет удаления из работающих на уровне ядра компонентов драйвере через год.
- Добавлена поддержка беспроводных адаптеров на базе чипа RealTek RTL8821AE;
- В Video4Linux добавлена поддержка контроллеров web-камер SoC TI OMAP4, FM-приёмников из Broadcom BCM2048, Silicon Labs Si4713 FM и Thanko Raremono, DVB-S/S2 демодуляторов Montage M88DS3103, тюнеров Montage M88TS2022 и сенсоров камеры Samsung S5K5BAF.