Autor Thema: Kernel in Pascal  (Gelesen 8712 mal)

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« am: 08. February 2007, 13:44 »
Hallo,

um den anderen Thread nicht zu sehr ins OT zu treiben, weiter hier.

Zitat
Zitat
@taljeth: Du schriebst, dass du einen Kernel in Pascal angefangen hast. Irgendwie kann ich mir das nicht zu richtig vorstellen, wie das funktioniert (ich kenne nur Delphi). Welche Software (Compiler) benutzt du dafür? Kannst du mir einen kleinen HelloWorld-Bootloader mal darin programmieren?
Bootloader? Ne, laß mal, dafür nimmt man Assembler... Ich benutze eigentlich immer GRUB. Für den Kernel habe ich FreePascal benutzt. Ich kann dir auch mal einen kleinen Beispielcode geben, wenn ich daheim bin.
Das wäre nett.
Mit HelloWorld-Bootloader meinte ich einfach einen Code, der "hello world" ausgibt und direkt von Diskette geladen werden kann (wenn's möglich ist). Damit ich nen Einblick kriege, wie es gehen kann.

Gruß,
Svenska

Biehler Productions2

  • Beiträge: 47
    • Profil anzeigen
    • http://biehlos.biehler-josef.de
Gespeichert
« Antwort #1 am: 08. February 2007, 19:40 »
http://debian.fmi.uni-sofia.bg/~nickysn/paskernel/
http://sourceforge.net/projects/glider-kernel

Ohne Gewähr, hab ich nur auf die schnelle gefundne, weis nicht, ob es das ist, was du suchst.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 08. February 2007, 21:12 »
Mit HelloWorld-Bootloader meinte ich einfach einen Code, der "hello world" ausgibt und direkt von Diskette geladen werden kann (wenn's möglich ist). Damit ich nen Einblick kriege, wie es gehen kann
Naja, FreePascal ist ein 32-Bit-Compiler (ja, auch 64 Bit, aber das ist hier nebensächlich ;)). Dessen Ausgabe kann man also nicht einfach in den Bootsektor schreiben... Ich würde dir wirklich GRUB empfehlen, damit ist es dann recht einfach.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 08. February 2007, 22:48 »
Mir fehlen hier an diesem Rechner zwar praktisch alle Informationen, aber ich habe trotzdem mal einen von GRUB bootbaren Beispielkernel zusammgebastelt. Ich gebe zu, daß das noch nicht wunderschön ist.

Zunächst kernel.pas - der eigentliche Kernel, der ein Zeichen ausgibt.
program kernel;

type tScreen = array[1..25, 1..80] of record
    c: char;
    attr: byte;
end;

var screen: ^tScreen;
begin
    screen := Pointer($B8000);
    screen^[1, 1].c := '#';
end.

Das war der einfache Teil. Als nächstes brauchen wir eine eigene system-Unit, die allerdings für den Anfang nur zwei Stubs bereitstelen muß. system.pas:
unit system;

interface

procedure FPC_INITIALIZEUNITS; compilerproc;
procedure FPC_DO_EXIT; compilerproc;

implementation

procedure FPC_INITIALIZEUNITS; alias: 'FPC_INITIALIZEUNITS'; compilerproc;
begin
end;

procedure FPC_DO_EXIT; alias: 'FPC_DO_EXIT'; compilerproc;
begin
end;

end.

Und der dritte Teil ist ein Assembler-Stub, prt0.asm:
extern PASCALMAIN
global _start

section .text
_start:

    ; Stack initalisieren
    mov esp, kernelstack

    call PASCALMAIN
    jmp $

multiboot_header:
align 4
  MULTIBOOT_MAGIC     equ 0x1BADB002
  MULTIBOOT_FLAGS     equ 0x03
  MULTIBOOT_CHECKSUM  equ -MULTIBOOT_MAGIC-MULTIBOOT_FLAGS

  dd MULTIBOOT_MAGIC
  dd MULTIBOOT_FLAGS
  dd MULTIBOOT_CHECKSUM

section .bss
  resb  16384
kernelstack:

Anschließend müssen diese drei Dateien kompiliert/assembliert und gelinkt werden. Das ist der Punkt, der mir noch nicht so ganz gefällt, weil ich ld eigentlich nicht von Hand aufrufen müssen will, um text=0x100000 setzen zu können.
nasm -felf prt0.asm
fpc kernel
ld -Ttext=0x100000 *.o -o kernel

Das mal so als ein innerhalb einer halben Stunde zusammengehackter Anfang, da ist sicher noch Verbesserungspotential. ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 09. February 2007, 13:04 »
Hm, das sieht mir doch recht kompliziert aus. Allerdings ist das schonmal ein Anfang.
Auf Grub wollte ich eigentlich verzichten, genauso wie auf 32 Bit (ich weiß, ich bin archaisch). Mein System soll halt auf echten 286ern laufen; da ist Freepascal also ne schlechte Wahl. Vielleicht ein (älteres) Turbo Pascal...?
Den Bootloader kriege ich notfalls auch in reinem Assembler hin. So schwer sollte es nicht sein.

Der Kernel selbst ist schön einfach zu verstehen, aber system.pas und prt0.asm verstehe ich nicht so leicht. Was genau enthalten die denn? Die Runtime für den Kernel bzw. die Pascal-Umgebung?
Mit ld habe ich noch nie gearbeitet, was tut der denn?

edit: Unter TP 5.5 kompiliert der Kernel-Code wunderbar, zeigt aber nichts an (habe ein while True do; druntergeklemmt). Allerdings führe ich den Spaß unter DOS aus...

Gruß,
ein ratloser Svenska
« Letzte Änderung: 09. February 2007, 13:50 von Svenska »

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 09. February 2007, 13:56 »
Hm, das sieht mir doch recht kompliziert aus. Allerdings ist das schonmal ein Anfang.
Der einzige Unterschied zu C ist, daß man die system.pas braucht. Ansonsten ist das das normale Vorgehen für einen mit GRUB zu ladenden Kernel.

Zitat
Mein System soll halt auf echten 286ern laufen; da ist Freepascal also ne schlechte Wahl. Vielleicht ein (älteres) Turbo Pascal...?
Ja, aber. ;)

Wäre sicher möglich, TP erzeugt 16-Bit-Code. Die Frage ist nur, ob du es hinbekommst, für TP eine system-Unit zu schreiben. Ich denke nicht, daß das sonderlich gut dokumentiert ist, wenn es überhaupt geht. Und ohne eigene system-Unit, die auch ein bißchen Compiler Magic enthält, bist du auf dem Stand von C und kannst deinen Kernel gleich damit programmieren.

Zitat
Der Kernel selbst ist schön einfach zu verstehen, aber system.pas und prt0.asm verstehe ich nicht so leicht.
Naja, jedes Pascal-Programm bindet ja implizit die Unit system ein, die solche Sachen wie GetMem oder Write enthält (nebenbei auch noch die Definitionen für einige grundlegende Datentypen wie integer) und außerdem für korrekten Start und Beenden sorgt. Die beiden Stubs tun genau nichts und werden beim Start bzw. beim Beenden aufgerufen.

prt0.asm ist auch ein Teil der system-Unit und zwar der Code, der an den Anfang jedes Programms gehängt wird. In diesem Fall enthält er den Multiboot-Header für GRUB und springt ansonsten nur nach PASCALMAIN, nachdem er den Stack initialisiert hat.

Achja: Das alles ist wie gesagt Compiler Magic, also hochgradig FP-spezifisch und nicht allgemein bei allen Pascal-Compilern so.

Zitat
Mit ld habe ich noch nie gearbeitet, was tut der denn?
Das ist ein Linker, der die Objektdateien zu einer ausführbaren Datei zusammenlinkt.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 10. February 2007, 15:24 »
Hm, das sieht mir doch recht kompliziert aus. Allerdings ist das schonmal ein Anfang.
Der einzige Unterschied zu C ist, daß man die system.pas braucht. Ansonsten ist das das normale Vorgehen für einen mit GRUB zu ladenden Kernel.
Genau system.pas fehlt bei mir (TP 5.5).

Zitat
Zitat
Mein System soll halt auf echten 286ern laufen; da ist Freepascal also ne schlechte Wahl. Vielleicht ein (älteres) Turbo Pascal...?
Wäre sicher möglich, TP erzeugt 16-Bit-Code. Die Frage ist nur, ob du es hinbekommst, für TP eine system-Unit zu schreiben.
Genau daran scheitert es zur Zeit. Die system.pas enthält also sozusagen die Runtime-Umgebung bzw. die Funktionsbibliothek?

Zitat
Ich denke nicht, daß das sonderlich gut dokumentiert ist, wenn es überhaupt geht. Und ohne eigene system-Unit, die auch ein bißchen Compiler Magic enthält, bist du auf dem Stand von C und kannst deinen Kernel gleich damit programmieren.
Was ich gerade vermeiden wollte.

Zitat
Achja: Das alles ist wie gesagt Compiler Magic, also hochgradig FP-spezifisch und nicht allgemein bei allen Pascal-Compilern so.
Das ist schlecht. :-(

Zitat
Zitat
Mit ld habe ich noch nie gearbeitet, was tut der denn?
Das ist ein Linker, der die Objektdateien zu einer ausführbaren Datei zusammenlinkt.
Soweit war ich schon :) Also enthalten die Objektdateien noch keine Referenzen auf die endgültigen Speicheradressen, sondern nur relative Speicherbezüge? Und die werden dann endgültig, wenn man das linkt?

Mein Problem mit GRUB ist, dass der höchstwahrscheinlich ein 32-Bit-System voraussetzt (wie Linux auch) und daher für mein "Projekt" nicht geeignet ist.

Ich werd mal bisschen weiter suchen und vielleicht was finden.

edit: Ich habe etwas gefunden.
Es gibt zwar keine system.pas, aber sämtliche sprachrelevanten Teile (und auch diverse andere Units, wie z.B. die berüchtigte crt) finden sich in der TURBO.TPL, allerdings in kompilierter Form. Es gibt diverse Patches für diese Datei, um den Runtime Error 200 zu umgehen (auf schnellen [> 200 mhz] Rechnern) und irgendwo findet sich bestimmt noch ein Quelltext dafür.

Mein anderes Problem ist jetzt der 16-Bit Protected Mode. Wenn ich den Kernel in irgendeiner Form lade und ausführe, muss dieser ja darauf vorbereitet sein. Erzeugt Turbo Pascal jetzt PM-tauglichen Code oder nicht? Wenn nicht, ist das Projekt - wieder einmal - gestorben. Weiß da jemand was?

noch nen edit: Ich glaube, das wird nix. Das einzige Beispiel, was ich in der Richtung gefunden habe, bestand zum größten Teil aus Inline-Assembler. Da kann ich das auch komplett erledigen. Trotzdem danke dir für die Informationen.

Gruß,
Svenska
« Letzte Änderung: 10. February 2007, 16:30 von Svenska »

 

Einloggen