Autor Thema: Festplatten Sektoren direkt einlesen  (Gelesen 7672 mal)

TomCat

  • Beiträge: 35
    • Profil anzeigen
Gespeichert
« am: 18. August 2016, 10:17 »
Hallo,

ich moechte die Sektoren der Festplatte direkt lesen. Dafür benutze ich den interrupt 13h. danach werden mir maximal 127 Sektoren a 512 Byte in den konventionellen Speicher geladen. Da ich im unreal-Mode bin, moechte ich sie dort aber nicht haben. sondern im hohen Speicherbereich. Im Moment muss ich die Daten dann per Software in den hohen Bereich laden, was Zeit kostet.

Fragen:
1) Gibt es einen Möglichkeit die HDD ganz ohne Bios zu lesen?
2) Gibt es eine Möglichkeit die Daten direkt in den hohen Speicherbereich zu lesen?

THX
TomCat

Svenska

  • Beiträge: 1 790
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 18. August 2016, 13:46 »
1) Gibt es einen Möglichkeit die HDD ganz ohne Bios zu lesen?
Ja, mit einem eigenen Festplattentreiber (IDE oder SATA). Der kann auch deutlich schneller als das BIOS sein, wenn du es richtig machst.

2) Gibt es eine Möglichkeit die Daten direkt in den hohen Speicherbereich zu lesen?
Im Real Mode gibt es keinen hohen Speicher, der Unreal Mode ist ein funktionierender Hack. Mit dem BIOS wirst du keinen zuverlässigen Weg finden, dadrauf zuzugreifen.

Sinnvollerweise lässt du solche Tricks einfach sein und steigst auf den Protected Mode um. Im Wiki gibt es die Reihe OS-Dev für Einsteiger, wie du dazu vorgehen kannst. Der Nachteil daran ist, dass du dort ohne relativ viel Aufwand keine BIOS-Treiber mehr benutzen kannst.

TomCat

  • Beiträge: 35
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 19. August 2016, 10:41 »
Danke für die Antwort.

ja afaik ist es ja dann so dass man erst in den Real Mode zurückschalten muss um die Bios Funktionen nutzen zu können. Das verlangsamt dann den HDD -Zugriff wohl zusätzlich oder? 

Wo bekommt man so einen Sata-Treiber her?

Ich muss dazu sagen, dass ich ohne Betriebssystem arbeite, d.h. ich habe einen eigenen Bootloader geschrieben der das Programm direkt in den Arbeitsspeicher lädt und dort ausführt.

Ich habe keine Erfahrung mit dem Protected Mode. Ist es möglich mit einer Anwendung mehr als 4GB RAM zu nutzen?
Was ich gelesen habe, kann man Segmente a 4GB definieren. Allerdings ist  die Segmentbasisadresse nur 32 Bit breit.
Wie kann man da mehrere Segmente definieren um z.b. 32GB RAM zu nutzen?

THX
TomCat

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 19. August 2016, 10:52 »
Wenn du nicht im RM bist, wirst du versuchen, auf BIOS-Aufrufe komplett zu verzichten, sonden die Hardware direkt mit deinem eigenen Treiber anzusteuern. Speziell für Festplatten gibt es keinen Grund, das BIOS zu benutzen, wenn du einen Treiber hast. Also musst du auch nicht in den RM zurückwechseln und dir irgendeine Verlangsamung einfangen.

Wenn du mehr als 4 GB Speicher benutzen willst, ist das einfachste, du gehst gleich auf den Long Mode. Es gibt ein paar Krücken, um auch im PM mehr als 4 GB physischen Speicher zu benutzen, aber eben nicht gleichzeitig, weil der virtuelle Adressraum trotzdem auf 32 Bit beschränkt ist. (PSE-36 und PAE wären das, beide benutzen Paging dafür.)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

TomCat

  • Beiträge: 35
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 19. August 2016, 11:31 »
Danke erstmal,

wo kann ich so einen Sata- Treiber bekommen? mein ganzer Code ist rein Assembler.
Bzw. kann man den auch selber schreiben?
und wenn  ja wo bekommt man die Infos dazu her?

Ich will, wie ich schon schrieb, nur Sektoren lesen also kein Dateisystem oder so.

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 19. August 2016, 12:17 »
Bei Festplatten gibt es zwei unterschiedliche Einteilungen. Die eine ist die physische Schnittstelle zwischen der Festplatte selbst und dem Controller, das sind SATA und PATA. Das andere ist die Schnittstelle, die der Controller für die Software bietet, das sind IDE und AHCI. Das erste spielt für dich keine Rolle, du hast also keinen SATA-Treiber, sondern einen IDE- oder AHCI-Treiber. Ob dein SATA-Controller AHCI oder IDE zur Verfügung stellt, hängt in der Regel von einer BIOS-Einstellung ab. Beiden haben gemeinsam, dass sie den ATA-Befehlssatz benutzen, nur der Zugriff ist unterschiedlich. Einfacher ist die alte IDE-Schnittstelle, aber heutzutage ist AHCI der Normalfall.

Ich gebe dir einfach mal einen Sack voll Links auf den Weg mit:

Lowevel-Wiki zu IDE: http://www.lowlevel.eu/wiki/ATA
osdev.org-Wiki mit Beispiel zu minimalen Lesefunktionen von IDE: http://wiki.osdev.org/ATA_read/write_sectors
osdev.org-Wiki zu AHCI: http://wiki.osdev.org/AHCI
AHCI-Spezifikation: http://www.intel.com/content/www/us/en/io/serial-ata/ahci.html
Sepzifikation für den ATA-Befehlssatz: http://www.t13.org/Documents/UploadedDocuments/docs2007/D1699r4a-ATA8-ACS.pdf
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

TomCat

  • Beiträge: 35
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 22. August 2016, 14:45 »
Habe mir gerade mal den Link und die Beispielprogramme fuer IDE-Platten durchgelesen.
Da sind viele Portzugriffe allein um 512 Byte von der Platte zu lesen.
Portzugriffe sind extrem langsam. Ist das alles darum so langsam?

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 22. August 2016, 16:15 »
Gegenüber der Zeit, die die Hardware braucht, um die Daten tatsächlich von der Platte zu lesen, spielen die paar Portzugriffe keine große Rolle.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

Svenska

  • Beiträge: 1 790
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 25. August 2016, 14:10 »
Das BIOS nutzt vermutlich den langsamsten PIO-Modus, um die Festplatte anzusprechen. Es gibt auch schnellere PIO-Modi, sowie DMA-Modi (wo die Datenübertragung im Hintergrund stattfinden kann), aber nicht alle (antiken) Controller und Festplatten können das.

TomCat

  • Beiträge: 35
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 29. August 2016, 12:53 »
hmm, ist es dann so, dass das Bios von neuen Rechnern auch die maximale Geschwindigkeit erreicht. Was macht den Zugriff über das Bios eigentlich langsamer?
Wie läuft eigentlich das Schreiben auf neue Festplatten? Werden da nicht die ankommenden Daten einfach in einen Puffer gespeichert und danach von der Festplatten-Firmware physikalisch auf die Platte gespeichert?

 Hätte man kaum Wartezeit. 

Svenska

  • Beiträge: 1 790
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 29. August 2016, 23:05 »
hmm, ist es dann so, dass das Bios von neuen Rechnern auch die maximale Geschwindigkeit erreicht. Was macht den Zugriff über das Bios eigentlich langsamer?
Die BIOS-Treiber sind langsam, weil sie nicht schnell sein müssen. Die Aufgabe des BIOS ist es, Bootloader und Betriebssystem zu laden, also vielleicht ein paar MB pro Systemstart. Das darf auch gern 200ms länger dauern - beim deutlich langsameren POST (Power-On Self-Test) fällt das nicht weiter auf.

Dafür sind zwei andere Dinge wesentlich wichtiger: Größe und Kompatiblität. Das BIOS liegt in einem Flash-Baustein, und der ist wesentlich teurer pro MB als die Festplatte, daher sollte der Treiber eher klein sein. Außerdem muss dieser Treiber mit jeder Festplatte(*) klarkommen, denn er kann nur mit extrem viel Aufwand (BIOS-Update) aktualisiert werden. Also gilt es, Fehlerquellen zu vermeiden.

(*) Auch Festplattenfirmware kann fehlerhaft sein. Es gab z.B. ein paar SSDs, die TRIM und NCQ beworben haben, aber wenn man beides gleichzeitig gemacht hat, hatte man Datenverlust. Oder ältere IDE-Festplatten, die elektrisch nicht so gut waren - bei höheren Geschwindigkeiten gab es dann Bitfehler. Oder oder oder.

Wie läuft eigentlich das Schreiben auf neue Festplatten? Werden da nicht die ankommenden Daten einfach in einen Puffer gespeichert und danach von der Festplatten-Firmware physikalisch auf die Platte gespeichert?
Neue und alte (mechanische) Festplatten unterscheiden sich nicht... um zu wissen, ob ein Sektor leer ist, müsste die Festplatte ihn zuerst lesen, das kostet Zeit, also lässt man es. Die Daten werden selbstverständlich in der Festplatte gepuffert, aber der Puffer kann nicht zu groß sein, sonst werden die Verluste bei Stromausfall zu groß (außerdem wird er von modernen Dateisystemen an bestimmten Punkten geflusht, damit das Dateisystem dann auch konsistent bleibt).

Hätte man kaum Wartezeit.
Ich glaube, du machst es dir da zu einfach. Caches sind keine Wundermittel.

Lesen ist eine synchrone Aktion, du kannst also nicht weitermachen, bis du die Daten hast(**), und das dauert im Mittel eine halbe Umdrehung (bei 7200 U/Min also etwa 4,1 ms). Und beim Schreiben musst du auch entscheiden, ob du warten möchtest, bis die Daten sicher geschrieben sind oder ob du bei Stromausfall auch drauf verzichten kannst. Wenn du verschiedene Stellen der Festplatte gleichzeitig lesen möchtest, geht außerdem der Kopf hin und her, das kostet zusätzlich Zeit.

SSDs funktionieren wieder völlig anders.

(**) Du kannst zwar in der Zwischenzeit etwas anderes machen, aber das hilft dem lesenden Thread auch nicht weiter.

TomCat

  • Beiträge: 35
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 18. November 2016, 10:05 »
so hab ne Weile rumprobiert. Das ist alles sehr kompliziert und fehleranfällig. Hab das jetzt wieder mit den BIOS-Funktionen am
laufen. Ist aber keine Lösugng weil ich vom Protected Mode oder Long Mode nicht auf die BIOS -Funktionen zugreifen kann, oder
gibt es da eine Lösung??

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 18. November 2016, 11:06 »
Was genau sind denn die Probleme, die deinen Treiber kompliziert und fehleranfällig machen?
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

TomCat

  • Beiträge: 35
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 18. November 2016, 13:46 »
Was genau sind denn die Probleme, die deinen Treiber kompliziert und fehleranfällig machen?

hab das wohl etwas falsch ausgedrückt. Ich bekomme den Festplattenzugriff durch low-level-coding einfach nicht hin.
hätte ich funktionierenden Code, den ich nutzen könnte wärs was anders. Aber so, von null weg...


kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 18. November 2016, 15:31 »
Wenn du Code zum Anschauen brauchst, kannst du dir mal die Treiber ata (für das alte IDE-Interface) und ahci (eben für AHCI) in CDI anschauen: http://git.tyndur.org/?p=cdi.git;a=tree
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen