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.


Themen - Homix

Seiten: [1]
1
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
2
hi,
ist es möglich, dass man herausbekommt, ob im Vergleich zu vorhin eine andere Diskette im Diskettenlauferk ist oder nicht ?

ich möchte nämlich einen kleinen Sektorenbuffer in meinen Floppytreiber einfachen, aber wenn die Diskette gewechselt wird muss der Buffer ja gelöscht werden.

(2. wie kann man rausfinden, welche Eigenschaften (Heads, Cylinders, Sektoren,...) die Diskette hat ? )

cu,
stefan2005
3
Lowlevel-Coding / FDC Treiber läuft nur unter Bochs
« am: 06. May 2005, 22:16 »
hi,
ich hab heute mal angefangen, einen kleinen Diskettentreiber zu schreiben (und so klein wie möglich zu halten).
Folgender Code funktioniert NUR mit Bochs, aber nicht auf einem Real-PC !
wieso ?
auf dem Real-PC hat es den Anschein, dass er zwar den Floppy-Motor ein und ausschalten kann, aber er keine Sektoren ließt, was unter Bochs aber prima funktioniert, aber wieso ?
Beim Real-PC hängt er sich auch nicht auf, sonder es sind einfach keine (richtigen) Daten im Buffer.


void SendCommand(unsigned char _byte)
{
while((inb(0x3F4) & 128) != 128) ;           // warte, bis neue Befehle gesendet werden können
outb(0x3F5,_byte);
}

void MotorOn()
{
outb(0x3F2,28); // Enable Motor
Wait(500);
}

void MotorOff()
{
outb(0x3F2,0); // Disable Motor
}

void ReadSector(unsigned int _Sektor)
{
MotorOn();
ProgramDMA2();
SendCommand(0xE6); // ReadSector Command
SendCommand(0x00 | (FDC_LSNToHead(_Sektor) << 2)); // Head 0 , Drive 0
SendCommand(FDC_LSNToCylinder(_Sektor)); // Cylinder 0
SendCommand(FDC_LSNToHead(_Sektor)); // Head 0
SendCommand(FDC_LSNToSector(_Sektor)); // Sektor 0
SendCommand(0x02); // 512 Byte Sektor
SendCommand(0x12); // Sectors per Track
SendCommand(0x1B); // 3.5" Floppy
SendCommand(0x00);
WaitForIRQ06();
MotorOff();
}

void ProgramDMA2()
{
outb(0x08,0x14); // Disable DMA Controller
outb(0x0B,0x56); // Uses Channel 2
outb(0x0C,0x00); // Reset Flip-Flop
outb(0x04,(uint)Buffer & 0xFF); // Low Byte
outb(0x04,((uint)Buffer >> 8) & 0xFF); // High Byte
outb(0x81,((uint)Buffer >> 16) & 0xFF); // Page
outb(0x0C,0x00); // Reset Flip-Flop
outb(0x05,0xFF); // 1 Sektor (512 Byte)
outb(0x05,0x01);
outb(0x0A,0x02); // Release Channel
outb(0x08,0x10); // Enable DMA
}


cu,
stefan2005
4
Lowlevel-Coding / Von Ring 0 in Ring 3 wechseln !?
« am: 24. March 2005, 18:59 »
hi,
ich dachte eigentlich, dass man von Ring 0 in Ring 3 normalerweise leicht wechseln könnte.
jetzt hab ich neben cs_kernel ds_kernel (beide Ring 0) noch ein cs_user und ds_user mit DPL Ring 3 erstellt und in deren Selektoren auch ein PL von 3 eingestellt.
wenn ich nun einen FarJump (jmp cs_user:UserCode) machen will, kommt die Bochs-Meldung "RPL > CPL" !
ich dachte, dass man vielleicht noch vorher den Stack in den Ring 3 schalten muss, aber dann kommt ein INT13 und wenn ich es nach dem Jump machen will ist es dann schon zu spät !

was mache ich da falsch und wie könnte ich das beheben ?

cu,
stefan2005
5
OS-Design / Wie Windows arbeitet ...
« am: 14. March 2005, 19:57 »
hi,
ich wollt mal fragen, ob ihr wisst wie Windows so arbeitet oder dazu Dokus, Tutorials, Texte, usw.. habt ?
ich würd gerne mir mal so nen groben Überblick schaffen, wie Windows es realisiert (gewisse probleme ect ...).
auch wäre das .EXE PE Format oder Treiber interesant !

cu,
stefan2005
6
Lowlevel-Coding / Booten von Festplatte
« am: 14. March 2005, 19:22 »
hi,
mal so ne kleine Frage zum Booten von Festplatte:
im MBR gibt es ja mehrere Partitionen !
wenn man 2 Betriebssysteme auf Partition A und Partition B hat:
wie kriegt dann der Bootloader vom 2ten Betriebssystem auf Partition B heraus, DASS sein OS auf Partition B liegt und nicht auf A oder gar auf erweiternden Partitionen liegt und von welcher Partition es Dateien ect laden muss ?

cu,
stefan2005
7
Lowlevel-Coding / Festplattenpartionierung und -bootsektoren
« am: 18. February 2005, 15:07 »
hi,
ich will auch mal versuchen mein OS bootfähig auf eine alte Festplatte zu kopieren.
Soweit ich weiss steht im ersten Sektor von einer Festplatte der Bootsektor (wie bei Disketten halt auch) und eine Partionstabelle von 4 Einträgen (4 oder ? sind dann max. 4 Partionen auf einer Festplatte mglich ?).
Aber die verschiedenen Partionen haben ja auch alle nochmal einen ersten Sektor.
Steht da nochmal ein anderer Bootsektor drin ? z.B. auch noch Dateisysteminformationen ?
oder wie ist da der genaue Aufbau ?
und wie funktioniert das, wenn man mehrere Betriebssysteme pararell auf seinem System laufen lassen will ?

ich hoffe ihr könnt mir bisschen was zu diesen Fragen erklären oder mir auch gute Links geben !
bin für jede Hilfe dankbar !

cu,
stefan2005
8
Lowlevel-Coding / Frage zu Dataselektor DS
« am: 15. February 2005, 13:02 »
hi,
ich beschäftige mich noch nicht so lange mit OS Development und hab nun folgende Frage:

Bei einem Sprung zu meinem Kernel (bei 1 MB (0x100000) geladen) führe ich einen Far-Jump aus:

jmp codesel_kernel:0x0          ; springt zum Kernel

Im Kernel kann ich dann ganz normal Funktionen, ect. aufrufen.

aber wie ist das bei Daten/Variablen ?

wenn ich das Dataregister mit datasel_kernel fülle kann ich nicht mit im Kernel definierte Variablen zugreifen !

mov ax,datasel_kernel
mov ds,ax


und im Kernel:

mov ah,[MYBYTE]
jmp $
MYBYTE db 0

Hier wird in das Register ah nicht der Wert von MYBYTE reingeschrieben sondern irgendein anderer Wert !

Übrigens mein datasel_kernel ist wie folgt definiert:

   dw 0xFFF0 ; Segmentgröße 0..15
   dw 0x0000 ; Segmentadresse 0..15
   db 0x00 ; Segmentadresse 16..23
   db 0x92 ; Zugriffsberechtigung und Typ
   db 0xCF ; Zusatzinformationen und Segmentgröße 16...19
   db 0x00 ; Segmentadresse 24..31


Wo liegt der Fehler ?
Seiten: [1]

Einloggen