Benutzer-Werkzeuge

Webseiten-Werkzeuge


projects:gforth-as-pid-one:start

Dies ist eine alte Version des Dokuments!


Gforth als Prozess 1 unter Linux

USB-Stick oder SD-Karte mit GForth almost native

Die Installation von GForth 'almost native' für x86-32Bit wurde für i686 Rechner (Pentium-Pro und neuer) kompiliert. Getestet wurde auf einem Thinkpad X60 und einen NoName Laptop mit VIA C7 CPU.

Bei Fragen und Verbesserungsvorschlägen bitte eine E-Mail an gforth-an@strotmann.de.

Anleitung Dateien

Anleitung zum erstellen einen USB-Stick oder SD-Karte unter Linux

  1. USB Stick oder SD-Karte einstecken, Gerätename per „dmesg“ herausfinden (im folgenden /dev/sdb1 bitte gegen den eigenen Gerätenamen austauschen. ACHTUNG, bei falschem Gerätenamen droht Datenverlust!)
  2. die Software „syslinux“ als Paket installieren (per yum, apt-get, emerge etc)
  3. eine primäre Partition auf dem Stick anlegen (wenn nicht schon vorhanden)
  4. Partition mit dem EXT2 Dateisystem formatieren % mkfs.ext2 /dev/sdb1
  5. Partition anhängen '% mount /dev/sdb1 /mnt
  6. Dateien auf die Partition spielen cd /mnt; tar cvfz gforth-almost-native-20140815.tgz; sync; cd;
  7. extlinux installieren % extlinux -i /mnt
  8. Bootsektor installieren % cat /usr/share/syslinux/mbr.bin > /dev/sdb
  9. Partition aushängen % umount /mnt
  10. USB-Stick ausprobieren

GForth 'almost native' Dateien vom 20140815 (12.5 MB)

Anleitung Dateisystem-Abbild

  1. USB-Stick oder SD-Karte einstecken (mind. 512 MB), Gerätename per „dmesg“ herausfinden (im folgenden /dev/sdb1 bitte gegen den eigenen Gerätenamen austauschen. ACHTUNG, bei falschem Gerätenamen droht Datenverlust!)
  2. Image auf das Gerät spielen gzcat gforth-almost-native-20140815.img.gz | dd bs=1M > /dev/sdb
  3. USB-Stick oder SD-Karte ausprobieren

GForth 'almost native' USB-Stick Image (512MB) vom 20140815 (37 MB)

Blocks und Datei-IO unter gforth-an

Wenn GNU/Forth (gforth) unter Linux als PID-1 gestartet wird, so ist ein Dateizugriff auf das Dateisystem des USB-Sticks oder der Festplatte möglich.

GNU/Forth Blocks sind im gforth-Handbuch Dokumentiert: https://www.complang.tuwien.ac.at/forth/gforth/Docs-html/Blocks.html.

Wird keine explizite Datei für die Blocks angegeben, wir werden die Blocks in die Datei „blocks.fb“ auf dem Datenträger geschrieben, von dem gforth-an gestartet wurde (z.B. dem USB-Stick).

Die Datei-IO Worte des gforth orientieren sich am ANSI-Forth Standard und sind im Handbuch unter https://www.complang.tuwien.ac.at/forth/gforth/Docs-html/Files.html dokumentiert.

Es können so viele Blocks erstellt werden, wie Speicherplatz auf dem Datenträger frei ist.

Editor

Bis es einen besseren Editor für gforth-na gibt (Freiwillige vor), kann der Retro-Forth Editor (http://retroforth.org/pages/?PortsOfRetroEditor) benutzt werden. Der Retro-Forth Editor ist klein genug, um Ihn einzutippen und dann mittels des Editors (nochmal) in einen Block zu schreiben, um den Editor danach direkt aus dem Block laden zu können.

.( Retro Forth block editor for gForth ) 
cr 

16 constant l/b 
: (block) scr @ block ; 
: (line) c/l * (block) + ; 

: row dup c/l type c/l + cr ; 
: .rows l/b 0 do i . row loop ; 
: .block ." Block: " scr @ dup . updated? 43 + emit space ; 
: +--- ." +---" ; 
: :--- ." :---" ; 
: x--- +--- :--- +--- :--- ; 
: --- space space x--- x--- x--- x--- cr ; 
: vb --- scr @ block .rows drop --- ; 
: .stack ." Stack: " .s ; 
: status .block .stack ; 
: v cr vb status ; 

: v* update v ; 
: s dup scr ! block drop v ; 
: ia (line) + >r 10 parse r> swap move v* ; 
: i 0 swap ia v* ; 
: d (line) c/l bl fill v* ; 
: x (block) l/b c/l * bl fill v* ; 
: p -1 scr +! v ; 
: n 1 scr +! v ; 
: e scr @ load ; 

cr .( editor loaded ) cr

Linux Syscalls aus GForth für ia86-32bit Linux

abi-code sys-getpid ( -- pid ) \ get process ID for gforth
   20  #   ax mov  \ get-pid syscall
   $80 #      int  \ execute syscall
   ax      cx mov  \ save result
   4 sp d) ax mov  \ get stackpointer
   4 #     ax sub  \ make space for result on stack
   cx    ax ) mov  \ move result to stack
              ret  \ return from code
end-code

abi-code sys-reboot ( -- ) \ shutdown and reboot machine
       88 # ax mov  \ reboot syscall
$fee1dead # bx mov  \ magic 1
 85072278 # cx mov  \ magic 2
$01234567 # dx mov  \ command (restart)
      $80 #    int  \ execute syscall
               ret  \ we don't expect to come back
end-code

abi-code sys-poweroff ( -- ) \ shutdown and poweroff machine
       88 # ax mov  \ reboot syscall
$fee1dead # bx mov  \ magic 1
 85072278 # cx mov  \ magic 2
$4321fedc # dx mov  \ command (poweroff)
      $80 #    int  \ execute syscall
               ret  \ we don't expect to come back
end-code

abi-code sys-sync ( -- ) \ commit buffer cache to disk
  36 #      ax mov  \ sync syscall
 $80 #         int  \ execute syscall
  4 sp d)   ax mov  \ return stackpointer
               ret  \ return
end-code

\ redefine "bye"
: bye sys-sync sys-poweroff ;

FAQ

  • Frage: Kann gforth-na auf die Festplatte installiert werden
  • Antwort: ja. Bei einem Linux-System kann das gforth Programm (statisch gegen diet-libc gelinkt) in ein Verzeichnis kopiert werden (zusammen mit der Image-Datei gforth.fi. Im Linux-Bootloader muss dann ein neuer Eintrag erstellt werden, welcher das gforth als init Prozess startet. Beispiel-Eintrag bei einem Debian-System mit grub Boot-Loader:
menuentry 'GNU/Forth almost native' --class debian --class gnu-linux --class gnu --class os {
        load_video
        insmod gzio
        insmod part_msdos
        insmod ext2
        set root='(hd0,msdos1)'
        search --no-floppy --fs-uuid --set=root 3413a572-49e9-47f0-9a27-fb3daa7c13b2
        echo    'Loading GNU/Forth ...'
        linux   /vmforth root=/dev/sda3 rw fbcon=font:SUN12x22 init=/bin/gforth
}
  • Frage: welche Minimalanforderungen an den Rechner hat gforth-na?
  • Antwort: bei Benutzung eines (selbstkompilierten) 2.6.x Linux-Kernels: 386SX CPU mit 4 MB Hauptspeicher
projects/gforth-as-pid-one/start.1409494860.txt.gz · Zuletzt geändert: 2014-08-31 16:21 von cas