Autor Thema: genaue groesse einer diskette  (Gelesen 6259 mal)

noob

  • Beiträge: 63
    • Profil anzeigen
Gespeichert
« am: 22. March 2006, 16:10 »
hi ich hab ne kleine frage und zwar will ich nun en file system hochziehen fuer mein os und das soll am ende der diskette anfangen! nun muesste ich genau wissen wieviel blocks und wie viel bytes eine diskette genau gross ist!

danke
mfg noob

Osbios

  • Beiträge: 247
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 22. March 2006, 16:25 »
Es gibt unterschiedliche Diskettengrößen. Die am meisten verbreitete ist die 1440 KiB Diskette. Ansonsten gibt es noch sehr selten 720 KiB zu sehen. Andere Formate sind IMO in unseren Breitengraden nicht mehr zu finden.

1440 KiB = 1474560 Byte

1474560 Byte / 512 = 2880 Sektoren

Warum willst du eigentlich am Ende der Diskette anfangen?
db 0x55AA

noob

  • Beiträge: 63
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 22. March 2006, 19:33 »
ich fang deswegen hinten an weil vorne kernel und bootloader sind!

kennt irgendjemand ne gute seite wo disketten beschrieben werden? oder vl kann mir mal kurz einer von euch helfen:

waenn ich in den letzten sector schreiben will auf welcher spur liegt der? dass muss man ja auch wissen! dann wie siet das mit den sektornummern aus? hat da jeder sektor in der spur seine nummer oder sind die sektoren sowieso nummeriert aber was bringt sich dann die spur? und was muss ich bei der seite/kopf einstellen? und was bedeuted CHS mode?

danke
noob

nore

  • Beiträge: 76
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 22. March 2006, 21:09 »
zunächst einmal: benutz doch eine zweite diskette. ;-)

zu chs: die diskette hat zwei heads. das sind glaub ich ober und unterseite. diese heads sind dann in tracks (spuren) eingeteilt und diese wiederum in sektoren. zwei tracks an der gleichen stelle, jedoch auf verschiedenen heads (zum beispiel track 3 von head 0 und track 3 von head 1) werden zu einem zylinder zusammengefasst.
ein track hat im normalfall 18 sektoren. da es insgesamt 2880 sektoren gibt, gibt es 160 tracks, 80 auf jedem head und somit 80 zylinder.

wir können also einen sektor mit cylinder(0-79), head(0-1) und sector(1-18) adressieren.

die andere möglichkeit der adressierung ist die logische sektornummer. hier werden einfach alle sektoren durchnumeriert. dabei fängt man bei cylinder 0, head 0 an. nach den 18 sektoren dieses tracks kommen die 18 sektoren von cylinder 0, head 1, danach cylinder 1, head 0 usw.


ich weiß, das ist teilweise etwas schlecht ausgedrückt, aber ich wollte schomal erste hilfe leisten. ;-)

normalerweise gibt es ein schönes tutorial über chs und lsn auf der lowlevel seite, aber die tutorials sind zurzeit nicht verfügbar. in dem tutorial stehen unter anderem folgende schöne formeln zur umwandlung von logischer sektornummer in cylinder head sector format:

cylinder = lsn / 36
head     = (lsn / 18) % 2
sector   = (lsn % 18) +1

hierbei ist  / eine ganzzahldivision ohne rest und % der modulo-operator (also de rest bei einer ganzzahldivision)

ich hoffe, ich konnte ein wenig helfen.

cu
  nore

noob

  • Beiträge: 63
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 23. March 2006, 18:56 »
hi danke erstmal fuer deine antwort!

jetzt hab ich auch gleich noch eine frage:

ich hab mir ne methode geschrieben die sectoren lesen soll:

int readSectors(char *buffer,int head, int track, int startSector, int anz){
    bx = (short)buffer;
    dl = DRIVE;                  /*drive number 0 == floppy*/
    al = anz;                    /*number of sectors to read*/
    ch = track;                  /*track number*/
    dh = head;                   /*head number*/
   
    asm{
        mov ah, 0x2;
        int   0x13
        setc  bx
    }
   
    return bx;
}


aufgerufen hab ich diese so:
readSectors(buffer, 1, 79, 17, 1); <<--- das muesste eigentlich der letzte sector sein !!
nur waenn ich mein os dann boot hoer ich nur ein sumsen und dann tut sich nichts mehr!! was hat es da? muss ich vl vorher noch nen interrupt aufrufen oder nacher??
mfg hazelnoot!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #5 am: 23. March 2006, 20:11 »
Wo setzt du denn cl für den Sektor?

Zitat
readSectors(buffer, 1, 79, 17, 1); <<--- das muesste eigentlich der letzte sector sein !!


Nee, der letzte ist der Sektor 2879 (von 0 - 2879) also der:

readSectors(buffer,1,79,18,1); <<--- das is'er

bitmaster
In the Future everyone will need OS-64!!!

noob

  • Beiträge: 63
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 24. March 2006, 09:48 »
JUHUUU!!! danke es funktioniert!! nun hab ich auch gleich das naechste problem :-( (ich hoffe ich nerve nicht!) ich hab mir nun auch eine methode zum schreiben von sectoren geschrieben!!!!

int writeSectors(char *buffer,int head, int track, int startSector, int anz){
    bx = (short)buffer;
    cl = startSector;
    dl = DRIVE;
    al = anz;
    ch = track;            
    dh = head;                  
   
    asm{
        mov ah, 0x2;
        int 0x13
        setc bx
    }
   
    return bx;
}


aufrufen tu ich das folgendermassen:
char buffer[512];
    int i;

    for(i = 0; i < 512; i++){
        buffer[i] = 'z';
    }

    writeSectors(buffer, 1, 79, 15, 1);

leider funkt dies nicht! ich sehe immer noch das was ich vorher unter linux mit meinem programm auf die diskette geschrieben hab! also die z ts sehe ich nicht obwohl ich readSectors mit genau den selben parametern aufrufe!

danke nochmal fuer alles!!

mfg noob!

bitmaster

  • Troll
  • Beiträge: 1 138
    • Profil anzeigen
    • OS-64 = 64 Bit Operating System
Gespeichert
« Antwort #7 am: 24. March 2006, 22:02 »
@noob: Ja, die Funktion zum schreiben von Sektore ist 3 des int 13h. Du rufst aber die Funktion 2 = lesen auf. Folgendes musst du ändern:

das ändern:
mov ah, 0x2;
int 0x13


in das:
mov ah, 0x3;
int 0x13


bitmaster
In the Future everyone will need OS-64!!!

noob

  • Beiträge: 63
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 27. March 2006, 18:19 »
danke jetzt funkts!!

 

Einloggen