1
Lowlevel-Coding / Re: IDT in C?
« am: 22. March 2007, 15:32 »
OK Than ks!
22. November 2024, 12:47
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.
void IDT
{
short int Limit;
int Base;
char IDT[255*8];
Limit=255*8;
Base=&IDT;
return
}
bits 16
jmp Start
GDT:
GDTSTRUC STRUC
Limit dw 24d
BaseAdr dw 10000h+Null_Deskriptor
GDTSTRUC ENDS
Null_Deskriptor:
Code_Deskriptor:
Stack_Deskriptor:
gdt_adr GDTSTRUC ?
Start:
cli
LGDT gdt_adr
mov eax,cr0
or eax,1 ; setzt PE-Bit (Bit 0)
mov cr0,eax
jmp 8h:Protected_Mode
bits 32
Protected_Mode:
jmp Protected_Mode
bits 16
jmp Start
GDT:
GDTSTRUC STRUC
Limit dw 24d
BaseAdr dw 10000h+Null_Deskriptor
GDTSTRUC ENDS
Null_Deskriptor:
Code_Deskriptor:
Stack_Deskriptor:
gdt_adr GDTSTRUC ?
Start:
LGDT gdt_adr
mov eax,cr0
or eax,1 ; setzt PE-Bit (Bit 0)
mov cr0,eax
jmp 8h:Protected_Mode
bits 32
Protected_Mode:
jmp Protected_Mode
org 0x7C00
bits 16
jmp Start
GDT:
GDTSTRUC STRUC
Limit dw 24d
BaseAdr dw ?
GDTSTRUC ENDS
Null_Deskriptor:
dw 0
dw 0
dw 0
dw 0
Code_Deskriptor:
Stack_Deskriptor:
gdt_adr GDTSTRUC ?
Start:
Adresse:
xor eax,eax
mov ax,seg Null_Deskriptor
shl eax,4
add ax,offset Null_Deskriptor
mov [gdt_adr.BaseAdr],eax
P Mode Einschalten:
LGDT gdt_adr
mov eax,cr0
or eax,1 ; setzt PE-Bit (Bit 0)
mov cr0,eax
db 0EAh
dw Protected_Mode
dw 1h
bits 32
Protected_Mode:
jmp Protected_Mode
Is nur das Grundgerüst, also last euch nicht stören, das da noch die Bootsektor Signatur und so weiter fehlen!
Zitat von: LegendGibt es noch andere freie, gute C++ Compiler ausser g++? Ich finde da nicht so viel ...
[Bits 16]
jmp start
NULL_DESCRIPTOR:
dd 0
dd 0
KERNEL_DESCRIPTOR:
dw 6FFFh
dw 1000h
db 0
db 98
db 40
db 0
DATEN_DESCRIPTOR:
dw 0x1FFF
dw 0x8000
db 0
db 96
db 40
db 0
GDT:
Limit dw 23
Base dd NULL_DESCRIPTOR+0x10000
start:
cli
lgdt [GDT]
mov eax, cr0
or eax, 1
mov cr0, eax
db 0eah
dw Protected_Mode_Test_Ausgabe_Viel
dw 8
[Bits 32]
Protected_Mode_Test_Ausgabe_Viel:
mov [0xB8000] , byte "A"
mov [0xB8001] , byte 7
jmp Protected_Mode_Test_Ausgabe_Viel
Zitat von: NoobtotalKernel: 1000-7FFF
edit: Ich würd keine feste Größe für den kernel erzwingen. (btw. du könntest ruhig angeben, dass die Angaben ist hex sind )Zitat von: NoobtotalFür jeden Bereich gibts einen passeneden Deskriptor.
Ich würd das nicht machen. Ich würd die Deskriptoren bei 0 beginnen lassen und bis zum ende des speichers gehen lassen. Dann brauchst nur 2 stück: einen dpl0 code und einen dpl0 data. Ich würd außerdem die GDT & IDT ins kerneldatensegment einbauen und nicht extra Platz irgendwo fest zu reservieren.