PCI-opdrachten zijn instructies die door een host (meestal een CPU) naar een PCI-apparaat worden verzonden om de werking ervan te controleren. Het is geen eenvoudige, gemakkelijk te onthouden lijst zoals een paar dozijn commando's; in plaats daarvan is er een complexe structuur en een breed scala aan functionaliteit, afhankelijk van het specifieke apparaat. De opdrachten zijn over het algemeen gecategoriseerd en werken binnen de PCI-configuratieruimte.
Hier volgt een overzicht van de belangrijkste aspecten en typen PCI-opdrachten:
1. Configuratietoegangsopdrachten: Dit zijn fundamentele opdrachten die worden gebruikt om te lezen en te schrijven naar de configuratieruimte van het apparaat. Deze ruimte bevat informatie over de mogelijkheden van het apparaat, bronnen (zoals geheugenadressen en I/O-poorten) en status. De kernopdrachten hier zijn:
* Configuratie lezen: Leest een specifiek register binnen de configuratieruimte.
* Configuratie schrijven: Schrijft gegevens naar een specifiek register binnen de configuratieruimte.
Deze opdrachten worden afgehandeld via specifieke I/O-poorttoegangen die worden bepaald door de PCI-busspecificaties. Het adres waarnaar u schrijft, bevat zowel de bus-, apparaat- als functienummers om het doelapparaat en de registeroffset binnen de configuratieruimte te specificeren.
2. I/O- en geheugentoegang: Hoewel het strikt genomen geen "opdrachten" zijn in de zin van specifieke opcodes, is toegang tot de I/O-ruimte en de in het geheugen toegewezen ruimte van cruciaal belang. De host gebruikt de informatie die is verkregen uit de configuratieruimte om de juiste adressen voor deze toegangen te bepalen. Deze worden door de CPU geïnitieerd via lees-/schrijfbewerkingen in het geheugen of I/O-instructies, maar de onderliggende hardware stuurt deze bewerkingen naar het specifieke PCI-apparaat.
3. Apparaatspecifieke opdrachten: Veel PCI-apparaten implementeren hun eigen opdrachten buiten de basisconfiguratietoegang. Deze opdrachten zijn zeer gevarieerd, afhankelijk van de functie van het apparaat, en worden gedefinieerd in de datasheet van het apparaat. Voorbeelden kunnen zijn:
* Bewerkingen starten/stoppen: Commando's om een gegevensoverdracht te starten, een proces te starten of een bewerking te stoppen.
* Controleregistermanipulatie: Het aanpassen van verschillende besturingsbits in specifieke registers om het gedrag van het apparaat te veranderen (bijvoorbeeld energiebeheer, interrupt in-/uitschakelen).
* Gegevensoverdrachtsopdrachten (DMA-gerelateerd): Commando's gerelateerd aan Direct Memory Access (DMA)-bewerkingen. Hierdoor hebben apparaten rechtstreeks toegang tot het systeemgeheugen zonder voortdurende tussenkomst van de CPU. Deze zijn zeer apparaatspecifiek, waarbij vaak DMA-descriptors moeten worden ingesteld.
Samengevat: Er is geen eenvoudige lijst met "PCI-opdrachten" zoals u die in een CPU-instructieset kunt tegenkomen. De interactie is genuanceerder:
* De host gebruikt configuratietoegangsopdrachten (lezen/schrijven) om het PCI-apparaat te begrijpen en te configureren.
* Vervolgens gebruikt het geheugentoegang en I/O-instructies, begeleid door de configuratie, om te communiceren met de functie van het apparaat.
* Ten slotte hebben veel apparaten hun eigen reeks opdrachten die specifiek zijn voor hun functionaliteit en die worden beschreven in hun individuele documentatie.
Om de specifieke opdrachten voor een bepaald PCI-apparaat te begrijpen, moet u het gegevensblad ervan raadplegen. De PCI-specificatie zelf definieert in de eerste plaats de toegangsmechanismen voor de configuratieruimte en de algemene busarchitectuur. |