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 - N43

Seiten: [1]
1
Lowlevel-Coding / IDT
« am: 16. December 2005, 16:56 »
Hallo,

den Code habe ich ans erste MB gelinkt, starte dann das System auch mit der Basisadresse 0. Nachdem ich Paging aktiviert habe lade ich die GDT neu.

Die Adressen muessten eigentlich richtig vom Linker berechnet werden und an den Offsets aendert sich ja nichts, wenn ich die ersten 4MB des physischen Speichers ans 3GB mappe und den Deskriptor entsprechend anpasse.

N43
2
Lowlevel-Coding / IDT
« am: 16. December 2005, 14:50 »
Hallo,

mein Kernel befindet sich im Protected Mode und Paging ist aktiv. Das laden der IDT funktioiert auch, jedoch greift er beim Aufruf eines Interrupts auf den falschen Speicherbereich zu.

Der Segmentdeskriptor hat die Basisadresse 0xC0000000, die ersten 4MB des physikalen Speichers habe ich an diese Stelle gemapped. Sobald ich die ersten 4MB auch an die ersten 4MB des virtuellen Speichers mappe funktionieren die Interrupts.

Mit dem folgendem Code richte ich einen Interrupt ein.void setup_int(short number, void (*handler)(), char debug)
{
unsigned long offset = (unsigned long) handler;

unsigned short selector;
asm volatile("movw %%cs, %0" : "=g"(selector));

// set actual values of int
idt[number].low_offset   = (offset & 0xFFFF);
idt[number].selector     = selector;
idt[number].settings     = 0x8E00;
idt[number].high_offset  = (offset >> 16);

if (debug)
{
ltoh(selector); k_printf("\n");
ltoh(offset); k_printf("\n");
ltoh(idt[number].low_offset); k_printf("\n");
ltoh(idt[number].high_offset); k_printf("\n");
}

}


Wenn ich mir die Werte mittels dem debug-Flag ausgeben lasse, stimmen sie alle.

Woran könnte es liegen, dass die Basisadresse des Deskriptors nicht berücksichtigt wird?

N43
3
Lowlevel-Coding / Fehler bei Textausgabe durch Bochs...
« am: 10. December 2005, 12:34 »
Hallo,

der Bytecode von msg wird auch ausgeführt. Um das zu verhindern musst du nach call putstrhang:
   jmp hang
einfügen.


N43
4
Lowlevel-Coding / C Übergang
« am: 05. December 2005, 22:32 »
Hallo,

muss es im Linker-Script nicht .text 0x10200 : {heißen?


N43
5
Lowlevel-Coding / near jump im Protected Mode
« am: 28. November 2005, 18:49 »
Hallo,

ich habe den Fehler gefunden, hatte im Bootloader den nächsten Cluster falsch ermittelt. Ab dem 512 Byte hatte ich also nur noch Mist geladen.

Bzw. jump wird doch, wenn ich die Adresse direkt angebe, relativ zur aktuellen Adresse ausgeführt, oder?


N43
6
Lowlevel-Coding / near jump im Protected Mode
« am: 27. November 2005, 22:12 »
Hallo,

mit dem folgenden Code wechsel ich in den Protected Mode, nach END beginnt der Kernel. Der Kernel wird an die Datei angehängt.

[BITS 16]

JMP BEGIN


gdt_begin:

sd_null:
DD 0
DD 0

sd_code:
dw 0xFFFF
dw 0
db 0
db 0x9A
db 0xCF
db 0

sd_data:
dw 0xFFFF
dw 0
db 0
db 0x92
db 0xCF
db 0

gdt_end:

gdt:
.Limit dw (gdt_end - gdt_begin - 1)
.Base dd 0

code_desc equ sd_code-gdt_begin
data_desc equ sd_data-gdt_begin

BEGIN:

cli

mov eax, cs
mov ds, eax

shl eax, 4
add eax, gdt_begin
mov [gdt.Base], eax


lgdt[gdt]

mov eax, cr0
or eax, 1
mov cr0, eax

jmp 0x0008:DWord (0x10000 + PMODE)

[Bits 32]

PMODE:

mov eax, data_desc
mov ds, eax
mov es, eax
mov fs, eax
mov gs, eax
mov ss, eax
mov esp, 0x90000

jmp END

times 0x100-($-$$) db 0

END:



Wie gesagt, so funktioniert der Code, wenn ich aber auf 0x200 Bytes auffülle nicht mehr. Die Speicheradressen im Linkerscript hatte ich entsprechend angepasst.
7
Lowlevel-Coding / near jump im Protected Mode
« am: 27. November 2005, 17:10 »
Hallo,

habe gerade nochmal im generierten Bytecode nachgeschaut, der generiert auch mit der funktionierenden Variante einen near jump.

Mit folgendem Code funktioniert das ganze.

jmp END

times 0x100-($-$$) db 0

END:


Wenn ich aber statt auf 0x100 Byte auf 0x200 Byte auffülle funktioniert das ganze nicht mehr.
8
Lowlevel-Coding / near jump im Protected Mode
« am: 27. November 2005, 16:38 »
Hallo,

wenn ich einen near jump im Protected Mode ausführen möchte, bleibt das System stehen. Bochs gibt mir auch keine Fehlermeldung.

Woran könnte das liegen?

Danke schonmal für die Antworten.


N43
Seiten: [1]

Einloggen