- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 340
- Реакции
- 7
Опять пришлось лезть в дебри трансляции адресов, потому что стандартные методы начинают подтормаживать при активном чтении памяти. Наткнулся тут на интересную реализацию перевода виртуальных адресов в физические, решил поделиться с местными кодерами, пока сам допиливаю свой байпасс.
Суть в чем: большинство юзает стандартный обход пейдж-тейблов, который работает медленно из-за кучи чтений на каждый уровень иерархии. Если ты уже в кернеле, можно юзать self-reference entry при аттаче, но для внешнего софта это не всегда удобно.
Автор идеи предлагает прокидывать PML4E, который указывает прямо на таргетный DTB. По технической части:
В теории, можно провернуть тот же финт без инъекции PML4E, если найти виртуальный адрес, который мапит финальную PTE-страницу, но это пока не копал — слишком муторно с поиском маппинга в текущих реалиях обновлений ядер.
Собственно, почему никто раньше массово не юзал такой подход в паблик-сурсах? Скорее всего, из-за риска спалиться на модификации структур. Тем, кто пишет свой Kernel-драйвер или пилит приватный DMA-софт — информация к размышлению.
Кто-то уже пробовал реализовывать подобный маппинг в своих проектах или юзаете более консервативные методы трансляции? Отпишитесь, насколько сильно проседает производительность при "чистом" обходе против этого метода, если кто тестил под нагрузкой.
Суть в чем: большинство юзает стандартный обход пейдж-тейблов, который работает медленно из-за кучи чтений на каждый уровень иерархии. Если ты уже в кернеле, можно юзать self-reference entry при аттаче, но для внешнего софта это не всегда удобно.
Автор идеи предлагает прокидывать PML4E, который указывает прямо на таргетный DTB. По технической части:
- Метод: Создание кастомного PML4E, ссылающегося на целевой DTB. Это позволяет MMU самостоятельно разруливать пейдж-волк.
- Результат: Получаем PFN конечной страницы практически мгновенно, что дает колоссальный буст по скорости чтения по сравнению с классическим софтом.
- Скрытность: Тут кроется главный подвох. Инъекция PML4E — это жирный флаг для любого нормального античита, который умеет чекать целостность структур памяти. Нужно искать способы скрытия, иначе отлет по мануалбану будет вопросом пары минут.
В теории, можно провернуть тот же финт без инъекции PML4E, если найти виртуальный адрес, который мапит финальную PTE-страницу, но это пока не копал — слишком муторно с поиском маппинга в текущих реалиях обновлений ядер.
Собственно, почему никто раньше массово не юзал такой подход в паблик-сурсах? Скорее всего, из-за риска спалиться на модификации структур. Тем, кто пишет свой Kernel-драйвер или пилит приватный DMA-софт — информация к размышлению.
Кто-то уже пробовал реализовывать подобный маппинг в своих проектах или юзаете более консервативные методы трансляции? Отпишитесь, насколько сильно проседает производительность при "чистом" обходе против этого метода, если кто тестил под нагрузкой.