Natürlich wie willst du sonst nen Tastaturtreiber schreiben oder nen FDC treiber?
Das Programm muss dann aber im Ring0 laufen^^
Das Programm muss dann aber im Ring0 laufen^^
09. November 2026, 18:25
und eventuell noch Ring1 (oder?) da dieser ja oft für Treiber benutzt wird, aber das weiß ich auch nicht so genau, so das ALLE Programme auf die ports zugreifen können ist es jedenfalls nur im RM soweit ich weiß
Ich gehe gleich testenAnsich können aber doch auch Ring3 Programme auf Ports zugreifen, man errinnere sich an Windows 98. Aber man kann in der TSS direkt angeben, auf welche Ports der Prozess zugreifen kann. Hab habe keine Ahnung, ob ohne TSS direkt alle Ports gesperrt sind oder nicht.
MfG GhostCoder
) und so
dd gdt

[BITS 16] ;16 Bit Code erstellen
jmp start ;GDT überspringen
NULL_Desc:
dd 0
dd 0
CODE_Desc:
dw 0xFFFF ;Segmentgröße Byte 0/1
dw 0 ;Segmentbasisadresse Byte 0/1
db 0 ;Segmentbasisadresse Byte 2
db 10011010b ;Zugriffsberechtigungen
db 11001111b ;Zusatz + Segmentgröße Bits 16 - 19
db 0 ;Segmentbasisadresse Byte 3
DATA_Desc:
dw 0xFFFF
dw 0
db 0
db 0x92
db 0xCF
db 0
gdt:
Limit dw 0 ;Größe der GDT (wird später eingetragen)
Base dd 0 ;Adresse der GDT (wird später eingetragen)
start:
cli ;Interrupts ausschalten
mov eax, cs ;EAX auf derzeitiges Codesegment setzen
mov ds, ax ;DS auf Codesegment setzen
shl eax, 4 ;EAX mit 16 multiplizieren (Lineare Adresse
;des Codesegments errechnen)
mov [CODE_Desc+2], ax ;Lineare Adresse des Codesegmentes als
mov [DATA_Desc+2], ax ;Startadresse des Code- und Datendeskriptors
shr eax, 16 ;eintragen
mov [CODE_Desc+4], al
mov [DATA_Desc+4], al
mov eax, cs ;Startadresse der GDT errechnen
shl eax, 4
add eax, NULL_Desc
mov [Base], eax ;Startadresse der GDT eintragen
mov [Limit], WORD gdt - NULL_Desc -1 ;Größe der GDT errechnen und eintragen
lgdt [gdt] ;GDT laden
mov eax, cr0 ;In den Protected Mode schalten,
or eax, 1 ;indem Bit 0 des CR0 Registers auf 1
mov cr0, eax ;gesetzt wird
db 0xea ;FAR-JUMP zum Codesegment
dw PMODE
dw 0x8
[BITS 32] ;32 Bit Code erstellen
PMODE:
mov WORD [CODE_Desc+2], 0 ;Code Segmentstartaddresse auf 0 setzen
mov WORD [DATA_Desc+2], 0 ;Daten Segmentstartadresse auf 0 setzen
mov BYTE [CODE_Desc+4], 0 ;Code Segmentstartaddresse auf 0 setzen
mov BYTE [DATA_Desc+4], 0 ;Daten Segmentstartadresse auf 0 setzen
mov eax, 2 ;Selektor für das Datensegment erstellen
shl eax, 3
mov ds, ax ;Daten- Stack- und Extrasegment mit
mov ss, ax ;Datensegmentdeskriptor laden
mov es, ax
mov eax, 0 ;FS und GS mit Null-Deskriptor laden
mov fs, ax
mov gs, ax
mov esp, 0x1FFFFF ;Stack auf unterhalb der 2 MB Grenze setzen
jmp 0x8:0x10000 + PMODE2 ;Sprung in das "neue" Codesegment
PMODE2:
jmp PMODE2

das
dd gdt
ist auch korrekt. das dd bedeutet DoubleWord.
der assembler macht da auf jeden fall eine 32 bit zahl hin.
mov eax, cs ;Startadresse der GDT errechnen
shl eax, 4
add eax, NULL_Desc
mov [Base], eax ;Startadresse der GDT eintragen
)
org 0x7C00
start:
cli ; Stack
mov ax, 0x9000 ; Stackadresse
mov ss, ax
mov sp, 0
sti
mov [BootDrive], dl ; Bootlaufwerk speichern
call LoadKernel ; Kernel laden
; Kernel ausfuehren
mov ax, 0x1000 ; Adresse des Kernels
mov es, ax ; Segmentregister updaten
mov ds, ax
push ax
mov ax, 0
push ax
mov dl, [BootDrive]
retf
;--------------------------------------
; Funktionen & Variablen
;--------------------------------------
BootDrive db 0
LoadMsg db "Loading Genesis...", 13, 10, 0
; Druckt eine Zeichenkette.
; Parameter: Zeichenkette in si
PutStr:
lodsb
or al, al
jz short putstrd ; \0 ?
mov ah, 0x0E ; Funktion
mov bx, 0x0014 ; Attribut
int 0x10
jmp PutStr
putstrd:
retn
; Laedt den Kernel.
LoadKernel:
push ds ; Diskdrive reseten
mov ax, 0 ; Funktion
mov dl, [BootDrive]
int 13h
pop ds
jc LoadKernel
Load1:
mov ax, 0x1000 ; ES:BX = 10000
mov es, ax
mov bx, 0
; Sektoren lesen
mov ah, 2 ; Funktion
mov al, 5 ; Anzahl der Sektoren
mov cx, 2 ; Cylinder 0 Sektor 2
mov dx, 0 ; Head & Laufwerk 0
int 13h ; ES:BX Daten vom Laufwerk
jc Load1
mov si, LoadMsg
call PutStr
retn
times 512-($-$$)-2 db 0 ; Bootsignatur
dw 0x0AA55
org 0x1000
mov al, 0x50
mov ah, 0x0E
mov bx, 0x0014
int 0x10
xor ah, ah
int 0x16
;*************************************
org 0x1000
bits 16
;*************************************
mov ax, cs
mov ds, ax
cli
lgdt [gdt_p]
mov eax, cr0
or al, 00000001b
mov cr0, eax
jmp 0x0008:pmode
;*************************************
bits 32
;*************************************
pmode:
mov ax, 0x0010
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
mov esp, 0x001FFFFF
mov edi, 0x000B8000
mov Byte [edi ], 'L'
mov Byte [edi+2], 'O'
mov Byte [edi+4], 'W'
hang:
jmp hang
;*************************************
gdt dw 0x0000
dw 0x0000
db 0x00
db 0x00
db 0x00
db 0x00
dw 0xFFFF
dw 0x0000
db 0x00
db 0x9A
db 0xCF
db 0x00
dw 0xFFFF
dw 0x0000
db 0x00
db 0x92
db 0xCF
db 0x00
;*************************************
gdt_p dw 23
dd gdt
;*************************************
