StuBS
Loading...
Searching...
No Matches
Harddisk Class Reference

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

#include <harddisk.h>

Inherits BlockDevice.

Private Member Functions

int write_sectors (uint64_t lba, uint8_t sectors, void *src_buf)
 Schreibt Sektoren mit 28bit PIO.
 
bool wait_for_harddisk (bool delay=false) const
 Blockiert bis Festplatte bereit ist.
 
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.
 
bool is_attached ()
 Testet mit dem IDENTIFY-Kommando, ob diese Festplatte angeschlossen ist.
 
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.
 
void transmit_command (uint64_t lba, uint8_t sectors, uint8_t command) const
 Übermittelt via IOPort das Kommando command.
 

Detailed Description

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

Member Function Documentation

◆ 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
Returns
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.

Parameters
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

Returns
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 ) const
private

Übermittelt via IOPort das Kommando command.

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

◆ wait_for_harddisk()

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

Blockiert bis Festplatte bereit ist.

Parameters
delayWenn true, wird das status register mehrmals gelesen, um der Festplatte genügend Zeit zum Aktualisieren der register zu geben.
Returns
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.

Parameters
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
Returns
Im Fehlerfall negativer Wert aus errno.h, sonst 0.

The documentation for this class was generated from the following files: