2017-03-13 10 views
0

J'ai une question rapide sur les TLB et les ASID dans ARMv8-A. D'après ce que je comprends (du guide du programmeur d'ARM et du Manuel de référence de l'architecture):
- Les descripteurs de page/de bloc (entrées de tableau MMU de feuille) ne contiennent pas d'identificateur ASID, seulement un bit nG (non global), qui dit ASID devrait être utilisé pour cette page.
- La valeur ASID réelle qui correspond à la valeur de registre réside dans le TLB. Il est défini lors de la marche d'une page et que l'entrée correspondante est ajoutée au TLB (avec l'ASID actuel, de sorte que les recherches TLB suivantes vérifient que le nouvel ASID correspond). Dites que je veux utiliser ASID pour éviter la mise à jour des tables lors du changement de contexte. Chaque processus a une valeur ASID résidente. Traitez 1 certaines données à vaddr a1, processus 2 à vaddr a2. Le contexte I passe de 1 à 2. Au cours de l'exécution, l'entrée TLB correspondant à a1 est éjectée (pour une raison quelconque). Processus 2 accède à a1, un échec TLB se produit, et une page marche arrive, réussit et stocke l'entrée du processus 1 en utilisant la valeur ASID2, donnant l'accès de processus 2 aux données de processus 1.Pourquoi ASID seulement dans le TLB dans ARMv8-A? Comment éviter l'accès non-amorcé à la mémoire présente dans les tables mais éjecté de TLB?

Qu'est-ce que je ne comprends pas? Le mécanicien ASID ne devrait-il pas assurer la sécurité entre les processus 1 et 2 tout en évitant de mettre à jour les tables?

Facultatif question: si tous mes programmes ont .text section à la même adresse virtuelle (au moins, tous les programmes ont la même adresse de point d'entrée), dois-je mettre à jour les tables chaque fois que je change de contexte ou puis-je avoir plusieurs entrées? correspondant à la même vaddr, en utilisant différents ASID?

Répondre

0

Il semble que j'ai eu une idée fausse sur les ASID. J'ai eu la réponse grâce au commentaire de @ artlessnoise.

Dans le cas que je décrivais, j'ai manqué le fait que nous devions cartographier les pages du processus 2 à un moment donné.

Alors ce que nous faisons est la suivante:
- tables de mise à jour: ajouter processus 2 de pages, et supprimer tout processus de page 2 ne doit pas voir (y compris, dans mon exemple, la page à l'adresse a1)
- Change l'ASID de sorte que toute valeur mise en cache avec un ancien ASID ne puisse pas être utilisée dans TLB
- Démarrer le processus 2. Si la page correspondante du processus 1 est toujours mise en cache dans TLB, elle est ignorée (puisque la désadaptation ASID). Dans les deux cas, une marche de page se produit, avec la table mise à jour ne contenant que des pages accessibles par processus-2. La sécurité (principale) est donc fournie par les tables présentes lorsque le processus 2 est en cours d'exécution. Et sécurité supplémentaire dans le TLB seulement est fourni par le mécanicien ASID, nous permettant de ne pas vider le TLB à chaque contexte commutateur. EDIT: Une autre solution (tirée par les cheveux) consiste à désactiver les marches sur les pages non mises en cache (déclencher une erreur MMU à la place) et à vérifier manuellement (à partir du noyau) les permissions chaque fois qu'un processus accède à -Page page Il semble horrible au niveau de la performance (ainsi que du design).

+0

ASID dans TLB n'est pas la sécurité, mais l'optimisation de vider maintenant plein TLB sur le changement de contexte. Chaque processus ** a son propre mappage de mémoire virtuel-physique **, et sans ASID OS va supprimer toutes les entrées TLB de TLB au commutateur de processus. Avec ASID OS peut conserver d'anciennes entrées TLB dans certains cas. – osgx

+1

@osgx C'est exactement ce que je veux dire dans ma réponse.La raison pour laquelle je ne l'ai pas compris plus tôt est que j'ai surestimé le coût de changement de pages (très faible - seulement quelques requêtes L1) par rapport au coût de rinçage TLB (très haut - déclenche beaucoup de promenades). – maxbc

+0

maxbc, oui, le point est que c'est * une optimisation *, lire plus dans ["Systèmes d'exploitation: Trois Easy Pieces"] (http://pages.cs.wisc.edu/~remzi/OSTEP/) (Remzi H Arpaci-Dusseau et Andrea C. Arpaci-Dusseau) ch. 19 "vm-tlb": http://pages.cs.wisc.edu/~remzi/OSTEP/vm-tlbs.pdf#page=9 "* Pour réduire ce surdébit, le champ Identificateur d'adresse d'adresse (ASID) TLB * " – osgx

2

Processus 1 certaines données à vaddr a1, processus 2 à vaddr a2. I contexte passer de 1 à 2. Pendant l'exécution, l'entrée TLB correspondant à a1 est éjectée (pour une raison quelconque). Processus 2 accède a1, une erreur TLB se produit et une marche de page se produit, réussit et stocke l'entrée du processus 1 en utilisant la valeur ASID2, donnant au processus 2 un accès aux données du processus 1.

Lorsque Process 1 veut accéder à vaddr a1, il s'agit en fait d'une adresse marquée comme vaddr_a1_with_asid_P1. Lorsque le processus 2 veut accéder à vaddr a1, il s'agit en fait d'une adresse marquée comme vaddr_a1_with_asid_P2. Ainsi, dans TLB, chaque entrée TLB contient à la fois des informations VIDDR et ASID de processus. Ensuite, "Process 2 accède à a1, une erreur TLB se produit et une marche de page se produit, réussit et stocke l'entrée du processus 2 en utilisant la valeur ASID2" ne se produira pas.

Même pour le même vaddr a1, deux processus différents access a1 généreront deux entrées TLB différentes. L'un est marqué avec ASID P1, l'autre est marqué avec ASID P2.

Question facultative: si tous mes programmes ont section .text à la même adresse virtuelle (au moins, tous les programmes ont la même adresse le point d'entrée), dois-je mettre à jour les tables chaque fois que je changement de contexte ou Puis-je avoir plusieurs entrées correspondant à la même vaddr, en utilisant différents ASID ?

Actullay, OS veillera à ce que. Par exemple, Linux OS affectera un ASID unique à un processus.Pour le registre ASID 8 bits ou 16 bits, la plage ASID totale est limitée.

Ainsi, lorsque tous les ASID seront utilisés, Linux OS invalidera l'ensemble du TLB et réattribuera le numéro ASID de 0 au début de la deuxième boucle.

+0

Citation de la PG ARMv8-A (page 12-4): "Le [...] TLB est un cache des traductions de pages récemment consultées". Ainsi, comme tout cache, une entrée peut être éjectée à tout moment, perdant sa liaison ASID spécifique (qui n'existe que dans le TLB). Si par la suite l'entrée TLB est manquante, une marche de table se produit et assigne le CURRENT à l'entrée TLB nouvellement ajoutée (voir aussi page 12-27). NB: J'écris un OS – maxbc

+0

@maxbc La réponse et votre commentaire sont corrects. Le TLB est un 'cache adressable de contenu'. Les tags ne sont pas seulement l'adresse 'a1', mais aussi l'ASID. Si votre p1/p2 accède à la fois à 'a1', le TLB a deux entrées allouées. Votre système d'exploitation doit veiller à définir correctement l'ASID si vous avez l'intention d'accéder à une version spécifique. Une autre façon est d'avoir un troisième mappage qui est seulement accessible par privilège; vous auriez un mappage d'alias 'super VA' pour chacune des adresses de processus 'a1' dans ce cas. Vous devez également mettre à jour les tables de pages lors d'un changement de processus. Les entrées de premier niveau sont également mises en cache. –

+2

L'avantage de l'ASID est que les mémoires cache TLB et D/I n'ont pas besoin d'être vidées/invalidées pour conserver des données cohérentes. Le système d'exploitation doit encore les gérer sur un changement de contexte, si je comprends bien ... «ai-je besoin de mettre à jour les tables chaque fois que je change de contexte»; Oui absolument. Comment savez-vous s'ils sont dans le TLB/cache ou non? Vous n'avez pas besoin de créer les tables à chaque fois, seules les entrées L1 doivent être modifiées. Voir; [MMU et tables de pages] (http://stackoverflow.com/questions/9929755/do-multi-core-cpus-share-the-mmu-and-page-tables/33239191#33239191) –