Autor Thema: HDD Tutorial  (Gelesen 6663 mal)

Masen

  • Beiträge: 31
    • Profil anzeigen
Gespeichert
« am: 15. September 2005, 17:58 »
Hi,

brauche unbedingt gute Tuts für HDD Treiber programmierung !!

danke im voraus ^^

[MM]

  • Beiträge: 130
    • Profil anzeigen
    • www.mmcoding.eu
Gespeichert
« Antwort #1 am: 15. September 2005, 18:54 »
Probiers mal mit diesem hier:
http://www.karig.net/os/001f.html

MM

Masen

  • Beiträge: 31
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 15. September 2005, 19:01 »
danke, aber ich hät vieleicht dazu sagen sollen das ich das für einen C-Kernel bräuchte deswegen einige C Beispiele ^^

Roshl

  • Beiträge: 1 128
    • Profil anzeigen
    • http://www.lowlevel.net.tc
Gespeichert
« Antwort #3 am: 16. September 2005, 15:49 »
Um die HDD anzusprechen muss man allerdings mit ports hantieren, da kommt man um asm nicht herum (und sei es indem man sich inb und outb funktionen in C definiert).
Ich hatte mal funktionierenden Code dafür, hatte ähnlichkeiten mit dem auf der genannten Seite (hab nur kurz draufgeschaut) sollte doch machbar sein daraus was zu machen, einfach Asm in C übertragen^^
[schild=1]Wieder ein wertvoller(?) Beitrag von Roshl[/schild]

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 16. September 2005, 17:12 »
Auf www.todo-online.de.vu gibts ja eine Beschreibung aller Ports. Ansonsten ist es ziemlich einfach, mein HDD-Treiber besteht (inkl. Kommentare) aus weniger als 100 Zeilen. Wenn ihn jemand braucht kann ich ihn ja posten.

Masen

  • Beiträge: 31
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 16. September 2005, 17:52 »
joa danke wär nett ^^

WhiteDragon

  • Beiträge: 124
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 16. September 2005, 18:05 »
Ja, bitte, ich würde ihn mir auch gerne anschauen!

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 17. September 2005, 12:44 »
Also: Das ganze ist nichts für ein Multitasking-OS, da ich kein DMA verwende:

Einen Sektor lesen:

BOOL hdddrv_read_sector(unsigned int sector, unsigned short *buffer, unsigned int drive) {
int i;

while((inport(0x1f7) & 0x80) == 0x80); /* Solange warten bis Laufwerk bereit ist */

/* Beinhaltet das Laufwerk, die Upperbits des Sektors und versetzt das Laufwerk in den LBA Mode */
outport(0x1f6, 0x40 | (drive << 4) | ((sector >> 24) & 0x0F));
outport(0x1f2, 1); /* Anzahl der zu lesenden Sektoren (erstmal nur einer) */
outport(0x1f3, sector & 0xFF); /* Sektor Nummer, Lower Byte */
outport(0x1f4, (sector >> 8) & 0xFF); /* Sektor Nummer, Middle Byte */
outport(0x1f5, (sector >> 16) & 0xFF); /* Sektor Nummer, N�hstes Byte*/
outport(0x1f7, 0x20); /* Befehl: Lesen!!! */
while((inport(0x1f7) & 0x80) == 0x80); /* Warten bis der Befehl ausgefhrt wurde */
while((inport(0x1f7) & 0x0F) != 8); /* Warten bis das Laufwerk bereit ist Bytes zu senden */

/* Byte fr Byte holen */
for(i=0;i<=256;i++)
buffer[i] = inportw(0x1f0);

/* Fehler aufgetreten? */
if(inport(0x1f1)){
return FALSE;
}

/* Alles ok */
return TRUE;
}


Einen Sektor schreiben:

BOOL hdddrv_write_sector(unsigned int sector, unsigned short *buffer, unsigned int drive) {
int i;

while((inport(0x1f7) & 0x80) == 0x80); /* Solange warten bis Laufwerk bereit ist */

/* Beinhaltet das Laufwerk, die Upperbits des Sektors und versetzt das Laufwerk in den LBA Mode */
outport(0x1f6, 0x40 | (drive << 4) | ((sector >> 24) & 0x0F));
outport(0x1f2, 1); /* Anzahl der zu lesenden Sektoren (erstmal nur einer) */
outport(0x1f3, sector & 0xFF); /* Sektor Nummer, Lower Byte */
outport(0x1f4, (sector >> 8) & 0xFF); /* Sektor Nummer, Middle Byte */
outport(0x1f5, (sector >> 16) & 0xFF); /* Sektor Nummer, N�hstes Byte*/
outport(0x1f7, 0x30); /* Befehl: Schreiben!!! */
while((inport(0x1f7) & 0x80) == 0x80); /* Warten bis der Befehl ausgefhrt wurde */
while((inport(0x1f7) & 0x0F) != 8); /* Warten bis das Laufwerk bereit ist Bytes zu senden */

/* Byte fr Byte senden */
for(i=0;i<=256;i++)
outportw(0x1f0, buffer[i]);

/* Alles ok */
return TRUE;
}

 

Einloggen