пятница, 20 декабря 2019 г.

Qemu, crosstool-NG

Настроим отладку простейшей проги на си, подключившись через gdbserver к виртуальной машине qemu с архитектурой riscv, следуя следующему руководству на русском, опирающемся на английский оригинал (можно сразу по нему).

Ставим qemu на Fedora 31:

sudo dnf install @virtualization
sudo dnf install qemu-system-riscv-core-4.1.0-2.fc31.x86_64.rpm


Скачиваем Open On-Chip Debugger для Fedora отсюда и prebuilt RISC‑V GCC Toolchain and Emulator отсюда.

Я распаковал Open On-Chip Debugger в папку /usr/local/tools/riscv-openocd-x86_64, а RISC‑V GCC Toolchain в папку /usr/local/tools/riscv-gcc-x86_64.

В файл /home/<user>/.bashrc добавляем (перед export PATH):

PATH="$PATH:/usr/local/tools/riscv-openocd-x86_64/bin:/usr/local/tools/riscv-gcc-x86_64/bin"

Попытаемся удаленно отладить при помощи gdbserver прогу на эмулированной qemu-машине с архитектурой riscv. Прога hello.c от K&R:

mkdir ./helloWorld
cd ./helloWorld
nano ./hello.c

#include <stdio.h>

int main()
{
    printf("hello, world\n");
    return 0; 
}

Компилим её сразу следующим образом:

riscv64-unknown-elf-gcc hello.c -g -v

Запускаем аналог gdbserver в виртуальной машине qemu riscv:

qemu-system-riscv64 -machine virt -m 128M -gdb tcp::1234 -kernel a.out

Запускаем gdb и подключаемся к серверу:

riscv64-unknown-elf-gdb a.out(gdb) target remote :1234

Получаем неопределенный стэк:

Remote debugging using :1234
0x0000000000000000 in ?? ()
(gdb) 

Скидываем dtb-файл в текущую папку:

cd /usr/local/tools/riscv-openocd-x86_64
mkdir machines
qemu-system-riscv64 -machine virt -machine dumpdtb=riscv64-virt.dtb

Ставим dtc:

sudo dnf install dtc

Конвертируем :

dtc -I dtb -O dts -o riscv64-virt.dts riscv64-virt.dtb

Находим начало RAM'а и размер (подробнее в оригинальном руководстве):

[adil_nurimanov@localhost machines]$ grep memory riscv64-virt.dts -A 3
memory@80000000 {
device_type = "memory";
reg = <0x00 0x80000000 0x00 0x8000000>;
};

Отредактируем оригинальный riscv64-unknown-elf-ld  скрипт:

cd /usr/local/tools/riscv-gcc-x86_64/bin
riscv64-unknown-elf-ld --verbose > riscv64-virt.ld

Добавим два определения в  riscv64-virt.ld:


1) добавляем определение RAM - секция MEMORY:

OUTPUT_ARCH(riscv)
/* >>> Our addition. <<< */
MEMORY
{
   /* qemu-system-risc64 virt machine */
   RAM (rwx)  : ORIGIN = 0x80000000, LENGTH = 128M 
}
/* >>> End of our addition. <<< */
ENTRY(_start)

2) добавляем определение вершины стэка __stack_top - секция PROVIDE:

SECTIONS
{
  /* Read-only sections, merged into text segment: */
  PROVIDE (__executable_start = SEGMENT_START("text-segment", 0x10000));
  . = SEGMENT_START("text-segment", 0x10000) + SIZEOF_HEADERS;
  /* >>> Our addition. <<< */
  PROVIDE(__stack_top = ORIGIN(RAM) + LENGTH(RAM));
  /* >>> End of our addition. <<< */
  .interp         : { *(.interp) }
  .note.gnu.build-id  : { *(.note.gnu.build-id) }

Напишем свой crt0.s:

.section .init, "ax"
.global _start
_start:
    .cfi_startproc
    .cfi_undefined ra
    .option push
    .option norelax
    la gp, __global_pointer$
    .option pop
    la sp, __stack_top
    add s0, sp, zero
    jal zero, main
    .cfi_endproc
    .end
C code compile:
1) https://ftp.gnu.org/old-gnu/Manuals/ld-2.9.1/html_node/ld_3.html

Вики (qemu, risc-v):
1) https://github.com/riscv/riscv-qemu
2) https://wiki.qemu.org/Documentation/Platforms/RISCV
3) http://openocd.org/

RISC-V on qemu:
1) (!)https://habr.com/en/post/454208/ (riscv, qemu)
2) https://habr.com/ru/post/319736/ (установка debian 9 на qemu, для кросссборки используется gnueabihf)
3) https://habr.com/ru/post/278159/ (qemu, mips, arm, debian 8)

Отличие bare metal от linux:
1) https://en.wikipedia.org/wiki/Application_binary_interface (русская страница)
2) https://www.linux.org.ru/forum/development/10188780
3) https://jacobmossberg.se/assets/presentations/running-c-programs-bare-metal-arm-gnu-toolchain-foss-gbg-20180926.pdf

RISC-V (wiki, github):
1) RISC-V ISA wiki https://ru.wikipedia.org/wiki/RISC-V
2) RISC-V crosscompiler toolchain (newlib for baremetal) https://github.com/riscv/riscv-gnu-toolchain
3) (!)Недостатки riscv (по сравнению с arm) https://habr.com/ru/post/461785/
4) Перенос Alpine Linux на RISC-V https://habr.com/ru/post/434382/

crosstool-NG:
1) https://habr.com/ru/post/114230/ (только теория)
2) https://habr.com/ru/post/363349/ (сборка под ESP8266)
3) https://habr.com/ru/post/343690/ (без crosstool-Ng, но с asm на qemu)
4) https://habr.com/ru/post/310056/ (сборка под FPGA altera)
5) https://habr.com/ru/post/186124/ (сборка под OSX)
6) https://crosstool-ng.github.io/docs/
7) Cross-compiling tools package guidelines (arch)
8) https://www.linux.org.ru/forum/linux-install/11003225 (gentoo)
9) https://stackoverflow.com/questions/46258701/how-to-builld-os-abi-for-systemv-using-crosstool-ng

Вики (контейнеризация):
1) https://ru.wikipedia.org/wiki/Docker
2) https://ru.wikipedia.org/wiki/Kubernetes
3) https://ru.wikipedia.org/wiki/Chroot

Virtio:
1) https://wiki.libvirt.org/page/Virtio
2) http://rus-linux.net/nlib.php?name=/MyLDP/vm/jones/virtio.html
3) https://www.linux-kvm.org/page/Virtio
4) https://pve.proxmox.com/wiki/Windows_VirtIO_Drivers
5) https://wiki.osdev.org/Virtio
6) https://developer.ibm.com/technologies/linux/articles/l-virtio/

Windows virtual machine with virtio, kvm:
1) https://docs.fedoraproject.org/en-US/quick-docs/creating-windows-virtual-machines-using-virtio-drivers/
2) QEMU/KVM и установка Windows https://habr.com/ru/post/313144/
3) Разворачиваем виртуалку с Windows с пробросом виртуальной видеокарты с помощью QEMU и Intel GVT-g https://habr.com/ru/post/437270/
4) Ускорение дисковой подсистемы Qemu KVM в Linux https://habr.com/ru/company/ruvds/blog/493696/
5) Запуск FreeBSD в Linux KVM https://habr.com/ru/post/167099/
6) Работа с виртуальными машинами KVM. Подготовка хост-машины https://habr.com/ru/post/120717/
7) Общие принципы работы QEMU-KVM https://habr.com/ru/post/466549/
8) Howto Qemu-kvm Debian 8 https://habr.com/ru/post/260791/
9) Автоматизация Для Самых Маленьких. Часть 1.1. Основы виртуализации https://habr.com/ru/post/467801/
10) Запуск Windows под Linux KVM https://habr.com/ru/post/176823/

Kubernetes server cluster on bare metal (мне это не нужно):
1) https://habr.com/ru/post/342232/
2) https://habr.com/ru/company/flant/blog/440504/
3) https://habr.com/ru/company/southbridge/blog/334846/
4) https://habr.com/ru/company/southbridge/blog/439562/

riscv memory manager:
1) https://github.com/riscv/riscv-tests/blob/master/debug/programs/tiny-malloc.c
2) https://www.sifive.com/blog/all-aboard-part-9-paging-and-mmu-in-risc-v-linux-kernel
3) https://inst.cs.berkeley.edu/~cs61c/fa17/disc/2/Disc2Sol.pdf
4) https://github.com/riscv/riscv-gnu-toolchain/issues/571

memory manager wiki:
1) https://en.wikipedia.org/wiki/Memory_management (русская)
2) https://en.wikipedia.org/wiki/Memory_management_unit (русская)

Комментариев нет:

Отправить комментарий