web-dev-qa-db-fra.com

Comment le processeur communique-t-il avec les périphériques?

je suppose que le processeur a un accès direct au BIOS et à la RAM de la carte mère (corrigez-moi si je me trompe)

Mais comment le processeur communique-t-il avec d'autres matériels tels que les disques durs, les cartes d'extension, les périphériques, les autres BIOS, etc.?

Je connais OS et ses pilotes, mais ce sont des logiciels, ils sont en RAM. Comment le processeur communique-t-il avec tout ce matériel au niveau matériel? N'est-il pas limité uniquement au BIOS et à la RAM de la carte mère?

28
DrStrangeLove

Dans les anciennes architectures, les périphériques étaient accessibles via un mécanisme distinct d'accès à la mémoire avec des instructions d'E/S spéciales. Sur x86, il y avait (et il y en a toujours!) Des instructions "in" et "out" pour le transfert d'octets entre le CPU et un périphérique. Les périphériques ont reçu des adresses, par exemple 0x80 pour le clavier. Simplifiant beaucoup, faire "en 0x80" lirait un octet du contrôleur de clavier au registre CPU "AL".

Sur les architectures modernes, les périphériques sont accessibles de la même manière que la mémoire: via des adresses mémoire mappées sur un bus. Vous ne devriez pas penser à un bus comme un moyen d'accéder à la mémoire. C'est plus un moyen d'adresser des périphériques individuels, dont la mémoire (RAM/DDR) n'est qu'un type. Par exemple, vous pourriez avoir 2 Go de RAM aux adresses 0x00000000..0x7fffffff. Après cela, vous pourriez avoir une carte graphique à 0x80000000..0x80001fff. Le contrôleur de bus (PCIe ou autre) sait quelle adresse les plages vont à quel périphérique.

La mémoire est généralement spéciale dans la mesure où elle peut être mise en cache, de sorte que les lectures/écritures individuelles dans la mémoire ont tendance à ne pas se traduire directement en lectures/écritures individuelles sur les puces RAM. Les périphériques sont marqués comme spéciaux - accès au processeur devrait sortir sur le périphérique exactement comme écrit dans votre programme.

La langue avec laquelle vous parlez aux périphériques est à peu près ad-hoc en fonction de l'appareil. Le thème général est que le périphérique est mappé quelque part dans la mémoire (par exemple 0x80000000 pour quelques Ko comme ci-dessus), avec un bit d'état individuel et des actions contrôlées par des mots différents (généralement 32 ou 64 bits). Un exemple mythique d'un port série à 0x80000000:

  • Écrivez le mot "A" de 32 bits à 0x80000000, en mettant en file d'attente le caractère "A" dans son FIFO de sortie.
  • Écrivez Word 0x1 32 bits à 0x80000004, qui indique au port série d'envoyer sa file d'attente.

Encore une fois, totalement inventé juste à titre d'exemple, mais un vrai port série (uart) n'est pas si différent.

Le problème est que vous n'aurez pas voir aucune des configurations de mémoire ci-dessus dans un système d'exploitation moderne, à cause de la mémoire virtuelle. Les adresses ci-dessus seraient appelées "adresses de mémoire physique" (ou adresses de bus) - les adresses réelles qui sortent sur le bus. Le CPU voit à la place des adresses de mémoire virtuelle. Les périphériques individuels devront être mappés dans l'espace d'adressage virtuel. C'est un peu compliqué à expliquer et probablement mieux dans une autre question, mais le fait est qu'il est peu probable que vous accédiez à un périphérique par son adresse physique réelle dans un système d'exploitation moderne.

41
John Ripley

La réponse acceptée est exacte, bien sûr, mais peut-être que DrStrangeLove avait l'intention de répondre à autre chose ou, du moins, la question contient une autre réponse. En fait, lorsque quelqu'un demande "Comment les périphériques communiquent-ils avec le CPU au niveau matériel?", Je pense que la réponse devrait mentionner le rôle des modules d'E/S (comme les adaptateurs d'E/S que tout le monde connaît). Il est important de le souligner car une partie de la logique requise pour parler avec les périphériques d'E/S est intégrée dans les modules d'E/S, ce qui diminue le besoin d'attention du processeur lors de l'exécution des opérations d'E/S. Cela me semble pertinent dans le contexte de la question, car il pose des questions sur les aspects matériels des opérations d'E/S, et les adaptateurs sont des pièces matérielles qui résument les caractéristiques intrinsèques des périphériques d'E/S, en cachant leurs complexités du CPU (et du système d'exploitation également). Par exemple, les adaptateurs de disque masquent les aspects de la géométrie des disques, libérant le CPU de l'exécution de la logique requise pour faire tourner les plaques des disques, localiser un cylindre et attendre que le secteur correct passe sous les têtes de lecture/écriture. Des raisonnements similaires s'appliquent à d'autres appareils tels que les adaptateurs vidéo, les cartes réseau, etc. En un mot, sans les modules d'E/S, les tâches d'E/S submergeraient le CPU. Pour citer les décrochages:

Un module d'E/S fonctionne pour permettre au processeur de visualiser une large gamme de périphériques de manière simple. Il existe un éventail de capacités qui peuvent être fournies. Le module d'E/S peut masquer les détails de la synchronisation, des formats et de l'électromécanique d'un périphérique externe afin que le processeur puisse fonctionner en termes de simples commandes de lecture et d'écriture, et éventuellement d'ouvrir et de fermer des commandes de fichier. Dans sa forme la plus simple, le module d'E/S peut encore laisser une grande partie du travail de contrôle d'un périphérique (par exemple, rembobiner une bande) visible au processeur. Un module d'E/S qui assume la majeure partie de la charge de traitement détaillée, présentant une interface de haut niveau avec le processeur, est généralement appelé canal d'E/S ou processeur d'E/S. Un module d'E/S assez primitif et nécessitant un contrôle détaillé est généralement appelé contrôleur d'E/S ou contrôleur de périphérique. Les contrôleurs d'E/S sont couramment utilisés sur les micro-ordinateurs, tandis que les canaux d'E/S sont utilisés sur les ordinateurs centraux.

En outre, comme John Ripley l'a correctement déclaré, il existe un espace d'E/S qui est mappé de la même manière que le RAM is. ​​En effet, les périphériques pourraient être mappés directement = dans l'espace d'adressage mémoire (connu sous le nom de MMIO , E/S mappées en mémoire), ou dans un espace d'adressage séparé ( PMIO , E/S mappées par port, également appelées "E/S isolées" car, contrairement à MMIO, les adresses d'E/S sont entièrement séparées de celles de la RAM de l'ordinateur. C'est pourquoi vous devez utiliser les instructions in et out pour communiquer avec les appareils utilisant PMIO).

Par ce qui précède, MMIO et PMIO traitent les périphériques d'E/S comme des positions de mémoire - ce qui est l'essence de la façon dont le matériel gère les opérations d'E/S, mais quelques détails supplémentaires méritent d'être mentionnés ici afin d'obtenir la riche charge conceptuelle impliquée dans E/S. Étant donné que chaque adaptateur a une plage d'adresses limitée, nous devons comprendre que ces positions de mémoire fonctionnent comme des tampons de données, ce qui signifie que vous n'avez que quelques octets ("blocs de données") pour communiquer avec l'appareil à la fois. Pour cette raison, il est courant que la CPU n'utilise PAS directement les données qu'elle lit à partir de ces positions de mémoire: d'abord, les données sont lues à partir du périphérique d'E/S via l'adresse correspondante, ensuite ces données sont stockées dans le RAM et alors seulement le CPU peut l'utiliser. Pour cela, pensez dans un gros fichier binaire que le CPU doit exécuter: l'adaptateur de disque a un tampon limité limité par son espace d'adressage d'E/S ( note je ne fais pas référence aux tampons internes de l'adaptateur, mais à son espace d'adressage tel que vu par le CPU), donc l'adaptateur lit certaines données du disque et avertit le CPU lorsque le tampon se remplit via une interruption; ensuite, le CPU interrompt tout ce qu'il fait, lit le tampon, copie le contenu du tampon dans le RAM et signale à l'adaptateur qu'il peut continuer à apporter plus de données du disque. Ce cycle se répète jusqu'au fichier binaire s'il est complètement à partir de ce moment, l'opération de lecture est déclarée terminée et le fichier peut enfin être exécuté.

Ce cycle est appelé E/S pilotées par interruption et se produit totalement dans le matériel (avec une prise en charge du système d'exploitation pour gérer les interruptions), mais veuillez noter qu'il existe deux autres options pour effectuer des opérations d'E/S. Il est également possible d'utiliser le soi-disant PIO (E/S programmables) où, au lieu d'utiliser le mécanisme d'interruption, le CPU regroupe en continu le contrôleur via une boucle jusqu'à ce que toutes les informations requises soient collectées, bloc par bloc (lorsque le dernier bloc est récupérée, la boucle se termine). Les E/S entraînées par interruption et PIO gaspillent du temps CPU (en particulier ce dernier) et ont été remplacées il y a longtemps par Direct Memory Access (DMA), qui permet au périphérique d'E/S d'écrire (ou de lire) ses données directement sur (ou de) le RAM comme indiqué par le CPU. En raison de sa nature de mise en commun, je crois que PIO est entièrement implémenté dans le logiciel, mais je peux me tromper à ce stade. Je dois remarquer que, bien que DMA a rendu PIO et les E/S pilotées par interruption obsolètes, je ne suis pas sûr que les deux aient été bannis des architectures modernes.

S'il vous plait corrigez moi si je me trompe. Fondamentalement, le périphérique périphérique communique avec le processeur en utilisant PCI (interconnexion des composants périphériques), c'est un type de bus qui connecte le périphérique directement au processeur. lorsqu'une commande est donnée via un périphérique (disons n'importe quel bouton du clavier), elle est convertie en code binaire et stockée en mémoire sous forme de mémoire cache, puis l'exécution requise pour cette fonction particulière est effectuée par le processeur.

0
Amrit Kumar Chaubey

Cela dépend de ce que vous entendez par "accès direct". Un cœur de processeur communique avec la mémoire principale (RAM) via un bus . (Le cœur peut avoir un accès plus direct à des quantités de mémoire relativement petites (cache ou registres), mais c'est un problème différent.) Le CPU communique également avec les périphériques via des bus. Certains types de bus dont vous avez peut-être entendu parler sont le bus série universel (USB; généralement pour les périphériques externes), PCI, le bus frontal (un type de bus reliant les cœurs de processeur et la mémoire principale) ou Serial-ATA (SATA; souvent utilisé pour les appareils comme les disques durs).

ETA: J'ai mentionné que dans mon commentaire ci-dessous, les pilotes de périphériques gèrent la communication au niveau matériel entre le processeur et les périphériques. La mécanique réelle de la communication peut impliquer l'utilisation de parties spécifiques de l'espace d'adressage pour transférer des données ( E/S mappées en mémoire ), de sorte que la lecture physique ou l'écriture sur un périphérique ressemble à l'accès à la mémoire ordinaire. Le pilote de périphérique traite également de la façon dont un processeur répondra à interrompt à partir d'un périphérique.

0
Asher L.