• Aucun résultat trouvé

Composants mémoire

wing1234spécifie les attributs de cache pour la page physique. L’argument pp renseigne les droits d’ac- cès à la page, par exemple uniquement en mode superviseur. Le typePTEretourné parGetMapping

correspond à l’entrée de la translation dans la table de page. Ce type est spécifié par le POWERPC. Les méthodesSetBATetRemoveBAT permettent respectivement de programmer et d’effacer les quatre registres BAT « Block Address Translation ». Ces registres offrent un moyen commode de créer des translations arbitraires de blocs mémoires sans nécessiter de mettre en place une table de page. Modulo la taille size qui spécifie la taille du bloc, les arguments deSetBATsont les mêmes queAddMapping.

5.2.3 Pilotes de périphériques

La bibliothèque KORTEX fournit des composants implantant des pilotes de périphériques. Ces composants permettent de contrôler la majorité des périphériques qui apparaissent dans les POWER- MACINTOSH. Cela inclut les bus PCI, l’accès au logiciel de pilotage du matériel « firmware », les contrôleurs d’interruption PIC, les cartes réseaux Ethernet et les cartes graphiques via le « frame buf- fer ». Il y a une interface spécifique par type de périphérique. Chaque interface est aussi proche que possible des ressources matérielles. Le problème de cette approche est de masquer les spécificités des périphériques. Un utilisateur qui souhaite accéder à ces dernières pourra toujours développer son propre pilote. Nous présentons à la section 5.5.4 l’interface offerte par les pilotes de cartes réseaux. La liste des pilotes est donnée à la section 5.8

5.3

Composants mémoire

KORTEXfournit des composants de gestion de la mémoire implantant différents modèles de mé- moire ; la mémoire paginée et la mémoire plate. Les composants offrant la mémoire paginée peuvent être utilisés par les systèmes nécessitant plusieurs espaces d’adressage, par exemple pour offrir le concept de processus. Les composants offrant la mémoire plate peuvent être utilisés par les systèmes nécessitant uniquement un espace d’adressage noyau, comme les systèmes dédiés à une application. KORTEX fournit aussi des composants offrant l’allocateur dynamique de mémoire. Ces différentes implantations sont expliquées ci-dessous.

5.3.1 Modèle de mémoire paginée

Plusieurs composants sont nécessaires pour implanter le modèle de mémoire paginée. Ces com- posants peuvent bien évidemment être utilisés individuellement pour par exemple implanter d’autres modèles de mémoire.

La pagination requiert tout d’abord un composant permettant d’allouer individuellement des pages physiques. Ces pages pourront alors être couplées dans les différents espaces d’adressage vir- tuels. KORTEXfournit un composant implantant un « buddy system » [Knuth 1973] permettant l’al-

location des pages physiques. L’interfacePagefournie par ce composant est donnée à la figure 5.4.

1

“W” pour « Write-Through »

2“I” pour « caching-Inhibited » 3

“M” pour « Memory Coherency »

4

La méthodeallocpermet l’allocation d’un nombre 2orderde pages physiques consécutives, l’entier retourné est l’adresse de la première page physique. La méthodefreepermet la libération des pages. La méthodesizeest utilisée pour connaître la taille de la mémoire physique.

interface Page extends ResourceFactory{ int alloc(int order);

void free(int page, int order);

int size(); }

FIGURE5.4 – Interface du « buddy system »

L’interfaceSpacedonnée à la figure 5.5 représente l’abstraction d’un espace d’adressage. Cette interface offre toutes les méthodes permettant de gérer les translations d’adresse. C’est une res- source abstraite et elle étend donc l’interface AbstractResourcedu modèle de ressources. La méthodemapcouple la page virtuelle virt avec la page physique phys,unmapest l’opération duale. La méthodetophysretourne l’adresse physique correspondant à l’adresse virtuelle virt. La méthode

ioremapcouple dans l’espace d’adressage virtuel une adresse physique spécifique,iounmapest l’opération duale. Ces deux méthodes sont utilisées pour accéder depuis un espace virtuel aux re- gistres des différents périphériques. La méthode ioalloc alloue des pages mémoires en vue de les utiliser avec les différents périphériques,iofreeest l’opération de libération. Cette méthode est nécessaire car certains périphériques ont des contraintes d’alignement sur les données qu’ils accèdent. La méthode getidretourne un identifiant qui identifie de façon unique l’espace d’adressage. Cette valeur est utilisée pour construire les seize segments qui seront identifiés par de getid << 4 à getid << 4 + 16. La méthodesetspaceest utilisée pour activer un espace d’adressage, elle est utilisée durant les changements de contexte.

Cette interface est implantée par le composantpagetable. Durant son initialisation, ce com- posant met en place une table de page et l’espace d’adressage virtuel du domaine superviseur dont l’identifiant est 0. Ce composant est implanté en utilisant l’interfaceMMU, voir la section 5.2.2, mais fournit une abstraction de plus haut niveau comprenant la gestion des registres de segments. Pour des raisons d’efficacité, 1 Go de l’espace de 4 Go est réservé pour le domaine superviseur et est partagé par tous les autres domaines. Néanmoins, cet espace n’est accessible qu’en mode superviseur.

L’interface SpaceFactory est utilisée lors de la création de nouveaux espaces d’adressage pour les domaines applicatifs. Cette interface est une usine et étend doncResourceFactory. La seule méthode estnewet elle crée un nouvel espace d’adressage de typeSpace. Cette interface est implantée par le composantspacefactory.

Modèle de mémoire plate

Le modèle de mémoire plate est plus simple à mettre en œuvre et nécessite un seul composant. Ce modèle peut être utilisé lorsque le système requiert uniquement un seul espace d’adressage, à savoir le domaine superviseur. Ce composant, nommé flat, implante la même interface Space

que pour le modèle de mémoire paginée. L’implantation de ce composant est donc essentiellement vide et les adresses virtuelles sont égales aux adresses physiques. Son unique rôle est de procurer

5.3. Composants mémoire 95

interface Space extends AbstractResource { void map(int virtpage, int physpage,

int wimg, int pp); void unmap(int virtpage);

int tophys(int virtpage);

char[] ioremap(int physaddr, int size, int wimg);

void iounmap(char[] virtaddr, int size);

char[] ioalloc(int size);

void iofree(char[] virtaddr, int size);

int getid();

void setspace(); }

FIGURE5.5 – InterfaceSpace

interface SpaceFactory extends ResourceFactory {

Space newSpace(); }

FIGURE5.6 – InterfaceSpaceFactory

un accès transparent aux espaces d’adressage pour tous les autres composants, comme les pilotes de périphérique qui requièrent des possibilités de couplage de pages pour accéder aux registres matériels. Cela permet de faire fonctionner le même composant indépendamment sur la mémoire plate ou la mémoire paginée.

5.3.2 Allocateur dynamique de mémoire

Un allocateur dynamique de mémoire offre classiquement les opérations d’allocation et de libé- ration de zone mémoire. Un allocateur implante l’interfaceAllocator donnée à la figure 5.7. La méthodeallocpermet d’allouer de la mémoire et la méthodefreepermet de la libérer.

interface Allocator extends ResourceFactory {

char[] alloc(int size);

void free(char[] addr); }

Cette interface est actuellement implantée par un composant fournissant l’implantation de l’allo- cateur de mémoire standard de GNU. Cet algorithme est du type « best-fit » [Knuth 1973] et permet de minimiser la fragmentation. Cet allocateur fonctionne indépendamment du modèle de mémoire sous- jacent grâce à un composant intermédiaire réalisant l’équivalent de l’appel système UNIXsbrk. Un tel composant implante l’interface Sbrk donnée à la figure 5.8. La méthodealloc permet d’ac- croître la taille du segment de données du domaine. Cet intermédiaire est nécessaire car le segment de données ne doit pas être discontinu.

interface Sbrk {

char[] alloc(int size);

}

FIGURE5.8 – InterfaceSbrk

Cette interface est implantée par deux composants. Le premier fonctionne sur le modèle de mé- moire plate. Son fonctionnement est trivial et consiste uniquement à incrémenter un pointeur de fin de segment. Le deuxième fonctionne sur le modèle de mémoire paginée. Son fonctionnement consiste à allouer des pages physiques et à créer les translations associées quand le segment croît. Outre le fait de pouvoir être utilisé dans le domaine superviseur, le deuxième composant peut aussi être utilisé dans les domaines applicatifs. Ainsi, l’allocateur est lui aussi utilisable quel que soit le domaine.