# Лабораторная работа №1 # Исследование программного симулятора QEMU на основе процессорной архитектуры RISC-V Цели работы: 1. Исследование программного пакета QEMU для эмуляции аппаратного обеспечения процессоров 2. Исследование процессорной архитектуры RISC_V a. Исследование аппаратного модуля UART b. Исследование аппаратного модуля прямого доступа к памяти (DMA) 3. Изучение принципов работы компоновщика (Linker Script) Краткая теоретическая справка Прямой доступ к памяти (англ. direct memory access, DMA) — режим обмена данными между устройствами компьютера или же между устройством и основной памятью, в котором центральный процессор (ЦП) не участвует. Так как данные не пересылаются в ЦП и обратно, скорость передачи увеличивается. Модуль DMA в процессоре RISC_V, который используется в данной работе имеет название PDMA. Работа PDMA драйвера демонстрируется с помощью заполнения RAM памяти с помощью последовательности псевдослучайных чисел. Заполняется память начиная с конца загруженного образа программы до конца с гранулярностью 16 байт. Драйвер поддерживает работу как в синхронном, так и в асинхронном режиме # Подготовка к работе. Для выполнения работы потребуется набор инструментальных средств (англ. -toolchain, рус. тулчейн) для манипуляции с объектными файлами и компиляции программы с поддержкой архитектуры riscv32 и программный симулятор - QEMU. # 1.1 Установка программного симулятора - QEMU 1.1.1 Установите систему сборки ```bash sudo apt-get install ninja-build cd riscv-ubuntu/ ``` 1.1.2 Установите QEMU ```bash git clone https://github.com/qemu/qemu cd qemu git checkout 0021c4765a6b83e5b09409b75d50c6caaa6971b9 ./configure --target-list=riscv64-softmmu make -j $(nproc) make install cd .. ``` # 1.2 Установка toolchain 1.2.1 Установка тулчейна может быть осуществлена двумя способами: a. Использовать предварительно скомпилированный тулчейн b. Загрузить исходные коды тулчейн и выполнить их сборку # 1.2.2 Установка программного обеспечения Установка комплекта программного обеспечения для компиляции и линковки программ 1.2.2.1 Установка предварительно собранного toolchain: Используя следующую команду GIT загрузите toolchain: ```bash wget https://github.com/stnolting/riscv-gcc-prebuilt/releases/download/rv32i-4.0.0/riscv32-unknown-elf.gcc-12.1.0.tar.gz ``` 1.2.2.2 Осуществить сборку toolchain из исходных кодов а. Загрузитке исходные коды toolchain ```bash git clone https://github.com/riscv/riscv-gnu-toolchain ``` b. Перейдите в директорию драйвера и выполните сборку: ```bash $ cd riscv-gnu-toolchain $ ./configure --prefix=/opt/riscv $ make -j ``` # 1.3 Сборка программы Скрипт для сборки ожидает что тулчейн находится в /opt/riscv/, но можно изменить с помощью переменной окружения CROSS. Пример: ```bash $ CROSS=/path/to/riscv32-gcc make ``` Для запуска эмулятора QEMU нужно в директории драйвера написать ```bash $ make qemu ``` На выходе будут отладочные логи которые показывают сравнение значений ожидаемых и реальных. В конце при успехе выведется сообщние о том что драйвер работает как ожидалось. В случае успешной установки toolchain перейдите к следующему шагу: # 3. Изучите официальное справочное руководство на используемый процессор и состав программного обеспечения. Справочное руководство и исходные коды программ находятся в репозитории. 3.1 Изучите официальное руководство на используемый процессор - https://static.dev.sifive.com/FU540-C000-v1.0.pdf 3.2 Состав программного обеспечения - Драйвер PDMA; - драйвер UART; - генератор псевдослучайных чисел; - функция заполнения оперативной памяти и функция верификации оперативной памяти; - файл с правилами сборки (Makefile) 3.3 Структура проекта ├── Lab_QEMU ├── Makefile └── src ├── crt.S ├── hello.c ├── include │ ├── config.h │ ├── macro_def.h │ ├── panic.h │ ├── PDMA_RISC_V.h │ ├── random.h │ ├── ring_buffer.h │ ├── string.h │ └── UART_RISC_V.h ├── Makefile ├── panic.c ├── PDMA_RISC_V.c ├── qemu.ld ├── random_filler.c ├── ring_buffer.c ├── string.c └── UART_RISC_V.c # 4. Основная часть работы 4.1 Перейдите в каталог Lab_QEMU и выполните запуск симулятора ```bash= cd Lab_QEMU make qemu ``` При выполнении данного задания были проделаны следующие шаги: