futex в общей памяти на Redox: исправлены страницы copy-on-write

19.07.2026

В ядре Redox исправлено использование futex в разделяемой памяти: страницы copy-on-write теперь корректируются до трансляции адресов. Из-за прежнего порядка синхронизация в процессах, разделяющих память, работала неверно.

Зачем нужен futex

futex — это системный вызов «уснул, пока не выполнится условие». На его базе построены почти все блокировки в современном коде: мьютексы, условия, семафоры. Ожидание происходит в пользовательском пространстве, в ядро программа заходит только чтобы уснуть или разбудить кого-то.

Ключевая оптимизация — в разделяемой памяти futex обходится без системного вызова: достаточно обычной атомарной операции, если ожидающих нет.

Что такое copy-on-write и почему важен порядок

Когда процесс создаётся через fork или клонируется поток, физические страницы памяти не копируются. Обе копии получают одни и те же страницы с пометкой «только чтение», а при первой попытке записи ядро создаёт отдельную копию для того, кто пишет. Это и есть copy-on-write.

В разделяемой памяти ситуация обратная: страница должна остаться общей и быть доступной на запись с обеих сторон. Значит, при обращении к futex в такой странице ядро обязано снять пометку «только чтение» и получить настоящую разделяемую копию — до того, как идти дальше. Прежний порядок приводил к тому, что ядро работало с неверным состоянием страницы.

Практическое следствие

Разделяемая память с futex — это не экзотика, а основа многопроцессной работы на Rust: std::sync поверх fork, пулы процессов, IPC-библиотеки, заполнители задач, разделяющие счётчики между процессами. Ошибка проявлялась как зависание или испорченные данные при синхронизации, а не как явный отказ.

Оригинал

Коммит Fix futex on shared memory by correcting CoW pages before translation от 19 июля 2026 года в репозитории redox-os/kernel

Упоминаний: 1 · Просмотров: 3