# Лабораторная работа №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
```
При выполнении данного задания были проделаны следующие шаги: