Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: sfan am 21. March 2011, 16:29
-
Hallo Leute,
Ich habe mir mal http://www.lowlevel.eu/wiki/Pascal (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
-
Welchen Compiler benutzt du? Hast du auch angegeben keine Runtime-Lib zu benutzen?
-
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
-
da du fpc ohne weitere Parameter aufrufstvermute ich das da der Fehler liegt
-
da du fpc ohne weitere Parameter aufrufst vermute ich das da der Fehler liegt
Ich auch, aber:
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
-
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.
-
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.
-
Pack mal noch ein procedure PASCALMAIN; in den interface-Teil, sonst wird es wahrscheinlich nicht global.
-
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 (http://osdev.bplaced.net/paste.php?id=5)
Nur ein "qemu -kernel kernel" enttäuscht mich.
Sfan
-
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 (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