2017-06-03 2 views
5

Si j'ai un périphérique d'E/S mappé en mémoire et que j'écris dans un registre pour cet appareil situé à l'adresse 0x16D34, l'adresse 0x16D34 est en fait une adresse virtuelle, et l'UC la traduira d'abord en adresse physique , puis écrivez les données à l'adresse physique. Mais qu'en est-il des périphériques d'E/S mappés Port (par exemple: un port série), si je veux écrire dans un registre pour un port série situé à l'adresse 0x3F8, l'adresse 0x3F8 est-elle une adresse physique ou un adresse virtuelle?La mémoire virtuelle est-elle utilisée lors de l'utilisation d'E/S mappées sur port?


Edit: Je suis sur l'architecture x86.

+2

Cela ressemble à x86 et pas un périphérique mappé en mémoire du tout. Cette question particulière ne vous aidera pas à comprendre. Vous avez besoin d'obtenir l'image entière. Un bon livre sur l'architecture PC serait une bonne lecture. Et qu'est-ce que vous demandez? mémoire virtuelle/mappage de mémoire ** ou ** pilotes de périphérique? Ce sont deux approches très différentes! – Olaf

+0

@Olaf Ce qui ne ressemble pas à un périphérique, vous voulez dire l'adresse '0x16D34'? c'est juste un exemple que j'ai donné, il ne pointe à rien. – Steve

+0

Les ports d'E/S ne sont pas des adresses mémoire, vous ne pouvez donc pas demander s'ils sont physiques ou virtuels. – harold

Répondre

3

Les E/S mappées sur port x86/x86-64 (la plupart des autres architectures modernes ne le prennent même pas en charge) se déroulent dans un espace adresse entièrement séparé. Cet espace d'adressage n'est pas soumis au mappage de la mémoire, il n'y a donc pas d'adresse de port virtuel, seulement des adresses physiques. Des instructions spéciales in et out doivent être utilisées pour effectuer des E/S de port, un accès mémoire simple (par exemple avec mov) ne peut pas accéder à cet espace adresse séparé. La protection d'accès basée sur le niveau de privilège est possible. La plupart des systèmes d'exploitation modernes empêchent les processus d'espace utilisateur d'accéder aux ports d'E/S par défaut.

Pour plus de détails, vous pouvez par exemple consulter le chapitre "INPUT/OUTPUT" du "Intel® 64 et IA-32 Architectures - Manuel du développeur: Volume 1" (chapter 18 as of this writing). Notez que dans les débuts de x86, les adresses de port étaient câblées dans chaque périphérique, y compris les cartes d'extension ISA. Si vous avez de la chance, la carte dispose d'un ensemble de jumpers pour sélectionner un ensemble limité de plages de ports possibles pour le périphérique, afin d'éviter les conflits de portée entre les périphériques. Plus tard, Plug & Play a été introduit pour faire la sélection dynamiquement au démarrage du système. PCI a encore affiné ce principe, de sorte que les BARRES d'E/S peuvent à peu près être mappées n'importe où dans l'espace d'adresse 0x0000-0xffff par le système d'exploitation et/ou le micrologiciel. Les E/S port-mappées sont maintenant fortement déconseillées lors de la conception de nouveaux matériels en raison de leurs nombreuses limitations inhérentes.

+0

Est-ce que les processeurs x86 comportent toujours une broche pour sélectionner la mémoire ou les E/S lorsqu'une adresse est sur le bus? C'est ainsi que je me souviens de choses, mais il y a de nombreuses années, le collège était pour moi (d'après [Memory-Mapped I/O] (https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/IO/mapped). html)): * "La seule différence entre IN et OUT et le chargement et le stockage de la mémoire était une seule broche de sortie sur la CPU Cette sortie serait sortie, par exemple, 0, si l'adresse sur le bus d'adresse était une adresse mémoire et sortie 1 si l'adresse était une adresse d'E/S "*. – jww

+0

@jww J'en doute, les processeurs actuels intègrent le contrôleur de mémoire, de sorte qu'il y a beaucoup de broches qui vont directement aux modules de mémoire, pas besoin d'adressage E/S. Ils ont également des voies PCI Express directes. PCIe utilise très peu de broches, les messages (y compris les données d'adresse et de charge utile) étant transmis en série sur une paire de fils (dans chaque direction) pour l'utilisation de la signalisation différentielle. Peut-être pour certains périphériques hérités, mais ils sont probablement dans le southbridge de toute façon. – pmdj

0

Il semble que votre question serait les différences entre les E/S mappées en mémoire et les E/S mappées en port. Il existe normalement deux méthodes pour que le processeur connecte les périphériques externes, qui sont mappés en mémoire ou les E/S mappées sur le port.

mémoire mappée E/S

mémoire mappée E/S utilise le même espace d'adresses pour répondre à la fois la mémoire et les périphériques d'E/S. Ainsi, lorsqu'une adresse est accédée par la CPU, elle peut faire référence à une partie de la RAM physique, mais elle peut également se référer à la mémoire du périphérique d'E/S (basé sur Memory-mapped I/O on Wiki).

La valeur 0x16D34 dans votre premier exemple serait la mémoire virtuelle et serait mappée à la mémoire physique. Le périphérique d'E/S renvoie également la même mémoire physique pour permettre l'accès à partir du processeur.

Port mappée E/S

Port mappée E/S utilise une procédure distincte, l'espace d'adressage dédié et est accessible via un ensemble dédié d'instructions du microprocesseur. Pour 0x3F8 dans votre deuxième exemple, il s'agit de l'adresse de la propre adresse spécifique aux périphériques de mémoire et d'E/S. Ce n'est pas l'adresse partagée entre la mémoire et les périphériques d'E/S comme nous l'avons mentionné précédemment dans les E/S mappées en mémoire.Vous pouvez obtenir plus de détails dans Memory-mapped IO vs Port-mapped IO