Инструменты разработчика
Эта Лекция посвящена настройке окружения и инструментов разработчика для написания программного кода на языке Assembler для процессора RISC-V и его запуска на компьютере. Существует достаточно большое количество различных программ и утилит, позволяющих писать и тестировать небольшие программы, которые достаточно сильно отличаются своей функциональностью. В этой Лекции мы рассмотрим небольшую часть таких инструментов, позволяющих писать код для микропроцессоров RISC-V, транслировать его в исполняемые модули, а также запускать и отлаживать его, работая при этом на обычных ПК с ОС Linux. В частности, будут рассмотрены: симулятор Ripes, эмулятор аппаратного обеспечения Qemu с набором инструментов GNU toolchain, одноплатный компьютер StarVision VisionFive.
Вам потребуется ОС Linux (предпочтительно - Debian) в качестве хоста для запуска симуляторов. Вы также можете использовать WSL1WSL (Windows Subsystem for Linux) - подсистема ОС Windows, которая позволяет разработчикам запускать среду GNU/Linux с большинством программ командной строки, служебных программ и приложений непосредственно в Windows без каких-либо изменений и необходимости использовать традиционную виртуальную машину или двойную загрузку. (Windows Subsystem for Linux) или macOS, однако использование этих средств здесь рассматриваться не будет.
После прохождения этого раздела вы будете знать, как:
- устанавливать и использовать любое рассмотренное в разделе ПО;
- знать и уметь применять наборы инструментов GNU (GNU toolchain) для сборки приложений.
Набор инструментов разработчика
Обзор наборов инструментов
На рис.2.1. показан процесс того, как происходит преобразование исходного кода программы в исполняемый бинарный файл. Шаги этого процесса обычно скрыты внутри специального ПО, которое называется интегрированная среда разработки (integrated development environment, IDE). Работая в таких средах, вы просто печатаете кода в редакторе и сохраняете его в текстовом виде в файле исходного кода. Этот файл передаётся ассемблеру (или кросс-ассемблеру, специальной программе, позволяющей, находясь на компьютере одной архитектуры, компилировать бинарный код для совершенно другой архитектуры), который переводит его содержимое в так называемый объектный файл - бинарный код, в точности соответствующий машинному представлению инструкций из транслируемого файла, но при этом не содержащий дополнительную информацию, необходимую для запуска и исполнения программы операционной системой. Для преобразования объектного файла в исполняемый используется программа, которая называется компоновщик (или линкер, от англ. linker). Компоновщик принимает на вход объектный файл (или группу объектных файлов, если исходных файлов в проекте компилировалось несколько) и скрипт линковки - специальный набор указаний о том, как сегменты, описанные в исходном коде, должны размещаться в памяти при загрузке программы операционной системой и её исполнении. Результатом этой процедуры является исполняемый файл.
Набор инструментов (toolchain) включает в себя все описанные выше утилиты, конфигурационные файлы и прочие файлы и программы, необходимые для перевода текстового представления исходного кода в бинарный исполняемый файл.
Симулятор Ripes
Ripes - симулятор, который позволяет отслеживать выполнение машинного (исполняемого) кода на процессорах с архитектурами RV32IMC и RV64IMC (суффиксы IMC показывают расширения архитектуры, добавляющие новую функциональность, и будут рассмотрены позднее в третьей части). Симулятор Ripes доступен по ссылке: http://https://github.com/mortbopet/Ripes, на сайте имеется возможность скачать исполняемые файлы для ОС Linux, Windows и macOS. На рис.2.2. показан пользовательский интерфейс симулятора Ripes. Слева расположен редактор программного кода на языке Assembler, по центру - сгенерированный машинный код, справа расположено коно, показывающее состояние регистров процессора, а внизу расположена консоль, в которую перенаправляется вывод программы и служебная информация. Помимо показанного интерфейса Ripes может визуализировать состояние процессора и его компонентов, кэш, память и простой ввод/вывод. Симулятор Ripes очень полезен для быстрого погружения в программирование на языке Assembler.
Эмулятор Qemu и набор инструментов GNU-toolchain для процессора RISC-V
Существуют различные способы обеспечения эмуляции систем на основе микропроцессоров RISC-V благодаря использованию Qemu (доступен по ссылке http://https://www.qemu.org) - эмулятора аппаратного обеспечения, который позволяет эмулировать как целые системы, так и отдельные программы в так называемом "пользовательском режиме" (англ. "user-mode"). В случае эмуляции целой системы операционная система запускается так, как будто она действительно работает на реальном (а не на эмулируемом) железе. При запуске приложений в пользовательском режиме (user-mode emulation) отдельная программа может быть запущена на текущей ОС, даже если она была скомпилирована под другую архитектуру.
В рассматриваемых примерах мы будем считать, что работа идёт на машине с установленной ОС Debian Linux. С более детальной информацией можно ознакомиться на сайте "Debian wiki for RISC-V" по адресу http://https://wiki.debian.org/RISC-V. Далее будет использоваться установка готовых пакетов с использованием менеджера пакетов Debian Advanced Packaging Tool (apt), тем не менее, по адресу http://https://github.com/riscv-collab/riscv-gnu-toolchain располагается инструкция о том, как можно собрать рассматриваемые утилиты из исходников.
Для установки Qemu на компьютер наберите в консоли следующий набор команд:
sudo apt install qemu-system-misc qemu-user-static binfmt-support opensbi u-boot-qemu
Теперь у вас появилась возможность эмулировать систему на процессоре RISC-V. Введите команду:
qemu-riscv64-static -help
Вы должны получить в ответ текст, который начинается со следующей строки:
usage: qemu-riscv64 [options] program [arguments...] ...
Следующим шагом идёт установка набора инструментов кросс-компилятора для сборки программ. Введите следующие команды:
sudo apt install gcc-riscv64-linux-gnu sudo ln -s /usr/riscv64-linux-gnu/lib/ld-linux-riscv64-lp64d.so.1 /lib
И следом за ними команду:
riscv64-linux-gnu-as --version GNU assembler (GNU Binutils for Debian) 2.35.2 ...
Такой вывод говорит об успешной установке набора инструментов, позволяющего запускать эмуляцию программ в режиме пользователя.
После установки эмулятора и набора средств кросс-компилятора необходимо установить отладчик для процессоров с архитектурой RISC-V. В зависимости от версии ОС Debian Linux возможно потребуется поставить нестабильные версии пакетов (для более новых версий ОС).
Отладчик с поддержкой приложений для архитектуры RISC-V называется gdb-multiarch и может быть установлен следующей командой:
sudo apt install gdb-multiarch