En enhetsdrivrutin kommunicerar med en enhet som använder olika metoder, beroende på typ av enhet och operativsystemet. Kommunikationen är sällan direkt; Istället förlitar det sig på mellanliggande lager och standardiserade gränssnitt. Här är en uppdelning:
1. Hårdvaruspecifika gränssnitt:
* Memory-mappat I/O (MMIO): Enhetens register mappas in i systemets minnesadressutrymme. Föraren läser och skriver till dessa minnesadresser för att styra enheten. Detta är vanligt för många enheter, inklusive grafikkort och nätverksgränssnittskort (NIC). Föraren interagerar direkt med de fysiska hårdvaruregistrerna.
* Port-mappade I/O (PIO): Enheten nås via specifika ingångs-/utgångsportar. Föraren skickar kommandon och tar emot data genom att skriva till och läsa från dessa portar. Detta är mindre vanligt nu men fortfarande finns i äldre system. Liksom MMIO är det en direkt interaktion.
* avbrott: Enheten avbryter CPU när den behöver uppmärksamhet (t.ex. data är redo, ett fel inträffade). Avbrottet utlöser en specifik avbrottshanterare i föraren, vilket gör att föraren kan svara på enhetens händelse. Detta är avgörande för asynkrona operationer.
* Direktminnesåtkomst (DMA): Enheten kan direkt komma åt systemminnet utan CPU -ingripande, förbättra prestanda. Föraren konfigurerar DMA -överföringen och frigör CPU för andra uppgifter.
2. Programvarugränssnitt (abstraktionslager):
De råa hårdvaruinteraktionerna som beskrivs ovan abstraheras vanligtvis av mjukvarulager för att ge ett mer hanterbart och bärbart gränssnitt. Dessa inkluderar:
* Operativsystem Kernel: Föraren arbetar inom operativsystemets kärna. Den använder kärntjänster för att få tillgång till hårdvaruresurser och interagera med andra delar av systemet.
* enhetsspecifika API:er: Operativsystem ger ofta API:er (applikationsprogrammeringsgränssnitt) specifika för vissa enhetstyper (t.ex. SCSI, SATA, USB). Dessa API:er förenklar förarutvecklingen genom att abstrahera detaljer på låg nivå.
* bussspecifika gränssnitt: Enheten är ansluten till systemet via en buss (t.ex. PCI, USB, SATA). Föraren använder bussspecifika protokoll och gränssnitt för att kommunicera med enheten över bussen.
Sammanfattningsvis:
Kommunikationsprocessen kan visualiseras enligt följande:
1. applikation (användare eller system): Begär en operation (t.ex. läsa data från en hårddisk).
2. Operativsystem: Ruttar begäran till lämplig enhetsdrivrutin.
3. Enhetsdrivare: Använder lämpligt hårdvaruspecifikt gränssnitt (MMIO, PIO, etc.) och programvaruabstraktioner för att kommunicera med enheten. Detta kan innebära att skicka kommandon, ta emot data, hantera avbrott eller hantera DMA -överföringar.
4. enhet: Utför den begärda operationen och skickar resultatet (om någon) tillbaka till föraren.
5. Enhetsdrivare: Bearbetar svaret och returnerar resultatet till operativsystemet.
6. Operativsystem: Returnerar resultatet till applikationen.
Kommunikationens komplexitet beror mycket på enhetens sofistikering och operativsystemet. Moderna system använder ofta flera lager av abstraktion för att förenkla förarens utveckling och förbättra portabilitet.