So, meine gdt-unit ist fertig und funktioniert natürlich nicht. Ich habe sie von einem passenden C-Beispiel übersetzt, es kann natürlich sein, dass ich in vielerlei hinsicht unrecht hatte (c ist ja nunmal ein wenig anders, und viel davon verstehe ich nicht). Der Code ist aber erstmal eine Basis. Ich dachte mir, ihn während meiner fehlersuche öffentlich zur schau zu stellen (denn vielleicht kommt jemand früher als ich auf den entscheidenden fehler).
unit moloGDT;
interface
type
gdt_entry = packed record
limit_low : Word;
base_low : Word;
base_middle : Byte;
access : Byte;
granularity : Byte;
base_high : Byte;
end;
gdt_ptr = packed record
limit : Word;
base : Word;
end;
procedure gdt_flush; Assembler;
procedure gdt_set_gate(num:Word; base,limit:Cardinal; access,gran:Byte);
procedure gdt_install;
implementation
var gdt : array[0..2] of gdt_entry;
gp : gdt_ptr;
procedure gdt_flush; Assembler;
asm
lgdt gp
movw $0x10, %ax
movw %ax, %ds
movw %ax, %es
movw %ax, %fs
movw %ax, %gs
movw %ax, %ss
jmpl $0x08, .L1
.L1:
end;
procedure gdt_set_gate(num:Word; base,limit:Cardinal; access,gran:Byte);
begin
gdt[num].base_low := (base AND $FFFF);
gdt[num].base_middle := (base SHR 16) AND $FF;
gdt[num].base_high := (base SHR 24) AND $FF;
gdt[num].limit_low := (limit AND $FFFF);
gdt[num].granularity := (limit SHR 16) AND $0F;
gdt[num].granularity := gdt[num].granularity XOR (gran AND $F0);
gdt[num].access := access;
end;
procedure gdt_install;[public , alias: 'gdt_install'];
begin
gdt_set_gate(0,0,0,0,0);
gdt_set_gate(1,0,$FFFFFFFF,$9A,$CF);
gdt_set_gate(2,0,$FFFFFFFF,$92,$CF);
gp.limit := (sizeOf(gdt_entry)*3)-1;
gp.base := word(@gdt);
gdt_flush;
end;
end.
Die Unit wird im Kernelcode eingebunden und gdt_install wird gleich als erstes im Kernel aufgerufen. Ich werde mich auf die Suche machen, aber bin natürlich über Unterstützung immer glücklich^^.
Vielen Dank an taljeth bis hier hin! (Bin doch auf AT&T-Syntax umgestiegen, weil in der Intel-Syntax keine Manipulation von Segment-registern möglich ist, arrrgh.)
mfg, grebaldi