Какой минимальный набор инструкций 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.