Ядро Redox больше не портит анонимную память при перемаппинге с PROT_WRITE

21.02.2026

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

Что такое приватная анонимная память

Память процесса делится на два вида по смыслу разделяемости. Общая память — это одни и те же физические страницы у всех, кто к ней обращается. Приватная — у каждого своя копия.

Анонимная память — та, что не отображена в файл. Программа её выделяет сама: стек, куча, буферы.

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

Что было сломано

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

Потерянное значение авторы называют «обнулённым кадром»: при перемаппинге терялось содержимое, которое должно было сохраниться.

Сопутствующая правка — про слияние областей памяти. Когда соседние области объединяются, меняется базовый адрес структуры, отслеживающей страницы, из-за чего удаление страницы могло не сработать и убрать не то. Исправлено в тот же день.

Почему это не стилистика

Порча памяти — худший вид дефекта. Программа не падает: она работает и выдаёт неверный результат. Причём неверный результат зависит от того, что ещё держит этот адрес, то есть воспроизвести и расследовать почти невозможно.

Случай показателен именно потому, что код написан на Rust. Проверки типов не помогают на границе «ядро — userspace»: с одной стороны unsafe-указатели на страницы, с другой — процессы, которые доверяют своему адресному пространству. Copy-on-write в такой системе держится на соглашении, которое компилятор проверить не может, — и одна ошибка в нём стоит данных.

Оригинал

Коммит feat(memory): handle grant merges when mutating от 21 февраля 2026 года в репозитории redox-os/kernel; правки перемаппинга — fix(context/memory): Grant::remap delegate write и feat(mapper/remap_with_full): conditional remap от 19 февраля. Сводка «This Month in Redox — February 2026», раздел «Kernel Improvements»

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