Autor Thema: Kernel in Pascal?  (Gelesen 7325 mal)

sfan

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« am: 21. March 2011, 16:29 »
Hallo Leute,

Ich habe mir mal http://www.lowlevel.eu/wiki/Pascal angeschaut und war neugierig wie so ein Pascal Kernel funktioniert.
Ich habe alles so wie es ist auf die Dateien kernel.pas,sytem.pas,boot.asm(von prt0.asm) verteilt.
Wenn ich den Kernel baue kommt:
kernel.pas(3,5) Fatal: Cannot find system type "HRESULT". Check if you use the correct run time library.Hat jemand Rat wie ich an dem Typ HRESULT komme?

Sfan
« Letzte Änderung: 21. March 2011, 16:37 von sfan »

DerHartmut

  • Beiträge: 236
    • Profil anzeigen
    • Mein Blog
Gespeichert
« Antwort #1 am: 21. March 2011, 16:55 »
Welchen Compiler benutzt du? Hast du auch angegeben keine Runtime-Lib zu benutzen?
$_="krJhruaesrltre c a cnp,ohet";$_.=$1,print$2while s/(..)(.)//;
Nutze die Macht, nutze Perl ;-)

sfan

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 21. March 2011, 17:00 »
Welchen Compiler benutzt du?
FPC

Hast du auch angegeben keine Runtime-Lib zu benutzen?
Ich weiss es nicht
meine Makefile ist:
all:
nasm -f elf boot.asm
fpc kernel
ld -T text=0x100000 *.o -o kernel


Sfan

PNoob

  • Beiträge: 106
    • Profil anzeigen
    • Mein Blog
Gespeichert
« Antwort #3 am: 22. March 2011, 16:39 »
da du fpc ohne weitere Parameter aufrufstvermute ich das da der Fehler liegt

sfan

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 22. March 2011, 17:45 »
da du fpc ohne weitere Parameter aufrufst vermute ich das da der Fehler liegt
Ich auch, aber:
Zitat von: Wiki
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
So weit ich weiß wurde der Code von taljeth verfasst.

Sfan
« Letzte Änderung: 22. March 2011, 17:48 von sfan »

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 25. March 2011, 19:37 »
Das ganze war für eine ältere FPC-Version. Aktuelle Versionen brauchen anscheinend etwas mehr Magie. In die system.pas folgendes zusätzlich in den interface-Teil einbauen:
type
    hresult = longint;

Außerdem müssen noch zwei leere Units fpintres.pas und si_prc.pas angelegt werden (vielleicht kann man die auch deaktivieren, hab ich nicht geprüft). Also jeweils irgendwie sowas:
unit si_prc;

interface

implementation

end.

Am geschicktesten ist es aber wahrscheinlich, kernel.pas nicht als program, sondern als unit zu deklarieren und dann das Linken von Hand mit ld zu machen, so wie man es in C auch macht.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

sfan

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 26. March 2011, 11:20 »
Am geschicktesten ist es aber wahrscheinlich, kernel.pas nicht als program, sondern als unit zu deklarieren und dann das Linken von Hand mit ld zu machen, so wie man es in C auch macht.
Ich habe kernel jetzt zu einer unit gemacht.
So weit geht es. :)
Allerdings meckert jetzt ld:
boot.asm:(.text+0x6): undefined reference to `KERNEL_PASCALMAIN'
Aber objdump -d kernel.o sagt:
kernel.o:     file format elf32-i386


Disassembly of section .text:

00000000 <KERNEL_PASCALMAIN>:
   0: 55                   push   %ebp
   1: 89 e5                 mov    %esp,%ebp
   3: 83 ec 04             sub    $0x4,%esp
   6: c7 45 fc 00 80 0b 00 movl   $0xb8000,-0x4(%ebp)
   d: 8b 45 fc             mov    -0x4(%ebp),%eax
  10: c6 00 23             movb   $0x23,(%eax)
  13: c9                   leave  
  14: c3                   ret    
...


Sfan
EDIT:
So sieht kernel.pas jetzt aus:unit kernel;

interface

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

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

end.
« Letzte Änderung: 26. March 2011, 11:21 von sfan »

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 26. March 2011, 18:24 »
Pack mal noch ein procedure PASCALMAIN; in den interface-Teil, sonst wird es wahrscheinlich nicht global.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

sfan

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 28. March 2011, 15:07 »
Pack mal noch ein procedure PASCALMAIN; in den interface-Teil, sonst wird es wahrscheinlich nicht global.
Danke für den Hinweis!
Mit viel googlen hab ich mir einen Kernel zusammengebaut.
http://osdev.bplaced.net/paste.php?id=5
Nur ein "qemu -kernel kernel" enttäuscht mich.


Sfan

sfan

  • Beiträge: 94
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 28. March 2011, 15:40 »
Ich habe den Wiki-Artikel über Pascal mal überarbeitet.
Der entscheidene Code bei dem Kernel ist gleich geblieben.
Sieht man auch bei http://www.lowlevel.eu/w/index.php?title=Pascal&action=historysubmit&diff=9636&oldid=5796.
Also, wenn es nicht funktioniert:
Nicht meine Schuld  :wink:


Sfan
« Letzte Änderung: 28. March 2011, 15:43 von sfan »

 

Einloggen