Какой минимальный набор инструкций RISC-V для GNU/Linux?

Я хочу создать свой собственный минимальный процессор RISC-V для FPGA. Процессор будет максимально простым с одним конвейером.

Я прочитал весь RISC-V ISA и есть много стандартных расширений. Так каков минимальный RISC-V ISA, который может работать под Linux?

4 ответа

С 2020 года разумным минимумом является RV64GC, пользовательский / системный режим (расширения "U"/"S") и система виртуальной памяти на основе страниц (Sv32, Sv39 или Sv48).

Обратите внимание, что базовая спецификация RISC-V (ратифицирована 08.06.2019) расширяетG(универсальный) символ для: IMAFD+Zicsr+Zifencei

Расширение сжатых инструкций ("C") также является частью базовой спецификации. Расширения "U"/"S" и системы виртуальной памяти являются частью спецификации привилегированной архитектуры RISC-V.

Технически RV64GC - это минимум для запуска дистрибутивов общего назначения, таких как Debian и Fedora, однако с пользовательским Linux вы можете перейти к RV64IMA+Zi* или даже RV32IMA+Zi* (с некоторыми исправлениями).

IMA RISC-V - это минимальный набор расширений на уровне пользователя для Linux плюс основанная на страницах привилегированная архитектура.

Для ванильного ядра Linux — rv32imasu + Zicsr + Zifencei, плюс виртуальная память и контроллер прерываний. Используя ядро ​​по назначению в режиме супервизора, вы можете написать свою собственную прошивку для работы в машинном режиме и реализовать двоичный интерфейс супервизора (SBI) для обработки трансляции на ваше оборудование для большинства других задач.

Я думаю, что в ядре может быть некоторая ограниченная поддержка отсутствия MMU, предназначенная для работы в машинном режиме, но я этого не пробовал. У меня нет реального оборудования без MMU и достаточной памяти для запуска ядра Linux, и я не пробовал его в эмуляторе.

Также несложно исправить ядро ​​Linux, чтобы оно работало без расширения M. Ни одна из ручных сборок ядра не использует эти инструкции. Я поддерживаю раздвоенную версию ядра с добавленной этой функцией: https://github.com/echelonxray/linux . Просто отмените выбор символа конфигурации «RISCV_ISA_M» в Kconfig при сборке ядра. Я пытался распространить этот патч, но сопровождающие ядра не сочли его достаточно полезным, чтобы поддерживать его. Вы можете сравнить основную и ванильную ветки, если хотите проверить внесенные мной изменения.

Если вы не хотите использовать исправленное ядро, вы можете перехватить и эмулировать инструкции расширения умножения в вашей прошивке SBI. Просто это будет медленнее.

Имейте в виду, что вам нужно будет собрать кросс-компилятор и libc для работы с rv32ia и создать программное обеспечение для работы без M. Опять же, вы можете перехватить инструкции, но это будет медленнее. Я создал эмулятор no-M в качестве доказательства концепции здесь: https://www.michaelkloos.com/my_projects_blog/?p=182 .

Итак, после небольшой настройки он будет работать на rv32iasu, как доказывает мой эмулятор.

По состоянию на 2023 год существует проект, который реализует минимальный 32-битный процессор RISC-V в заголовочном файле проекта C. Вы можете обойтись без реализации большого количества опкодов и функций.

В проекте использовалась версия Linux NO-MMU, которая в последнее время стала популярной для микроконтроллеров.

Проверьте это:https://github.com/cnlohr/mini-rv32ima .

Вы можете запустить образ ядра Linux за 2 секунды или собрать всю цепочку инструментов за 20–30 минут, что, вероятно, рекомендуется.

Одним из ключевых моментов здесь является то, что система no-mmu не может выполнять два процесса параллельно (они будут выполняться в одном и том же пространстве памяти), поэтому даже простое создание дочернего процесса в bash с помощью «&» приведет к ошибкам.

Однако вы МОЖЕТЕ использовать многопоточность, поскольку потоки в любом случае предназначены для совместного использования адресного пространства.

Ключом к тому, чтобы эти системы работали, являются настраиваемые ячейки памяти и настраиваемые CSR. Система Linux исправлена ​​таким образом, что специальные инструкции CSR и запись по адресу 0x10000000 взаимодействуют с терминалом и клавиатурой. В этом он похож на мм/о на базе 6502.

Этот проект служит хорошим намеком на то, что вам может сойти с рук и насколько легко реализовать собственные интерфейсы ввода-вывода в чистом Linux.

Другие вопросы по тегам