---
# System prepended metadata

title: Лабораторная работа №1

---

# Лабораторная работа №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
```




При выполнении данного задания были проделаны следующие шаги:

