OOStuBS/MPStuBS
Harddisk Klassenreferenz

Simpler ATA Treiber, der 28bit Adressierung und polling über IOPorts verwendet. Mehr ...

#include <harddisk.h>

Abgeleitet von BlockDevice.

Private Methoden

int write_sectors (uint64_t lba, uint8_t sectors, void *src_buf)
 Schreibt Sektoren mit 28bit PIO. Mehr ...
 
bool wait_for_harddisk (bool delay=false)
 Blockiert bis Festplatte bereit ist. Mehr ...
 
void wait_until_bsy_clear (bool delay=false)
 Identisch zu wait_for_harddisk – nur ohne Rückgabewert im Fehlerfall.
 
void drive_select (uint64_t lba_start=0)
 Selektiert die Festplatte, die nachfolgende Kommandos erhält. Mehr ...
 
bool is_attached ()
 Testet mit dem IDENTIFY-Kommando, ob diese Festplatte angeschlossen ist. Mehr ...
 
int convert_lba (uint64_t *lba, uint8_t *sectors)
 Konvertiert die gegebene lba und sectors in deren Äquivalent mit einer Sektorgröße von 512 byte. Das ist notwendig, da dies die Adressierung der IOPorts ist. Mehr ...
 
void transmit_command (uint64_t lba, uint8_t sectors, uint8_t command)
 Übermittelt via IOPort das Kommando command. Mehr ...
 

Ausführliche Beschreibung

Simpler ATA Treiber, der 28bit Adressierung und polling über IOPorts verwendet.

Hinweis für block_number und sector: Die block_number von fix() verwendet stets die Blockgröße, die über set_blocksize festgelegt wurde. Intern entspricht ein Sektor 512 byte, da die IOPorts diese Adressierung verwenden. block_number wird in read_sectors() oder write_sectors() per convert_lba() abhängig von this->blocksize umgewandelt.

Siehe https://wiki.osdev.org/ATA_PIO_Mode

Dokumentation der Elementfunktionen

◆ convert_lba()

int Harddisk::convert_lba ( uint64_t *  lba,
uint8_t *  sectors 
)
private

Konvertiert die gegebene lba und sectors in deren Äquivalent mit einer Sektorgröße von 512 byte. Das ist notwendig, da dies die Adressierung der IOPorts ist.

Das Ergebnis wird in die übergebenen Pointer geschrieben!

Beispiel mit this->blocksize von 1024:

  • eine lba von 1 wird zu 2
  • sectors=2 wird zu sectors=4
Rückgabe
Im Fehlerfall negativer Wert aus errno.h, sonst 0.

◆ drive_select()

void Harddisk::drive_select ( uint64_t  lba_start = 0)
private

Selektiert die Festplatte, die nachfolgende Kommandos erhält.

Parameter
lba_startNötig um die höchsten 4bits der 28bit-Adresse zu übermitteln.

◆ is_attached()

bool Harddisk::is_attached ( )
private

Testet mit dem IDENTIFY-Kommando, ob diese Festplatte angeschlossen ist.

Siehe https://wiki.osdev.org/ATA_PIO_Mode#IDENTIFY_command

Rückgabe
false, falls keine Festplatte an drive angeschlossen oder ein Fehler aufgetreten ist. Sonst true.

◆ transmit_command()

void Harddisk::transmit_command ( uint64_t  lba,
uint8_t  sectors,
uint8_t  command 
)
private

Übermittelt via IOPort das Kommando command.

Parameter
lbalogical block address
sectorsSektoren in 512 byte
commandzu übermittelnde Kommandobits

◆ wait_for_harddisk()

bool Harddisk::wait_for_harddisk ( bool  delay = false)
private

Blockiert bis Festplatte bereit ist.

Parameter
delayWenn true, wird das status register mehrmals gelesen, um der Festplatte genügend Zeit zum Aktualisieren der register zu geben.
Rückgabe
false im Fehlerfall, sonst true.

◆ write_sectors()

int Harddisk::write_sectors ( uint64_t  lba,
uint8_t  sectors,
void *  src_buf 
)
private

Schreibt Sektoren mit 28bit PIO.

Sehr ähnlich zu read_sectors. Allerdings wird nach jedem Schreiben noch der Cache geleert.

Parameter
lbalogical block address. Ein Sektor hat die Größe von this->blocksize.
sectorsAnzahl an Sektoren, die ab lba geschrieben werden. Wenn 0, werden 128kB geschrieben (256 Sektoren mit Blockgröße von 512byte)
src_bufSpeicheradresse, von der die Daten zum Schreiben gelesen werden
Rückgabe
Im Fehlerfall negativer Wert aus errno.h, sonst 0.

Die Dokumentation für diese Klasse wurde erzeugt aufgrund der Dateien: