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

Seiten: 1 ... 3 4 [5] 6 7
81
OS-Design / In welcher Sprache codet ihr euren Kernel?
« am: 04. December 2005, 12:02 »
hi,
mein Kernel und die Treiber besteht komplett aus Pascal bzw. Delphi Language Code.
Dabei verwende ich aber auch keine Objekte sondern nur Strukturen, da sie für meine Zwecke vollkommen ausreichend sind und wenn man alles mit Objekte macht, würde der Speicherverbrauch nochmals ansteigen.

mfg,
stefan
82
Lowlevel-Coding / Ermittlung des Roots bei Festplatten
« am: 02. December 2005, 20:15 »
hi,
nein, Hidden Sectors sind die Anzahl der Sektoren, die vor der FAT Partition kommen. Ich glaube du hast da was mit ReservedSectors verwechselt  :D

Aus so einem FAT Whitepaper von Microsoft zu HiddenSectors:
"Count of hidden sectors precending the partition that contains this FAT volume [...] Should be zero on media that are not partitioned."
83
Lowlevel-Coding / Ermittlung des Roots bei Festplatten
« am: 01. December 2005, 21:45 »
hi,
bei den FAT Dateisystemen gibt es doch im ersten Sektor immer einen Wert namens "HiddenSector", der angibt, wieviele Sektoren auf der Festplatte noch vor der eigentlichen Partition liegen !

mfg,
stefan
84
hi,
wie kann ich rausfinden, ob an einem IDE-Kanal der Master und/oder der Slave von einem Laufwerk besetzt ist ?
Ob überhaupt ein Laufwerk an diesem IDE-Kanal hängt, kann man ja einfach testen, indem man einen Wert an die Ports schreibt und wieder ausließt !
Dann ist doch auf jeden Fall der Master belegt, da man doch nicht NUR den Slave belegen kann !?
Und wie kann ich dann rausfinden, ob auch der Slave belegt ist ?

mfg,
stefan
85
Lowlevel-Coding / Booten vom USB-Stick? Wer weiß was?
« am: 10. November 2005, 16:16 »
hi,
hier: http://www.mh-nexus.de/programs.htm gibts auch noch einen schicken Freeware Hex-Editor !

mfg,
stefan
86
Lowlevel-Coding / Prüfen, ob die gleiche Diskette verwendet wird
« am: 10. November 2005, 16:12 »
hi,
nein ich hab mir das irgendwie noch nicht genauer angeschaut, weil ich gerade was anderes bevorzuge  :lol:

aber mit folgendem Code krieg ich die Anzahl der Flobbys raus:

function DetectFloppyDrives: Byte;
var Floppys : Byte;
begin
  Outb($70,$10);
  Floppys := Inb($71);
  If (Floppys SHR 4) > 0 then Begin
    If (Floppys AND $0F) > 0 then Result := 2
    Else Result := 1;
  End
  Else Result := 0;
end;


mfg,
stefan
87
Lowlevel-Coding / Frage zu Bochs
« am: 07. November 2005, 20:16 »
hi,
ich weiss nicht ob du das oben im Code nur nicht hast oder verwendest du generell kein "[ORG 0x7C00]" ?????

mfg,
stefan
88
Lowlevel-Coding / Frage zu Bochs
« am: 07. November 2005, 14:45 »
eigentlich nur wenn du dich im Speicher über 1 MB befindest
89
Lowlevel-Coding / Frage zu Bochs
« am: 03. November 2005, 22:12 »
hi,
es könnte soeine Meldung kommen, wenn Bochs auf einen ungültigen befehl stößt oder wenn 16-Bit Code im 32-Bit Mode ausgeführt wird.
eventuell wird bei dir durch den Timer an irgendeine Adresse gesprungen.

mfg,
stefan
90
hi,
ich benutze ab dem Hauptkernel das gleiche Format wie in den Anwendungen (PE EXE). Bloß ein kleiner 16-Bit, 2.5 KB großer "Vor"-Kernel, der in den Grafikmodus schaltet hab ich als Flat Binary compiliert.

mfg,
stefan
91
Lowlevel-Coding / Maustreiber schreiben.
« am: 27. October 2005, 21:49 »
hi,
ja, wenn das erste Bit im Port $64 (KEYBOARD CONTROL) gesetzt ist, dann kann man vom port $60 das Byte einlesen.

mfg,
stefan
92
Lowlevel-Coding / Maustreiber schreiben.
« am: 27. October 2005, 18:42 »
hi,
in der Tat, ich hab mir das initialisieren der Maus ein wenig einfacher gemacht  :)

das für Bochs heißt, dass diese zeile nur ausgeführt wird, wenn das OS auf Bochs läuft -> bei meiner Bochs Version würde es ohne dieser zeile nicht laufen. Mit dieser Zeile würde es zwar in Bochs laufen, aber nicht mehr auf nem echten PC  :D

mfg,
stefan2005
93
Lowlevel-Coding / Maustreiber schreiben.
« am: 27. October 2005, 16:39 »
hi,
klar, ist jedoch Delphi Code, sollte aber leicht zu verstehen sein, da viel Assembler drin vorkommt.


procedure InitMouse;
var InByte : Byte;
begin
  kbCmd($A8);
  kbRead;
  kbCmd($20);
  InByte := kbRead OR $3;
  kbCmd($60);
  If Inb($E9) = $E9 then kbWrite(InByte);   // Für Bochs
  kbCmd($D4);
  kbWrite($F4);
  kbRead;
end;

procedure kbWrite(Cmd: Byte);
asm
  @Init:
    pushad
    mov dl,al
    mov ecx,$ffff

  @kw_loop1:
    in al,$64
    test al,$20
    jz @kw_ok1
    loop @kw_loop1
    mov ah,1
    jmp @kw_exit
  @kw_ok1:
    in al,$60
    mov ecx,$ffff
  @kw_loop:
    in al,$64
    test al,2
    jz @kw_ok
    loop @kw_loop
    mov ah,1
    jmp @kw_exit
  @kw_ok:
    mov al,dl
    out $60,al
    mov ecx,$ffff
  @kw_loop3:
    in  al,$64
    test al,2
    jz  @kw_ok3
    loop @kw_loop3
    mov ah,1
    jmp @kw_exit
  @kw_ok3:
    mov ah,8
  @kw_loop4:
    mov ecx,$ffff
  @kw_loop5:
    in al,$64
    test al,1
    jnz @kw_ok4
    loop @kw_loop5
    dec ah
    jnz @kw_loop4
  @kw_ok4:
    xor ah,ah
  @kw_exit:
    popad
end;

function kbRead: Byte;
asm
  @Init:
    push ecx
    push edx
    mov ecx,$ffff
  @kr_loop:
    in al,$64
    test al,1
    jnz @kr_ready
    loop @kr_loop
    mov ah,1
    jmp @kr_exit
  @kr_ready:
    push ecx
    mov ecx,32
  @kr_delay:
    loop @kr_delay
    pop ecx
    in al,$60
    xor ah,ah
  @kr_exit:
    pop edx
    pop ecx
end;

procedure kbCmd(Cmd: Byte);
asm
  @Init:
    mov ecx,$ffff
    push eax
  @c_wait:
    in al,$64
    test al,2
    jz @c_send
    loop @c_wait
    jmp @c_error
  @c_send:
    pop eax
    out $64,al
    mov ecx,$ffff
  @c_accept:
    in al,$64
    test al,2
    jz @c_ok
    loop @c_accept
  @c_error:
    mov ah,1
    jmp @c_exit
  @c_ok:
    xor ah,ah
  @c_exit:
end;

procedure IRQ12_ASM; assembler;
asm
  pushad
  call IRQ12
  popad
  iretd
end;



mfg,
stefan
94
Lowlevel-Coding / Maustreiber schreiben.
« am: 25. October 2005, 21:18 »
hi,
wenn der IRQ12 aufgerufen wird, dann musst du mittels IN 3 mal ein Byte vom Port einlesen.
Das erste Byte enthält Informationen über die Maustasten (Bit 1 = linke Maustaste, Bit 2 = rechte, Bit 3 = mittlere, glaub ich, notfalls durch ausprobieren rauskriegen :), wenn Bit gesetzt, dann ist die Maustaste gedrückt )
Das zweite Byte gibt als signed int 8 die Veränderung auf der X-Achse
und das dritte die veränderung auf der y-Achse an.

(hab vor paar minuten selbst erst meinen Maustreiber vollendet :D)

mfg,
Stefan2005
95
Lowlevel-Coding / Fragen zum Protected-Mode
« am: 25. October 2005, 21:13 »
hi,
zu 1.)
fast so wie im RealMode: in SS den Selektor speichern, der auf das Stacksegment (oder das Datensegment) im Deskriptor zeigt und in ESP die Offset-Adresse des Stacks speichern

zu 2.)
immer um 8 !
Null-Deskriptor = 0,
1. Deskriptor = 8,
...

mfg,
stefan2005
96
Lowlevel-Coding / Timer Interrupt
« am: 23. October 2005, 15:48 »
hi,
ok, hier die wichtigsten Funktionen meiner IDT.
"InitIDT" rufe ich erst auf, nachdem ich in den PMode geschalten hab.
ist jedoch in Delphi Langauge bzw halt Pascal geschrieben, sollte aber verständlich sein :)


type
  TIDTR = packed record
    Limit : Word;
    BaseAddr : Cardinal;
  end;
  TIDT = packed record
    Offset_Low : Word;
    Segment : Word;
    Attributes : Word;
    Offset_High : Word;
  end;

var IDTR : ^TIDTR = Pointer($B000);
    gIDT : Array of TIDT = Pointer($B006);

procedure InitIDT;
begin
  IDTR.Limit := 256*SizeOf(TIDT)-1;
  IDTR.BaseAddr := $B006;
  asm
    lidt [$B000]
  end;
end;

procedure RegisterIDTEntry(IntNumber: Word;ProcPointer: Pointer;DPL: Cardinal);
var Attributes : Word;
begin
  If DPL = 0 then Attributes := $8E00
  Else If DPL = 1 then Attributes := $AE00
  Else If DPL = 2 then Attributes := $CE00
  Else Attributes := $EE00;
  gIDT[IntNumber].Offset_Low := (Integer(ProcPointer) AND $FFFF);
  gIDT[IntNumber].Offset_High := (Integer(ProcPointer) SHR 16);
  gIDT[IntNumber].Segment := $8;
  gIDT[IntNumber].Attributes := Attributes;
end;

Wenn du noch Fragen hast, auch bzg. des Codes kannst du sie ruhig stellen.

cu,
stefan2005
97
Lowlevel-Coding / Modus mit Ports setzten
« am: 22. October 2005, 22:27 »
hi,
ja der Code kann je nach Bios variieren, aber eigentlich sollte jeder VESA code auf jedem Mainboard lauffähig sein, weil VESA ja eigentlich die Grafikkarte hauptsächlich anspricht und auf jedem Mainboard jede Grafikkarte funzt  :)

wenn ich mal zeit hab kann ich es ja mal ausprobieren  :D

cu,
stefan2005
98
Lowlevel-Coding / Noch mehr Paging-Fragen
« am: 22. October 2005, 22:14 »
hi,
klar, die Stackversion ist einfach zu realisieren aber wenn man nicht nur 4 KB Pages verteilen will ist diese Variante die schlechteste  :)

Ich benutze die Stackvariante in der physikalischen Speicherverwaltung, die oben angesprochenen Arrays in der virtuellen Speicherverwaltung.

cu,
stefan2005
99
Lowlevel-Coding / Page-Cache löschen
« am: 22. October 2005, 22:09 »
hi,
also wenn man das cr3-Register ändert, dann wird der TBL gelöscht (was deshalb auch bei einem taskswitch der Fall ist).
notfalls mit:
mov eax,cr3
mov cr3,eax

außerdem müsste man den Buffer auch in den PageTableEntries abschalten können oder eventuell eine Buffercontrolle im cr0 Register.

soweit ich mich erinnern kann gibt es für das löschen vom TBL auch Assemblerbefehle aka "INVD" oder für einzelne Pages "INVLPG".

cu,
stefan2005
100
Lowlevel-Coding / Modus mit Ports setzten
« am: 22. October 2005, 21:19 »
hi,
Es gibt afaik einige hardwarebeschleunigte Funktionen, u.a. auch Auflösung ändern ect... im Linux Kernel Code zu ATI,nVidia,... Grakas, aber ich weiss nicht, inwiefern das funktioniert...

der VESA Mode wird ja auch mittels INT 0x10 initialisiert. Kann man dann nicht einfach den Quellcode des INT 0x10 vom Bios auslesen und auf 32-Bit portieren ?

cu,
stefan2005
Seiten: 1 ... 3 4 [5] 6 7

Einloggen