Hinweise zum Erstellen von TinyEMU und zum Booten des Linux-Kernels auf Emscripten

Beim letzten Mal (RISC-V-Entwicklungsumgebung mit Buildroot und Crosstool-ng vorbereiten) wurde der Kernel mit qemu gestartet, sodass er diesmal im Webbrowser funktioniert. Versuchen Sie es mit TinyEMU (https://bellard.org/tinyemu/), einem RISC-V-Emulator.

image.png

Von der übergeordneten Kernel-Panik aus gesehen.

tl;dr

Dieses Mal habe ich überhaupt keine TinyEMU-Standard-E / A-Bibliothek verwendet, sondern versucht, VM auf der C-Sprache von Emscripten zu konfigurieren und zu starten.

Erstellen Sie TinyEMU

Der Build selbst ist nicht besonders schwierig, und wenn Sie * .c entsprechend kompilieren und ausgeben, können Sie etwas bekommen, das funktioniert.

emcc jsemu.c softfp.c virtio.c fs.c fs_net.c fs_wget.c fs_utils.c simplefb.c pci.c ^
json.c block_net.c iomem.c cutils.c aes.c sha256.c riscv_cpu.c riscv_machine.c machine.c ^
--llvm-opts 2 -Wall -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -MMD -fno-strict-aliasing ^
-DCONFIG_FS_NET -O3 --memory-init-file 0 --closure 0 -s NO_EXIT_RUNTIME=1 ^
-s "EXPORTED_FUNCTIONS=['_console_queue_char','_vm_start','_fs_import_file','_display_key_event','_display_mouse_event','_display_wheel_event','_net_write_packet','_net_set_carrier','_main']" ^
-s "EXTRA_EXPORTED_RUNTIME_METHODS=[\"ccall\", \"cwrap\"]" ^
--js-library js/lib.js  -s WASM=1 -s TOTAL_MEMORY=67108864 -s ALLOW_MEMORY_GROWTH=1  ^
-DMAX_XLEN=32 -DCONFIG_RISCV_MAX_XLEN=32 -s ASSERTIONS=1 --emrun -g4 ^
--source-map-base http://localhost:6931/ --preload-file kernel --preload-file bbl32.bin emmain.c -o run.html

Ersteinrichtungsroutine (sogenanntes main)

In normaler TinyEMU werden VM-Einstellungen von der JavaScript-Seite aus durchgeführt, aber die Vereinheitlichung mit der nativen Version war etwas unpraktisch. Daher habe ich beschlossen, eine Hauptfunktion vorzubereiten.

Der Bootloader bbl32.bin und der Linux-Kernel kernel sind einmal in Emscriptens --preload-file App eingebettet und werden von der C-Sprachdatei I / O gelesen.

Sie können den zuletzt erstellten "Kernel" (https://qiita.com/okuoku/items/3133c75d26c57394fd1a) so verwenden, wie er ist, aber der Bootloader "bbl32.bin" wird mit TinyEMU (https://bellard.org/tinyemu) geliefert. Sie müssen die von /diskimage-linux-riscv-2018-09-23.tar.gz) verwenden.

TinyEMU-spezifische (?) HTIF-Implementierung

TinyEMU emuliert keine sogenannten UART-Geräte, sondern implementiert HTIF (Host-Target IF), das von Spike (offizieller RISC-V-Emulator) implementiert wurde.

Im Gegensatz zu anderen Implementierungen wie qemu hat die HTIF-Implementierung von TinyEMU jedoch eine feste Adresse, und der Bootloader ist gepatcht, um die Adresse zu übermitteln.

#define HTIF_BASE_ADDR 0x40008000
diff --git a/bbl/bbl.lds b/bbl/bbl.lds
index 26f5816..615c3dc 100644
--- a/bbl/bbl.lds
+++ b/bbl/bbl.lds
@@ -43,15 +43,10 @@ SECTIONS
   _etext = .;
 
   /*--------------------------------------------------------------------*/
-  /* HTIF, isolated onto separate page                                  */
+  /* HTIF I/Os                                                          */
   /*--------------------------------------------------------------------*/
-  . = ALIGN(0x1000);
-  .htif :
-  {
-    PROVIDE( __htif_base = .);
-    *(.htif)
-  }
-  . = ALIGN(0x1000);
+  tohost = 0x40008000;
+  fromhost = 0x40008008;

Ein Patch für dieses Linker-Skript korrigiert die Adressen von "tohost" und "fromhost".

volatile uint64_t tohost __attribute__((section(".htif")));
volatile uint64_t fromhost __attribute__((section(".htif")));

Ursprünglich werden diese Adressen beim Laden des Emulators erfasst.

Erstens ist HTIF selbst eine alte Spezifikation, daher spielt es jetzt vielleicht keine Rolle, aber ich möchte auch ein ernsthafteres Protokoll.

Verwenden Sie HTIF bei 32 Bit

Da HTIF eine 64-Bit-Schnittstelle ist, kann es nicht mit einer 32-Bit-Architektur verwendet werden. (Wenn Schreibkonflikte auf zwei oder mehr CPUs geschrieben werden, können sie nicht sicher verarbeitet werden.)

TinyEMU unterstützt keinen Multiprozessor, daher scheint mir dieser Bereich egal zu sein. ** Deklarieren Sie das Register mit einer Breite von 32 Bit und aktivieren Sie es, wenn das obere Wort geschrieben wird ** 32 Bit / 64 Bit Beide werden unterstützt.

... qemu unterstützt Multiprozessoren, daher denke ich nicht, dass dieselbe Richtlinie funktionieren wird. ..

Kanso

Ich war darauf vorbereitet, dass die RISC-V 32-Bit-Umgebung zu kürzlich vorbereitet wurde und im Vergleich zu 64-Bit viel zurückliegt, aber es ist ein bisschen so, dass ein reines Debugging-I / F wie HTIF 32-Bit nicht unterstützt. Es war unerwartet.

TODO: -s SINGLE_FILE = 1 muss für die Verteilung mit npm festgelegt werden, und der Kernel und der Bootloader müssen extern bereitgestellt werden.

Recommended Posts

Hinweise zum Erstellen von TinyEMU und zum Booten des Linux-Kernels auf Emscripten
Hinweise zum Erstellen von Python und Pyenv auf dem Mac
Kompilieren des Linux-Kernels (Linux 5.x unter Ubuntu 20.04)
Geben Sie die Lautstärke unter Linux an und spielen Sie den Sound ab
Informationen zur Option --enable-shared beim Erstellen von Python unter Linux
Ich habe versucht, den Linux-Kernel auf virtualbox + vagrant zu installieren
Hinweise zur Funktion und Rückverfolgung
Anmerkungen zu * args und ** kargs
Installieren Sie JDK unter Linux
Aufnahme und Wiedergabe unter Linux
Anmerkungen zu Pyenv und Atom
Finden Sie das meiste F-Wort-Commit unter Linux (Git und höher)
Datenstrukturen vom Listentyp und ihre Operationen im Linux-Kernel
Fügen Sie den Link unter Linux ein
Hinweise zu Python- und Wörterbuchtypen
Probieren Sie den Linux-Kernel-Sperrmechanismus aus
Umfrage zum Aufbau und Betrieb von Kivi
Hinweise zur Verwendung von Post-Receive und Post-Merge
Hinweise zur Verwendung von matplotlib auf dem Server
Hinweise zur Installation von Ubuntu 18.04 auf XPS 15 7590
Lesen Sie die Datei mit Python und löschen Sie die Zeilenumbrüche [Hinweise zum Lesen der Datei]
[UE4] Erstellen Sie DedicatedServer unter Windows und Linux
Installieren Sie wsl2 und Master Linux unter Windows
Installieren und starten Sie k3s unter Manjaro Linux
Installieren und konfigurieren Sie den TigerVNC-Server unter Linux
Lernen Sie sshd_config und autorisierte_Tasten (für Amazon Linux 2)
Fügen Sie dem Bild Linien und Text hinzu
Stellen Sie unter Linux (Ubuntu) das Trackpad ein und stellen Sie die Funktion auf Drei-Finger-Wischen ein