IDE Task


Základem celého projektu ovladače IDE rozhraní (a pevných disků na toto rozhraní připojených) je PUBLIC funkce ide_task(void). Tuto funkci spustí jádro TUOXu jako jednu z úloh, které jsou specifikovány v tabulce tasků, kterou má jádro k dispozici. Příslušná definice z kmain.c vypadá následovně:

static void (*task[]) () = { idle, clock_task, floppy_task, sys_task, mem_task, tty_task, ide_task };

Po spustění úlohy ide_task následuje inicializace IDE_rozhraní, která spočívá v tom, aby se detekovala všechna zařízení, která jsou na toto rozhraní připojena, a jejich parametry. Proto se spustí funkce IDEdrv_Init(). Detekce probíhá ve třech krocích:
  1. Identifikace zařízení připojených na IDE rozhraní (Předpokládají se max. 4 fyzická zařízení - 2 kanály po 2 zařízeních). Tento krok provádí funkce: void IdentifyDrives(TypeDriveParam *p2DriveParameters), jejímž parametrem je ukazatel na tabulku všech fyzických zařízení.

  2. Rozbor detekovaných zařízení a zjištění jejich parametrů (Např. načtení tabulky rozdělení disku, velikosti jednotlivých částí,...) Tento krok má na starosti funkce: int ScanDrives(int *CurrPart, PartInfo *AllPart, TypeDriveParam *p2DriveParam), jejimiž parametry jsou ukazatele postupně na číslo aktuální partition (nakonec vrací počet všech partitions na všech zařízeních), dále na tabulku všech partitionů (... a jejich parametrů) a nakonec ukazatel na tabulku všech fyzických IDE zařízení, která se získá v prvním kroku.

  3. Detekce TUOXovských částí na zařízeních = zjištění počtu minor devices. (Projdou se všechna detekovaná zařízení a vytvoří se tabulka TUOX partitions.) Tento krok poměrně snadno implementuje funkce: void DetectTuoxPart(int *TuoxPartCnt,PartInfo *AllPart,int PartCnt, int *TuoxPart), jejíž parametry znamenají ukazatele postupně na počet TUOXovských partitionů, tabulku všech patritionů, počet všech partitionů a nakonec tabulku TUOXovských partitionů včetně jejich parametrů.

Po inicializaci ovladače IDE rozhraní se spustí nekonečná smyčka:

while (TRUE) {

receive(ANY,msg);
proc_nr=msg.m_source;
switch (msg.m_type) {

case DEV_READ:
...
break;

case DEV_WRITE:
...
break;

case DEV_IOCTL:
...
break;

default:
...
}

msg.m_source=IDE;
msg.m_type=TASK_REPLY;
send(proc_nr,msg);

}

Tato smyčka realizuje veškeré systémové rozhraní ovladače IDE zařízení. Na začátku smyčky se vždy čeká na zprávu od jádra systému. Pak se zjistí odesílatel zprávy (zdrojový proces), aby se mohl využít jako adresát odpovědi. Potom už se jen detekuje typ zprávy a na základě toho pak jsou volány příslušné akce.

Typ zprávy Akce
DEV_READ Čtení jednoho bloku (1024 bytů) ze zadaného minor zařízení
DEV_WRITE Zápis jednoho bloku na zadané minor zařízení.
DEV_IOCTL Informace o zařízení, zpráva se musí blíže specifikovat, aby se zjistilo, o které informace má zájem. K dispozici jsou tyto:
GETNUMBERMINORDEV - Zjistí počet minor zařízení
GETDEVSIZE - Zjistí počet bloků na zadaném minor zařízení.

Na tomto driveru bude potřeba ještě dodělat mnoho detailů, jako např. detekce ATAPI zařízení nebo standartizování a dodržování všech chybových kódů pro chyby na všech blokových zařízeních i pro chyby speciálně na IDE zařízení nebo rozhraní.

Po prostudování odokumentovaných zdrojových kódů (týkajících se rozhraní IDE) v LINUXu jsme zjistili, že mnoho výrobců nedodržuje kompletní specifikaci ATA rozhraní a tudiž není v našich silách provést dokonalou bezchybnou detekci libovolného zařízení a všech jeho parametrů tak, jak to (většinou) dokáže např. BIOS.