Создание приложений RISC-V
В этой лекции мы узнаем, как использовать популярные системы компиляции (как LLVM, так и GCC) для создания приложений RISC-V, а также как запускать приложения на симуляторах и эмуляторах. В этой лекции представлены вводные материалы, которые помогут вам получить практический опыт создания и запуска приложений RISC-V. Поскольку инструменты и их зависимости часто меняются, некоторые аспекты этого курса могут работать некорректно до тех пор, пока не будет произведено обновление курса. Помня об этом, мы приводим ссылки на официальные списки рассылки, репозитории GitHub и веб-сайты. Они могут оказаться весьма полезными, если вы захотите углубиться в какие-либо области разработки RISC-V.
В этой лекции мы обсудим:
- введение в тулчейн RISC-V;
- где скачать тулчейны и симулятор;
- создание приложений с помощью этих тулчейнов;
- запуск приложений на симуляторе;
- запуск приложений на эмуляторе;
- полезные справочные материалы.
Введение в системы компиляции RISC-V
Есть две наиболее популярных системы компиляции RISC-V.
- GNU RISC-V
- LLVM RISC-V
Обе системы предоставляют оптимизирующий компилятор, ассемблер, компоновщик и другие различные инструменты для создания приложений, работающих на машинах RISC-V. Официальный репозиторий RISC-V на GitHub предоставляет исходный код для тулчейна riscv-gnu, тулчейн в собранном виде можно скачать по ссылке Компилятор RISC-V обычно используется в качестве кросс-компилятора, поскольку многие процессоры RISC-V используются для встраиваемых приложений с низким энергопотреблением. В настоящее время кросс-компиляторы RISC-V можно запускать только на целевых платформах ELF таких, как Linux-машины.
Тулчейн RISC-V LLVM недоступен у сторонних поставщиков, но его можно собрать из исходников, загрузив проект llvm-project с открытым кодом. Позже будет описан простой способ использования тулчейна llvm с gnu sysroot.
Симулятор RISC-V можно загрузить из официального репозитория RISC-V на GitHub: riscv/riscv-isa-sim:Spike, симулятор RISC-V ISA. Хотя платы RISC-V легко доступны у нескольких производителей, разработку RISC-V проще начать, используя симуляторы.
Создание приложений с помощью тулчейна
Для создания приложения для RISC-V использование инструментальной цепочки кросс-компилятора не отличается от любой другой системы разработки на основе кросс-компилятора. Требуется две вещи:
- система компиляции
- sysroot
В "Описание курса" мы описали систему компиляции и sysroot. Прежде чем научиться создавать приложения с помощью тулчейна RISC-V, мы хотели бы представить интересное соглашение об именовании, которое используется для кросс-компиляторов.
Соглашение об именовании компиляторов
Загрузив тулчейн GCC, в каталоге bin вы найдете двоичный файл riscv64-unknown-elf-gcc. Это тот же самый компилятор GCC со встроенной информацией о sysroot и платформе. Это соглашение - называть кросс-компиляторы таким образом. Обычно для именования используется формат arch-vendor-os-abi. Так, riscv64-unknown-elf-gcc означает, что это кросс-компилятор для RISC-V 64 bit, и он будет генерировать двоичный файл elf, который может работать, например, на машинах Linux. Отличный справочник по соглашениям об именовании можно найти здесь. В случаях, когда имя компилятора не содержит целевого триплета, для его получения можно использовать флаг -dumpmachine:
gcc -dumpmachine # x86_64-linux-gnu
Имея под рукой компилятор riscv64-unknown-elf-gcc, файл можно скомпилировать следующими способами:
riscv64-unknown-elf-gcc -O2 -o a.out hello.c riscv64-unknown-elf-gcc -O2 hello.c -mabi=lp64d -march=rv64ifd
Флаг -march используется для указания целевой субархитектуры, для которой будет сгенерирована сборка. Флаг -mabi используется для указания моделей данных1Примечание переводчика: не просто модель данных, а двоичный интерфейс приложения (ABI). Более подробную информацию о моделях данных можно найти в этом разделе Википедии о 64-битовых вычислениях.
С помощью тулчейна llvm двоичный файл может быть собран аналогичным образом. Предполагается, что sysroot находится в каталоге riscv64-unknown-elf:
clang test.c -c --sysroot riscv64-unknown-elf -target # riscv64-unknown-elf -march=rv64ifd
Приложения RISC-V можно запускать как на устройствах, так и на симуляторах или эмуляторах. Мы кратко обсудим, как запустить приложение на симуляторе, а также на эмуляторе.
Запуск приложений на симуляторе Spike
Одним из самых удобных способов запуска небольших приложений является использование симулятора RISC-V. Шаги по сборке и установке достаточно просты. Для этого вам понадобятся следующие зависимости:
- Linux-машина - создание образа Linux на других машинах нетривиально, поэтому для начала рекомендуется использовать Linux-машину.
- Тулчейн RISC-V: https://github.com/riscv-software-src
- Spike, симулятор RISC-V: https://github.com/riscv-software-src/riscv-isa-sim
- pk, прокси-ядро RISC-V: https://github.com/riscv-software-src/riscv-pk
Инструкции по запуску простого приложения hello-world на симуляторе Spike приведены в README репозитория симулятора. Чтобы установить прокси-ядро, следуйте инструкциям в README репозитория pk. Для удобства вы можете установить и spike, и pk в тот же каталог, что и каталог тулчейна riscv64, указав путь к нему в качестве префикса установки для обоих.