Обзор новой функции быстрой проверки доступа пользователя в Linux 6.12

В версии ядра Linux 6.12 Линус Торвальдс представил важное улучшение, направленное на ускорение работы с пользовательскими данными. Это нововведение использует технику маскирования адресов, чтобы обойти некоторые проверки безопасности, связанные с уязвимостью Spectre V1, и заменить дорогостоящие вызовы функции access_ok(). В первую очередь это улучшение касается процессоров x86_64, но в будущем может быть адаптировано для других архитектур.


Что такое маскирование адресов?

Маскирование адресов — это метод, который позволяет архитектуре автоматически обрабатывать некорректные пользовательские адреса. Когда используется недопустимый адрес, система генерирует специальный "ошибочный" адрес. Этот подход гарантирует сбой при попытке работы с таким адресом, что устраняет необходимость вручную проверять его корректность. Этот механизм особенно полезен для предотвращения переполнений между пользовательским и системным адресным пространством.

В Linux 6.12 маскирование адресов помогает избежать спекулятивных атак Spectre V1 и ускоряет операции с пользовательскими данными, особенно чтение и запись. Теперь, вместо условной проверки правильности адреса, система автоматически преобразует некорректный адрес в гарантированно ошибочный. Это предотвращает ошибки доступа на аппаратном уровне, что не только ускоряет процесс выполнения, но и улучшает общую безопасность системы.

Почему это важно?

Ранее для проверки корректности пользовательских адресов использовалась функция access_ok(), которая стала довольно дорогостоящей после внедрения защиты от атак Spectre V1. Каждая проверка этого типа требовала дополнительных вычислительных ресурсов, что снижало общую производительность системы. Новая техника маскирования адресов позволяет избавиться от этих лишних проверок и ускорить обработку данных.

Как это работает?

Ранее разработчики использовали условные операторы для проверки правильности пользовательских данных, например:


if (user_read_access_begin(src, len)) {

Теперь эта модель заменяется вызовом:


src = masked_user_access_begin(src);

Эта модель маскирования адресов работает только на архитектурах, которые имеют защитную область между адресными пространствами ядра и пользователя, такой как x86_64. На этой архитектуре некорректный пользовательский адрес преобразуется в адрес с "единичными битами", что гарантирует сбой при доступе. Это позволяет системе не выполнять явную проверку, так как ошибка вызовется автоматически на уровне архитектуры.

Пример работы на x86_64

Ниже приведен пример кода, который демонстрирует, как работает новое маскирование адресов на архитектуре x86_64. В этом примере загружаются два слова из пользовательского пространства:


stac
mov %rax,%rcx
sar $0x3f,%rcx
or %rax,%rcx
mov (%rcx),%r13
mov 0x8(%rcx),%r14
clac

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

Важно отметить, что если микроархитектура процессора не справляется с командами clac и stac, производительность может оказаться не такой высокой, как ожидается. Однако сам код оптимизирован настолько, насколько это возможно на текущем уровне архитектуры.

Преимущества нового подхода

  • Увеличение производительности: Устранение явных проверок безопасности ускоряет выполнение операций с пользовательскими данными.
  • Безопасность: Маскирование адресов предотвращает возможные переполнения адресного пространства между ядром и пользователем.
  • Поддержка x86_64: Хотя это нововведение пока что работает только на x86_64, в будущем его можно адаптировать для других архитектур.

Ограничения

Хотя новое улучшение ускоряет работу с пользовательскими данными, оно пока что применимо только к архитектуре x86_64. Для других архитектур, таких как PowerPC, потребуется разработка дополнительных решений, так как для них необходимо разделение на чтение и запись пользовательских данных.

Заключение

Нововведение в Linux 6.12 с использованием маскирования адресов для проверки пользовательского доступа является важным шагом вперед в оптимизации производительности ядра. Это не только ускоряет выполнение операций, связанных с пользовательскими данными, но и улучшает безопасность системы, предотвращая возможные ошибки доступа. Хотя сейчас это работает только на x86_64, дальнейшее развитие может включать адаптацию для других архитектур.

Linux 6.12 продолжает традицию улучшений производительности и безопасности, предоставляя новые возможности разработчикам и пользователям.

Блог НАЙС ОС

Блог НАЙС ОС — это платформа для пользователей и разработчиков, где публикуются статьи, руководства и новости о мире Linux. Основное внимание уделено использованию, настройке и оптимизации ОС, а также обзору новых функций и технологий, доступных в дистрибутиве НАЙС ОС.