Sv39
Sv39 — это схема виртуальной памяти, используемая в архитектуре набора команд RISC-V для организации трансляции виртуальных адресов в физические. Она поддерживает 39-битное виртуальное адресное пространство, что позволяет адресовать до 512 ГиБ (гибибайт) памяти на процесс. Sv39 является одной из нескольких страничных схем, определённых в спецификации RISC-V, и наряду с Sv32, Sv48 и Sv57 обеспечивает гибкость при проектировании систем с различными требованиями к объёму памяти.
История и контекст появления
Спецификация RISC-V, разработанная в Калифорнийском университете в Беркли, изначально предусматривала поддержку виртуальной памяти для обеспечения многозадачности и защиты процессов. Архитектура RISC-V является модульной, и страничные схемы (Page-Based Virtual Memory) реализуются как расширения базового набора инструкций. Sv39 была введена как компромиссный вариант между 32-битной схемой Sv32 (для 32-битных систем) и 48-битной Sv48 (для 64-битных систем с большим адресным пространством). Она ориентирована на 64-битные процессоры, где полное 64-битное виртуальное пространство (16 ЭиБ) избыточно для большинства встраиваемых и потребительских приложений.
Технические характеристики
Виртуальное адресное пространство
Sv39 использует 39-битные виртуальные адреса. В 64-битном процессоре, работающем в режиме Sv39, старшие 25 бит (биты 63–39) виртуального адреса должны быть равны биту 38 (знаковое расширение). Это означает, что виртуальное адресное пространство делится на две половины: нижнюю (от 0x0000000000000000 до 0x0000007FFFFFFFFF) и верхнюю (от 0xFFFFFFFF80000000 до 0xFFFFFFFFFFFFFFFF). Такое разделение упрощает реализацию ядра операционной системы, которое обычно размещается в верхней половине адресов.
Страницы и уровни таблиц
Страничная организация в Sv39 основана на трёхуровневой иерархии таблиц страниц. Каждый уровень таблицы содержит 512 записей (Page Table Entry, PTE), размером 8 байт. Таким образом, общий размер одной таблицы — 4 КиБ (4096 байт), что совпадает с размером стандартной страницы.
- Уровень 0 (L0): корневая таблица страниц, адрес которой хранится в регистре
satp(Supervisor Address Translation and Protection). - Уровень 1 (L1): промежуточная таблица.
- Уровень 2 (L2): листовая таблица, содержащая записи, указывающие на физические страницы.
Размер страницы по умолчанию — 4 КиБ. Sv39 также поддерживает гигантские страницы (superpages) размером 2 МиБ (при использовании записи L2, указывающей на блок) и 1 ГиБ (при использовании записи L1, указывающей на блок). Это позволяет уменьшить количество уровней обхода таблиц для больших непрерывных областей памяти.
Формат записи таблицы страниц (PTE)
Каждая PTE в Sv39 имеет 64-битную структуру, где младшие 10 бит определяют флаги доступа и защиты, а старшие биты (при условии, что PTE действительна) содержат физический номер страницы (PPN). Основные флаги:
V(Valid) — запись действительна.R(Read) — разрешено чтение.W(Write) — разрешена запись.X(Execute) — разрешено исполнение.U(User) — доступ разрешён из пользовательского режима.G(Global) — страница глобальна (не сбрасывается при переключении контекста).A(Accessed) — бит, устанавливаемый аппаратурой при доступе к странице.D(Dirty) — бит, устанавливаемый при записи на страницу.
Комбинация флагов R, W, X позволяет реализовать различные режимы защиты: например, страница только для чтения (R=1, W=0, X=0), только для исполнения (R=0, W=0, X=1) или страница с полным доступом (R=1, W=1, X=1). Запись с R=0, W=0, X=0 считается указателем на следующий уровень таблицы.
Процесс трансляции адреса
Трансляция виртуального адреса в физический в Sv39 выполняется аппаратно (MMU — Memory Management Unit) и включает следующие шаги:
- Из виртуального адреса извлекаются три поля индексов: VPN[2] (биты 38–30), VPN[1] (биты 29–21), VPN[0] (биты 20–12) и смещение внутри страницы (биты 11–0).
- По значению регистра
satpопределяется физический адрес корневой таблицы L0. - Выполняется чтение записи PTE из таблицы L0 по индексу VPN[2]. Если PTE указывает на страницу (например, гигантскую 1 ГиБ), процесс завершается.
- Если PTE является указателем на таблицу следующего уровня, аналогично выполняется чтение из таблицы L1 по индексу VPN[1].
- На уровне L2 по индексу VPN[0] читается PTE, которая должна указывать на страницу 4 КиБ или 2 МиБ.
- К полученному физическому номеру страницы (PPN) добавляется смещение, формируя итоговый физический адрес.
Если на любом этапе PTE недействительна (V=0) или нарушены права доступа, возникает исключение (page fault), которое обрабатывается операционной системой.
Применение
Sv39 широко используется в операционных системах, работающих на 64-битных процессорах RISC-V, таких как Linux, FreeBSD и специализированные RTOS (Real-Time Operating Systems). Она является стандартной схемой для многих встраиваемых и одноплатных компьютеров на базе RISC-V, например, для платформы SiFive HiFive Unleashed и ряда микроконтроллеров с поддержкой MMU.
Основные области применения:
- Многозадачные ОС: Sv39 обеспечивает изоляцию процессов, позволяя каждому процессу иметь собственное виртуальное адресное пространство.
- Встраиваемые системы: где объём физической памяти обычно не превышает нескольких гигабайт, 39-битное пространство является достаточным и экономит аппаратные ресурсы (меньший размер TLB, меньше уровней таблиц).
- Образовательные проекты: благодаря простоте и документированности, Sv39 часто используется в учебных целях для изучения принципов виртуальной памяти.
Сравнение с другими схемами
| Схема | Разрядность виртуального адреса | Максимальный объём виртуальной памяти | Количество уровней таблиц | Поддержка гигантских страниц |
|---|---|---|---|---|
| Sv32 | 32 бита | 4 ГиБ | 2 | 4 МиБ |
| Sv39 | 39 бит | 512 ГиБ | 3 | 2 МиБ, 1 ГиБ |
| Sv48 | 48 бит | 256 ТиБ | 4 | 2 МиБ, 1 ГиБ, 512 ГиБ |
| Sv57 | 57 бит | 128 ПиБ | 5 | 2 МиБ, 1 ГиБ, 512 ГиБ, 256 ТиБ |
Sv39 занимает промежуточное положение, обеспечивая достаточный объём адресации для большинства современных приложений при меньшей сложности аппаратной реализации по сравнению со старшими схемами.
Особенности реализации
- Регистр satp: содержит поле MODE, которое включает режим Sv39 (значение 8 для 64-битных систем). Также в нём хранится ASID (Address Space Identifier) — идентификатор адресного пространства, позволяющий избежать полного сброса TLB при переключении контекста.
- TLB (Translation Lookaside Buffer): для ускорения трансляции используется кэш недавно использованных трансляций. Sv39, как и другие схемы, поддерживает инструкцию
SFENCE.VMAдля принудительной инвалидации TLB. - Физическая память: физические адреса в Sv39 могут быть до 56 бит (в зависимости от реализации), что позволяет адресовать до 64 ПиБ физической памяти, хотя виртуальное пространство ограничено 512 ГиБ.
Критика и ограничения
Основное ограничение Sv39 — относительно небольшое виртуальное адресное пространство (512 ГиБ). Для серверных приложений или систем с большими объёмами оперативной памяти (более 256 ГиБ) этого может быть недостаточно, и разработчики вынуждены переходить на Sv48 или Sv57. Кроме того, трёхуровневая иерархия таблиц приводит к дополнительным накладным расходам при обходе, особенно при частых page fault. Однако для встраиваемых и потребительских устройств эти ограничения не являются критическими.
Источники
- The RISC-V Instruction Set Manual, Volume II: Privileged Architecture, Document Version 20211203, RISC-V International.
- SiFive E76 Core Complex Manual, SiFive, Inc., 2020.
- Linux Kernel Documentation: RISC-V Virtual Memory, kernel.org.
- Waterman, A., Lee, Y., Patterson, D., Asanović, K. "The RISC-V Instruction Set Manual, Volume I: User-Level ISA", EECS Department, University of California, Berkeley, 2011.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →