2016-12-26 3 views
1

Ensuite une instruction CPU lit quelque chose de la mémoire, il y a un circuit spécial dans la CPU et dans la MMU de telle sorte que lorsque l'instruction est exécutée, l'adresse est envoyée à la MMU qui informe via le BUS qui veut lire de la mémoire et mettre les informations dans le registre de destination. J'ai aussi appris que certaines adresses qui correspondraient normalement à la RAM sont mappées sur certains périphériques. Donc, je suppose qu'il y a un moyen de dire d'abord à quelles adresses certains appareils vont être mappés. Ensuite, nous trompons le processeur en essayant de lire à partir d'une adresse mémoire, et par certains circuits, il finit par lire l'appareil à la place.Quelles instructions sont responsables du mappage du bus en mémoire?

Où puis-je trouver une meilleure explication? Spécialement pour l'architecture x86 qui traite des périphériques PCI et plus connus.

+0

Vous devez clarifier votre question. Pour la question dans le titre la réponse contiendrait tous les trois: lectures/écritures de port d'E/S, lectures/écritures de mémoire, aucun (câblé ou préconfiguré par le BIOS/chipset/peu importe). Vous ne trompez pas vraiment le CPU. Il existe un décodage d'adresse de mémoire physique qui achemine les données entre le processeur et la mémoire/les périphériques/bus. Certaines adresses peuvent être câblées, tandis que d'autres peuvent être changées. –

Répondre

1

Il n'y a pas d'instructions qui sont responsables du mappage des périphériques en mémoire.

Une réponse complète serait trop large, mais nous pouvons en faire un exemple ou deux. Tout d'abord, convainquez-vous qu'un appareil peut être configuré simplement en lui indiquant l'adresse à écouter. Au niveau du matériel, ce n'est rien de plus qu'une comparaison.

  1. Certains périphériques ont des adresses fixes.
    Ce sont les périphériques hérités, présents lors du premier lancement du système et clonés par d'autres concurrents et versions successives pour des raisons de compatibilité ascendante.

  2. Dispositifs configurables.
    Ces périphériques ont des cavaliers/commutateurs pour sélectionner la plage d'adresses à écouter. Il était de la responsabilité de l'utilisateur d'éviter les conflits et de configurer le logiciel de manière appropriée.

  3. Plug and play dispositifs.
    Le bus PnP le plus célèbre est PCI, mais ISA et MCA où PnP aussi (ISA était «sorte de» PnP).
    Ces périphériques sont similaires à celui ci-dessus, mais ils sont configurables dans un logiciel, et les ressources dont ils ont besoin (IRQ, DMA, MMIO) sont énumérables pour permettre au firmware et au système d'exploitation de les allouer sans conflits.

Vous vous demandez maintenant comment l'option 3 peut être obtenue. La réponse est simple: avec un espace d'adresse méta.

Dans le cas du PCI par exemple, les adresses 0cf8h et 0cfch lorsqu'il est utilisé pour sélectionner un dispositif, un registre sur le dispositif configuration space, et de lire ou d'écrire ce registre.
Les registres de l'espace de configuration peuvent être utilisés pour rebaser le périphérique.

Supposons que 10H registre contient l'adresse où le dispositif écouter, alors ce code pseudo cartes de l'appareil à 88888888h

uint32_t* select = MAKE_POINTER(0xCF8); 
uint32_t* data = MAKE_POINTER(0xCFC); 

*select = MAKE_SELECT(0, 1, 31, 0x10); //Bus 0, Device 1, Function 31, Register 0x10 
*data = 0x88888888;      //Set reg 0x10 to 0x88888888 

Comme vous pouvez le voir, deferencing les pointeurs génère une écriture sur les emplacements de mémoire 0cf8h et 0cfch, mais ces emplacements ne sont pas routés, par le matériel, vers la mémoire principale, mais plutôt vers le contrôleur de pont Host-to-PCI qui les convertit en accès à l'espace de configuration PCI qui seront récupérés par le périphérique intéressé.

Lorsque, plus tard, un accès à 88888888h est fait, cela est à nouveau mis en déroute pas être la mémoire principale mais au bus PCI (généralement à la suite de subtractive decoding) où le dispositif configuré est à l'écoute.


Au sens qu'il n'y a pas d'instructions CPU spécialement conçu. Tout est le résultat de l'exécution de certaines instructions, de sorte que certains doivent être "responsables" des périphériques en cours de mappage. Je suppose, pour le reste de cette réponse, que vous voulez savoir comment fonctionne MMIO. Uniquement pour x86 dans l'espace adresse IO, mais cela ne nous distrait pas. Le matériel sait où la mémoire se termine, si le logiciel mappe un périphérique où il y a réellement de la mémoire, ce dernier a la priorité et aucun accès au périphérique n'est fait.