В середине марта после почти двух месяцев разработки и семи release candidate Линус Торвальдс представил новую версию ядра 4.5. Кроме исправлений, в релизе действительно много нового. Изменения затронули все подсистемы — дисковую, работу с памятью, системные и сетевые сервисы, безопасность, и, конечно же, добавлены драйверы для новых устройств. Попробуем разобраться с некоторыми наиболее интересными.

 

О релизе

Релиз ядра 4.4 вышел относительно недавно, в начале января 2016-го, но за это короткое время накопилось большое количество дополнений. И хотя Линус назвал новый релиз «нормальным», можно увидеть, что по сравнению с версией 4.4 размер патча вырос почти на треть — 70 Мбайт против 49 Мбайт. В разработке участвовало примерно 1528 человек, которые внесли около 13 тысяч исправлений. В более чем 11 тысяч файлов были добавлены 1 146 727, удалено 854 589 строк кода. В 4.4 было соответственно 714 106 и 471 010 строк. Почти половина (45%) всех изменений связана с драйверами устройств, 17% затрагивают код аппаратных архитектур, 14% касаются сетевого стека, 4% — файловых систем, и 3% затронули внутренние подсистемы ядра.

Наибольшее количество строк внесли Даг Ледфорд (Doug Ledford) из Red Hat, занимавшийся в основном чисткой кода (7,7%), Томи Валкейнен (Tomi Valkeinen) из Texas Instruments, работавший над поддержкой субархитектуры OMAP (5,3%), три разработчика сосредоточили внимание на драйверах графических карт AMD: Эрик Хуан (Eric Huang) — 3,3%, Алекс Дойхер (Alex Deucher) — 2,4% и yanyang1 — 1,6%. Лидеры по чейнджсетам — Линус Валлей (Linus Walleij) из Linaro, реализовавший множество низкоуровневых изменений, в том числе к поддерживаемому им GPIO (2,0%), Арнд Вергман (Arnd Bergmann), проделавший большую работу для поддержки ARM (1,9%), и Лео Ким (Leo Kim), занимавшийся драйвером wilc1000 (1,7%). Как и ранее, многие корпорации заинтересованы в развитии ядра. Работу над версией 4.5 поддержали более 200 компаний, среди которых Red Hat, Intel, AMD, Texas Instruments, Linaro, Linux Foundation, Samsung, IBM, Google. Большинство из них развивают поддержку своих устройств и связанных подсистем и инструментов, но, например, Google традиционно вносит очень много изменений в сетевую подсистему Linux.

Сообщение о выходе нового ядра
Сообщение о выходе нового ядра
 

Ядро и драйверы

Продолжился перенос сложного и плохо поддерживаемого кода, написанного на ассемблере (x86/asm) на С, начатый еще в 4.0. Ядро теперь можно собирать с параметром -fsanitize=undefined. Сам параметр появился два года назад в GCC 4.9+ и активирует отладочный режим UBSan (Undefined Behavior Sanitizer), который детектирует неопределенное поведение, присущее языкам C и C++: использование нестатических переменных до инициализации, деление на ноль, целочисленное переполнение и так далее. Компилятор обычно предполагает, что такие операции никогда не произойдут, а в случае наступления результат может быть любой и зависит от самого компилятора. Теперь компилятор обнаруживает такие ситуации, выдает «runtime error:» (можно отключить -fno-sanitize-recover) и продолжает выполнение.

По умолчанию в каждой сборке ОС все библиотеки загружаются в определенные адреса, что позволяет легко реализовать атаку. Для увеличения безопасности используется ряд технологий, одна из них — случайное смещение при вызове mmap(), реализованное в виде ASLR (Address Space Layout Randomization). Впервые технология ASLR появилась в Linux в 2005 году в ядре 2.6 и выдавала для 32-битных систем 8-битное смещение (то есть 256 вариантов адресов, хотя на самом деле меньше), а для x64 — смещение уже 28-битное. Для x64 вариантов вполне достаточно, а вот для 32-битных систем, среди которых Android, этого на сегодня явно мало. Уже известны эксплоиты, умеющие подбирать адрес. В результате поиска решения проблемы написан патч, позволяющий устанавливать большую хаотичность для ASLR, через /proc/sys/vm/mmap_rnd_bits и /proc/sys/vm/mmap_rnd_compat_bits (в системах x64 для x86-процессов). Для каждой архитектуры указываются минимальные и максимальные значения с учетом доступного адресного пространства. Для x86 значение может находиться в диапазоне от 8 до 16 бит или 28–32 (для x64-версии). Параметры по умолчанию можно задавать при сборке ядра.

Настройка ASLR в новом ядре
Настройка ASLR в новом ядре

Расширены возможности DRM-драйвера для видеокарт NVIDIA (Nouveau) и Intel (поддержка будущего поколения чипов Kaby Lake), добавлена поддержка новых звуковых карт, USB-контроллеров, криптоускорителей. Производители графических карт Intel и NVIDIA уже давно отказались от использования режима UMS (Userspace Mode Setting) в своих open source драйверах в пользу KMS (Kernel Mode Setting), теперь пришла очередь драйвера ATI Radeon, в котором убран код режима UMS. С 3.9 было возможно его включать параметром DRM_RADEON_UMS или установкой radeon.modeset=0 в GRUB. Теперь остался только KMS (Kernel Mode Setting). Это нужно учитывать, если необходимо использовать старые драйверы или режим UMS (UMS иногда показывает большую производительность).

В драйвер AMDGPU добавлена экспериментальная поддержка технологии динамического управления питанием PowerPlay, позволяющая повысить производительность GPU для GPU Tonga и Fiji и интегрированных Carrizo и Stoney. В режиме PowerPlay GPU запускается в режиме низкого энергопотребления, но в случае возрастания нагрузки на графическую подсистему автоматически увеличивает частоту. По умолчанию PowerPlay отключен, для включения следует передать ядру параметр amdgpu.powerplay=1.

Новая версия Media controller API расширяет поддержку устройств Video4Linux и позволяет использовать функциональность мультимедиаконтроллера в других подсистемах, таких как DVB, ALSA и IIO.

В KVM (Kernel-Based Virtual Machine) много сделано для поддержки архитектуры s390 (теперь она может использовать до 248 vCPU), ARM/ARM64 и улучшения работы x86 в Hyper-V.

Установка ядра 4.5 в Ubuntu

Самый простой способ познакомиться с новым ядром — использовать сборку от Ubuntu Kernel Team. После всестороннего тестирования новое ядро попадает в ppa:canonical-kernel-team/ppa, но обычно на это уходит время.

$ wget -с http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.5-wily/linux-headers-4.5.0-040500-generic_4.5.0-040500.201603140130_amd64.deb http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.5-wily/linux-headers-4.5.0-040500_4.5.0-040500.201603140130_all.deb http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.5-wily/linux-image-4.5.0-040500-generic_4.5.0-040500.201603140130_amd64.deb
$ sudo dpkg -i linux*.deb

После перезагрузки можем работать.

 

Поддержка ARM

ARM-компьютеры используются как мини-серверы под определенные задачи или в качестве контроллеров автоматизации, что делает их очень популярными и востребованными. ARM-сообщество Linux за последние пять лет превратилось в одно из наиболее активных, проведя колоссальную работу по поддержке 32-разрядных ARM-платформ, занимающих серьезную долю рынка, и эта работа в общем завершилась к выходу ветки 4.5. Ранее для каждого ARM-устройства необходимо было собрать собственное ядро, обеспечивающее поддержку только определенных устройств. Но проблема в том, что устройства становились сложнее, появилась возможность изменения конфигурации, да и сами пользователи на ARM-устройствах хотели использовать без лишних телодвижений обычные дистрибутивы. Но в итоге мы имели несколько сотен вариантов сборки ядра, что очень затрудняет использование Linux.

Результатом очистки и рефакторинга большого количества кода стало возможным включение в ядро кода поддержки ARMv6 и ARMv7, то есть теперь можем собрать универсальное ядро, способное загружаться на обеих системах. Здесь, наверное, нужно вспомнить и о продвигаемой в последнее время спецификации Device Tree, возникшей как часть разработок Open Firmware. Device Tree позволяет конфигурировать оборудование во время загрузки при помощи специальных dts-файлов, хранящихся в /boot/dtbs, и менять установки без пересборки ядра. Использование Device Tree становится обязательным для всех новых разработок ARM и не только устройств. Все это вместе дает уверенность, что дистрибутивы Linux в будущем можно будет спокойно запускать на любом ARM-устройстве. Параллельно Грег Кроу-Хартман (Greg Kroah-Hartman) из Linux Foundation выпустил патч, реализующий подобную возможность для ранних версий ядра. В arch/arm64 найдем код, обеспечивающий поддержку новой 64-битной архитектуры ARM (ARMv8). Добавлены новые функции для всех популярных архитектур ARM — Allwinner, Amlogic, Samsung, Qualcomm и поддержка новых ARM-плат различных разработчиков.

 

Системные сервисы

Для доступа к данным прошивок UEFI (Unified Extensible Firmware Interface) в Linux используется специальная псевдофайловая система efivars (настраивается EFIVAR_FS), которая монтируется в /sys/firmware/efi/efivars. В некоторых реализациях при выполнении команды rm -rf /* удалялось содержимое и этого каталога, что приводило к разрушению прошивки. Компании — разработчики устройств не считают это серьезным недостатком, ведь ситуация, конечно, не самая распространенная, да и вряд ли какому-то пользователю придет в голову это проверить. Тем не менее проблема есть, и писатели вирусов вполне реально могут воспользоваться такой возможностью. Теперь в ядре 4.5 добавлена специальная защита каталога /sys/firmware/efi/efivars, не позволяющая удалять файлы внутри.

Продолжение статьи доступно только подписчикам

Вариант 1. Оформи подписку на «Хакер», чтобы читать все статьи на сайте

Подписка позволит тебе в течение указанного срока читать ВСЕ платные материалы сайта, включая эту статью. Мы принимаем оплату банковскими картами, электронными деньгами и переводами со счетов мобильных операторов. Подробнее о подписке

Вариант 2. Купи одну статью

Заинтересовала статья, но нет возможности оплатить подписку? Тогда этот вариант для тебя! Обрати внимание: этот способ покупки доступен только для статей, опубликованных более двух месяцев назад.


Комментарии

Подпишитесь на ][, чтобы участвовать в обсуждении

Обсуждение этой статьи доступно только нашим подписчикам. Вы можете войти в свой аккаунт или зарегистрироваться и оплатить подписку, чтобы свободно участвовать в обсуждении.

Check Also

Как работает Linux: от нажатия кнопки включения до рабочего стола

Лучший способ понять, как работает операционная система, — это проследить поэтапно ее загр…