• Aucun résultat trouvé

4.3 Partage des périphériques

4.3.2 Composant MULTI_IOC

Comme présenté précédemment, chaque machine virtuelle se voit attribuée un accès exclusif à un canal du contrôleur de disque. Ainsi, une machine virtuelle se voit interdire tout accès aux canaux des autres machines virtuelles s’exécutant sur la plateforme. De plus, chaque machine virtuelle pos-sède son propre disque. Pour offrir ce service, il a fallu développer un nouveau composant, nommé MULTI_IOC. Ce composant est une adaptation “multi-canaux” du composant IOC [89] déjà exis-tant. Les modifications apportées à ce composant concernent non seulement les canaux, mais aussi la gestion de plusieurs disques.

Chapitre 4. Solutions

La figure 4.15 présente l’architecture du composant MULTI_IOC. Ce composant possède une ca-pacité DMA permettant d’initier des transferts vers la mémoire. Pour cela, il est composé d’un port VCI initiateur. Le MULTI_IOC possède aussi un port VCI cible lui permettant de recevoir les diffé-rentes commandes de configuration en provenance des machines virtuelles. Ces configurations sont gérées par l’automate CONFIG_FSM. Lorsque ce dernier reçoit les commandes, il détecte le canal ciblé par la configuration et écrit dans les différents registres du canal ciblé. L’automate CMD_FSM est en charge d’émettre les requêtes d’écriture ou de lecture vers la mémoire. Cet automate est au service des différents canaux du composant. Pour cela, il utilise une politique Round-Robin pour servir les différents canaux demandeurs. Les canaux du composant MULTI_IOC contiennent un ensemble de registre permettant d’initier des opérations de lecture ou d’écriture sur le disque associé au canal, ainsi qu’un automate CH_FSM. Cet automate est en charge d’accéder au disque associé au canal et d’effectuer une demande à l’automate CMD_FSM pour venir lire ou écrire en mémoire. Chaque canal possède aussi une ligne d’interruption reliée au composant IOPIC, permettant ainsi de signaler à la machine virtuelle associée au canal que celui-ci a terminé l’opération demandée.

Ce composant permet aux machines virtuelles d’accéder simultanément à leur disque. En re-vanche, l’émission ou la réception de données vers la mémoire est sérialisée par l’automate CMD_FSM, et par la présence d’un unique port VCI initiateur. Ceci peut induire un point de contention lorsque plusieurs machines virtuelles décident d’effectuer des opérations sur leur disque. Cependant, il est important de noter que le surcout, en termes de cycles, reste minime car le temps de transfert d’un bloc du disque vers la mémoire est très inférieur à la latence d’accès d’un disque. Or, les disques peuvent être accédés de façon parallèle, ce qui implique que le surcoût induit par la présence d’un seul port initiateur reste peu pénalisant.

Les registres adressables, répliqués par canal, du composant MULTI_IOC sont présentés dans la table 4.3.

Nom du registre Permission d’accès Taille (en bits)

BLK_DEV_BUFFER Écriture / Lecture 32

BLK_DEV_BUFFER_EXT Écriture / Lecture 8

BLK_DEV_LBA Écriture / Lecture 32

BLK_DEV_COUNT Écriture / Lecture 32

BLK_DEV_OP Écriture 2

BLK_DEV_STATUS Lecture 4

BLK_DEV_IRQ_ENABLE Écriture / Lecture 1

BLK_DEV_SIZE Lecture 32

BLK_DEV_BLOCK_SIZE Lecture 32

TABLE4.3 – Table des registres adressables du MULTI_IOC

BLK_DEV_BUFFER: ce registre contient les 32 bits de poids faible de l’adresse source ou destination de

Chapitre 4. Solutions

Utilisés par Configuration des canaux

Registres de configuration Config FSM LOCAL CROSSBAR CMD FSM Registres de configuration Registres de configuration

Canal 0 Canal 1 Canal n

Initie

Multi IOC

Requêtes VCI Commande Requêtes VCI Réponse

Port VCI Initiateur Port VCI Cible Automate à États Finis

Matériel Composant Matériel

CH0 FSM Disque n Disque 1 Disque 0 CH1 FSM CHn FSM Accède Accède Accède Initie Lignes d'interruptions

FIGURE4.15 – Architecture interne du MULTI_IOC

la requête (selon l’opération).

BLK_DEV_BUFFER_EXT: ce registre contient les 8 bits d’extension de l’adresse source ou destination de la requête.

BLK_DEV_LBA: ce registre contient le Logical Block Address, ou numéro de secteur, ciblé par la requête.

Chapitre 4. Solutions

BLK_DEV_OP: une écriture à cette adresse permet d’informer le contrôleur de l’opération qui doit être réalisée, une lecture ou une écriture d’un bloc. Ce registre permet d’initier le transfert.

BLK_DEV_STATUS: ce registre contient le statut du canal, il peut contenir 5 valeurs : BLK_IDLE signi-fiant que le canal est disponible, BLK_BUSY signisigni-fiant que le canal est en cours de fonctionnement, BLK_READ_SUCCESS signifiant qu’une opération de lecture s’est bien réalisée, BLK_READ_ERROR signifiant qu’une erreur est survenue pendant une opération de lecture, BLK_WRITE_SUCCESS signifiant qu’une opération d’écriture s’est terminée sans erreur, BLK_WRITE_ERROR signifiant qu’une erreur est survenue pendant une opération d’écriture.

BLK_DEV_IRQ_ENABLE: ce booléen permet d’activer ou non la génération d’une interruption matérielle à la fin du traitement d’une requête.

BLK_DEV_SIZE: ce registre contient la taille totale du disque dur associé au canal, en nombre de blocs.

BLK_DEV_BLOCK_SIZE: ce registre contient la taille d’un bloc en octets.

Le registre qui pose problème est le registre BLK_DEV_BUFFER. L’adresse fournie par le système d’exploitation est une adresse machine. Dans le cas d’une lecture, le composant se sert de cette adresse pour écrire dans la mémoire. Or, cette adresse n’a de sens que derrière un Hardware Ad-dress Translator. Avec la traduction fournie par un Hardware AdAd-dress Translator les aAd-dresses émises par le disque seront redirigées vers les clusters de la machine virtuelle qui a initiée la transaction. Cepen-dant le composant MULTI_IOC est multi-canaux. Un canal étant affecté à une machine virtuelle, il est donc nécessaire que le Hardware Address Translator devant le disque soit capable de fournir une traduction différente pour chaque canal.