Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - grebaldi

Seiten: [1]
1
Lowlevel-Coding / Re: GDT über Inline-Assembler
« am: 07. November 2008, 11:23 »
Für alle Pascal-Interessierten hier jetzt mal der funktionierende Code meiner Unit:

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  : LongWord;
 end;

var gdt : array[0..2] of gdt_entry;
    gp  : gdt_ptr;

procedure gdt_set_gate(num:LongInt; base,limit:LongWord; access,gran:Byte);
procedure gdt_install;
 
implementation

procedure gdt_flush; Assembler; nostackframe;
label
  flush;
asm
  lgdt [gp]
  mov  ax,$10
  mov  ds,ax
  mov  es,ax
  mov  fs,ax
  mov  gs,ax
  mov  ss,ax
  jmp  $08,flush   // don't know the correct syntax in FPC inline assembler, but it works!
flush:
end;

procedure gdt_set_gate(num:LongInt; base,limit:LongWord; 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 OR (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))-1;
  gp.base  := LongWord(@gdt);
 
 
  gdt_flush;
end;

end.

2
Lowlevel-Coding / Re: GDT über Inline-Assembler
« am: 07. November 2008, 10:14 »
Den operator hatte ich schon geändert, ich bin da an eine falsche tabelle geraten.

Aktuell ist es quasi ein OR. (und es funktioniert natürlich trotzdem nicht - aber es ist vrmtl. wie du schon sagst. GDT- eine Art Feuertaufe für jeden (Pascal-)Programmierer^^)

Ich habe gerade einen Code entdeckt, der so ziemlich ähnlich aussieht, wie meiner (also Pascal). Jetzt will ich mal schauen, ob der funktioniert und dann vergleichen, was ich falsch mache.

Ich kann mich nur nochmal für deine Hilfe bedanken.

Edit: Ich bin schockiert und begeistert zugleich, der andere Code funktioniert - sogar mit Intel-Syntax im Inline-Assembler. Jetz werde ich nochmal genauso viel Zeit benötigen um das zu begreifen. Aber so ist wenigstens vorwärtskommen angesagt.
3
Lowlevel-Coding / Re: GDT über Inline-Assembler
« am: 07. November 2008, 09:52 »
Ich habe die words korrigiert und gdt_ptr.base als pointer definiert (bzw. ich habs auch einmal mit gp komplett als pointer probiert), aber das hat's leider nicht gebracht.

Die bitweise Operationen müssten so eigentlich stimmen (wenn ich sie in C richtig interpretiert habe, versteht sich). Wie gesagt, der Code ist einem Tutorial entnommen (hier zu finden) und von mir übersetzt. Ich bin etwas stark verwirrt, da es sich ja um ziemlich einfache definitionen handelt.....
4
Lowlevel-Coding / Re: GDT über Inline-Assembler
« am: 07. November 2008, 02:38 »
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
5
Lowlevel-Coding / Re: GDT über Inline-Assembler
« am: 06. November 2008, 22:43 »
Ich hab die 2.2.2 und hab gerade gesehen, dass meine fpc.cfg tot ist (quasi leer), weiß der fuchs warum. Das wird's wohl sein, ich muss sie mal wiederherstellen.

edit: Schon lustig, fpc.cfg ist wieder da, jetz mag er die register nicht. Mit dem Label hat er kein problem, obwohl ich glaube, dass er es sich gar nicht anschaut. Ich werde wohl noch etwas herumprobieren müssen....

edit2: Habe doch wieder auf Intel Syntax zurückgeschalten, da einfacher und gewohnter. Labels müssen dann aber mit vorangestelltem '@' deklariert werden - manchmal ist es zum Haare ausraufen.
Jetz muss ich noch ein wenig Kleinkram fertig stellen und dann müsste es gehen. Ich bedanke mich nochmal vielmals für die Hilfe!
6
Lowlevel-Coding / Re: GDT über Inline-Assembler
« am: 06. November 2008, 20:48 »
hmmm... FPC mag das Label nicht. "Unknown Identifier "L1"" heißt es da im Compiler-Auswurf. Nun bin ich mir nicht ganz sicher, ob Labels irgendwie anders deklariert werden müssen... Das wäre aber sehr schräg...
7
Lowlevel-Coding / Re: GDT über Inline-Assembler
« am: 06. November 2008, 19:03 »
Ich bedanke mich erstmal für die Informationen. Ich bin gerade dabei einen entsprechenden Pascal Code zu schreiben. Bis jetzt ist mir auch Code-technisch alles klar bis auf eine Sache, wo es bei mir noch ein wenig hakt. Und dies wäre der Far Jump ins Code Segment, von dem ich keine Ahnung habe, wie ich ihn im Inline Assembler realisieren kann. Vielleicht kriege ich es ja noch von selbst raus, aber wenn jemand bescheid weiß, so würde ich natürlich gern die Erkenntnis teilen wollen^^

Vielen Dank nochmal,
grebaldi
8
Lowlevel-Coding / [Gelöst] GDT über Inline-Assembler
« am: 06. November 2008, 00:12 »
Guten Abend!

Ich habe mich beim Thema OSDev nun bis hin zum GDT durchgeforstet. Ich entwickle nebenbei einen kleinen Kernel in Pascal (dieses, weil ich mich in dieser Sprache am besten auskenne und ja nur OSDev lernen möchte und nicht gleich C). Der Kernel hat erstmal keinen weiteren Sinn, sondern soll mir helfen die Materie zu verstehen.

Als Bootloader verwende ich GRUB, welcher ja gleich den Protected Mode aktiviert und eine GDT schreibt. Diese muss nun überschrieben werden und dies wollte ich realisieren, indem ich innerhalb meines Pascal-Kernels Inline Assembler anwende.

Ich frage mich nun: Ist das überhaupt die richtige Phase der Ausführung, um das zu tun?

Und wenn ja: Wie sieht so ein ganz einfacher Code in Assembler aus, der einerseits den Null-Deskriptor+2 weitere Deskriptoren definiert und diese dann in eine neue GDT schreibt?

Die meisten Tutorials, die ich so gefunden habe beschäftigen sich mit der GDT nur in dem Zusammenhang, dass man sie schriebt, um dann in den Protected Mode zu springen. Bei der Verwendung von GRUB ist das allerdings schon geschehen...

Ich hoffe ich habe verständlich ausgedrückt, was mein Problem ist. Ich bedanke mich im Voraus für alle Antworten.

mfg, grebaldi
Seiten: [1]

Einloggen