Открыть сервис

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) и включает следующие шаги:

  1. Из виртуального адреса извлекаются три поля индексов: VPN[2] (биты 38–30), VPN[1] (биты 29–21), VPN[0] (биты 20–12) и смещение внутри страницы (биты 11–0).
  2. По значению регистра satp определяется физический адрес корневой таблицы L0.
  3. Выполняется чтение записи PTE из таблицы L0 по индексу VPN[2]. Если PTE указывает на страницу (например, гигантскую 1 ГиБ), процесс завершается.
  4. Если PTE является указателем на таблицу следующего уровня, аналогично выполняется чтение из таблицы L1 по индексу VPN[1].
  5. На уровне L2 по индексу VPN[0] читается PTE, которая должна указывать на страницу 4 КиБ или 2 МиБ.
  6. К полученному физическому номеру страницы (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 часто используется в учебных целях для изучения принципов виртуальной памяти.

Сравнение с другими схемами

СхемаРазрядность виртуального адресаМаксимальный объём виртуальной памятиКоличество уровней таблицПоддержка гигантских страниц
Sv3232 бита4 ГиБ24 МиБ
Sv3939 бит512 ГиБ32 МиБ, 1 ГиБ
Sv4848 бит256 ТиБ42 МиБ, 1 ГиБ, 512 ГиБ
Sv5757 бит128 ПиБ52 МиБ, 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. Однако для встраиваемых и потребительских устройств эти ограничения не являются критическими.

Источники

  1. The RISC-V Instruction Set Manual, Volume II: Privileged Architecture, Document Version 20211203, RISC-V International.
  2. SiFive E76 Core Complex Manual, SiFive, Inc., 2020.
  3. Linux Kernel Documentation: RISC-V Virtual Memory, kernel.org.
  4. 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 →