IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Assembleur Discussion :

Cache L1


Sujet :

Assembleur

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut Cache L1
    Il paraît qu'au niveau de la cache L1, il y a deux séparations, une cache d'instructions et une cache de données, je dirais même que j'en suis sûr. Ce que je voulais savoir c'est comment ce comporte le bout de code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    code segment
    or [variable],1
    ...
    data segment
    variable db 0
    Je suppose que mes deux lignes sont alignées dans un pacquet de 64 octets pour une montée simplificatrice des instructions de L2 vers L1.
    La L1-instruction reçoit donc l'instruction "or" et doit modifier la "variable" mais la variable, étant donné que "variable" existe déjà au niveau de L1-instruction, y a-t-il copie de la L1-instruction vers la L1-données ou copie de la L2 vers la L1-données ???

    J'espère que j'ai été assez clair. Merci d'avance
    Ma boule de cristal s'était éclaircie et puis plus rien. Alors je me suis mis à internet et maintenant j'ai plus de renseignements qu'avec cette satané boule .....

  2. #2
    Membre habitué Avatar de - Robby -
    Inscrit en
    Juillet 2003
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 266
    Points : 170
    Points
    170
    Par défaut
    Quand ton processeur rencontre ton instruction "or", comme présenté dans tes lignes de codes, c'est la première fois qu'il rencontre la "variable". Au meme titre qu'il existe des "coupures" de linéarité dans le cache code quand il rencontre une instruction de saut, il existe des coupures de linéarité dans le cache données quand, comme ici, il y a demande d'acces immédiat a une donnée non reprise dans le contexte cache-données. Il n'y aura donc, a mon avis, pas copie de L1-instruction vers L1-données, mais de L2 vers L1-données. Cela aurait été différent, et probablement l'inverse, si le programme avait déjà rencontré "variable" précédemment. Elle se trouverait alors probablement dejà dans le cache données. A moins que la dernière référence a "variable" remonte a trop longtemps. Dans ce cas, "varaible" a disparu du cache et demande un rechargement. ...
    Tout ceci ... a mon avis !
    ou alors j'ai rien compris a la question ...

  3. #3
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    Merci de ta réponse Robby et effectivement tu as bien compris la question. Et j'ai bien oublié de préciser que c'est la première fois que "variable" était rencontré.

    Mais qu'est ce que tu entends par "coupure" lors d'un saut ?
    Pour moi, s'il y a un saut disons au niveau du 20ème octet, il y a quand même les 44 octets restant qui ont été chargés dans la L1-Ins et il recharge en plus les 64 octets de la zone où se trouve le label vers lequel le proc doit aller. Enfin, je suppose. Si j'ai faux que quelqu'un me le dise, SVP.
    Ma boule de cristal s'était éclaircie et puis plus rien. Alors je me suis mis à internet et maintenant j'ai plus de renseignements qu'avec cette satané boule .....

  4. #4
    Membre habitué Avatar de - Robby -
    Inscrit en
    Juillet 2003
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 266
    Points : 170
    Points
    170
    Par défaut
    Une coupure .... de séquence. Un saut quoi, un jmp, un call, une int, un sysenter ... tout ca quoi. Si cette rupture de séquence arrive au 20ème octet, les 44 qui suivent deviennent obsolètes. Dans ce cas, je pense bien que le cache est vidé et rechargé complètement. Le principe du cache est l'anticipation. A chaque rupture de séquence, cette anticipation n'a plus de sens et le cache est ré-initialisé. Idem pour le cache données quand il rencontre une rupture de contexte ... nouvelle variable inconnue dans le cache par exemple.

  5. #5
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    ok je pense que c'est que je pensais . Par contre, j'ai un hic avec ce que tu dis :
    Dans ce cas, je pense bien que le cache est vidé et rechargé complètement
    Je pense plutôt qu'il charge en cache le label suivant mais que l'ancien reste en cache sinon à koi ça servirait d'avoir 64ko de cache L1-Ins ???

    Au niveau du cache de données, je ne vois pas comment avoir une rupture de séquence ?
    Si on a deux variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    var1 dw ?
    var2 dw ?
    Quand on travaille pour la première fois sur var1 sans avoir touché à var2, on charge en L1-data 64octets pouvant contenir var1. Maintenant, si je travaille sur var2, il ne va pas recharger la L1-data si var2 appartient aux 64 octets de var1 ? (J'espère que je suis clair).
    En gros, la seule manière dont je puisse voir une rupture de données c'est si var1 est en enjambement sur le 64ème et le 65ème octet.
    Heu... je commence à me pommer là. J'ai raison ou pas ???
    Ma boule de cristal s'était éclaircie et puis plus rien. Alors je me suis mis à internet et maintenant j'ai plus de renseignements qu'avec cette satané boule .....

  6. #6
    Membre habitué Avatar de - Robby -
    Inscrit en
    Juillet 2003
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 266
    Points : 170
    Points
    170
    Par défaut
    Difficile d'aller plus loin dans mes certitudes !
    Ma connaissance date de processeurs plus anciens... 386,486 !
    Avant tout, il faut bien se rendre compte que le code machine est exécuté au départ du cache et non de la mémoire centrale ... dans la plupart des cas ... c'est le but du cache.
    Franchement, quand il y a rupture de séquence-code, je ne pense pas que le processeur conserve quoi que ce soit en cache. Il faut bien comprendre que la mémoire cache est chargée avec l'environnement code immédiat de l'instruction en cours. Je ne pense meme pas que cette mémoire cache se remplit, se complète, de facon linéaire au fur et a mesure de l'avancement dans le programme. Je pense plutot qu'elle est chargée par bloc de 64ko, suivant un algorithme de statistiques micro cablé dans le µP. Je pense qu'en cas de rupture de séquence, la notion de contexte-code n'a plus de sens, empéchant dès lors toutes réflexions probabilistes de la part de l'algorithme statistique. Dans ce cas, le cache est vidé par le remplissage d'un nouveau bloc de 64Ko correspondant au nouveau contexte-code ... l'environnement code se trouvant autour du nouveau label. Quand au cache données, je ne connais pas sa taille, mais je suis d'accord avec toi en ce qui le concerne. Je pense que le cache données, dans la meme phylosophie que le cache code, doit contenir l'ensemble des données récemment adressées. Si le cache données est asez grand ... il contiendra assez rapidement toutes les données de ton programmes. Si pas, je pense que la aussi, il doit exister un algo micro cablé d'analyse statistiques, de facon a conserver en cache données les données les plus fréquemment adressées. Voila ...
    Mais ... ouf ... c'est un sujet vachement complexe ...
    et de plus soigneusement gardé secret par ses Maîtres ... clair !

  7. #7
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    merci pour tes infos mais le problème c'est que j'avais posé une question similaire (pour la gestion de la cache) il y a quelques temps (topic : http://www.developpez.net/forums/viewtopic.php?t=90106 ) et justement Blustuff me parlait que ça se chargeait par bloc de 32 octets (oups, pas 64) et quand j'ai demandé si c'était la même chose pour n'importe qu'elle carte mère, personne ne m'avait répondu. Donc, je suis carrément pommé, je deviens fou

    Par contre, si d'autres personnes ont d'autres avis sur ma première question de ce post qu'ils se manifestent !!!

    Et merci encore Robby
    Ma boule de cristal s'était éclaircie et puis plus rien. Alors je me suis mis à internet et maintenant j'ai plus de renseignements qu'avec cette satané boule .....

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Vi, il me semblait bien... J'ai réecrit une réponse tt a l'heure :


    La cache est divisée en lignes de 32 octets.

    Quand le proc lit des données qui ne sont pas présente en L1, il remplit une ligne de 32 octets de la cache L2. Puis si ca n'est pas en L2, dans la RAM. Pour ecrire, ca dépends du proc, sur les PPlain et PMMX, si les données ne sont pas dans la L1, elles peuvent être ecrite directementen L2 ou dans la RAM (suivant la config du cache L2).

    Là, je ne retrouves plus dans les docs, mais quand on doit remplir une ligne de L1, on doit forcement en vider une autre. Et pour ce que je me rappelle, on vide, la plus ancienne. (ca veut dire que pour chaque ligne il y a la dernière date d'accès. - La plus ancienne mais pas forcement la moins fréquement utilisée)

    Si tu veux des conseils d'optimisation, il y a pas mal de trucs concernant la cache. La doc d'optimisation d'Intel est forunie avec MASM32



    32 octets, c'est pour la cache L1, et pour tous les derniers processeurs Intels depuis le PPlain (donc depuis un bout de etemps déjà). Pour la cache L2 vers la RAM, ca je ne sais pas.

  9. #9
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    Heu, t'as pas l'adresse Blustuff de la doc de MASM32 STP pour que j'évite de downloader n'importe koi STP ?

    Par contre Blustuff, t'as pas répondu à ma toute première question du post ? t'en pense koi de mon problème ?
    Ma boule de cristal s'était éclaircie et puis plus rien. Alors je me suis mis à internet et maintenant j'ai plus de renseignements qu'avec cette satané boule .....

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Non, j'ai pas l'adresse, je peux te mailer la doc si tu veux. A priori, c'est bien de la L2 à la cache de code L1. Il n'y a pas de précision la dessus. Mais ca explique en partie qu'il ne faille jamais faire du self-modifing code, puisque le code modifié serait dans la cache de donnée et non pas dans celle de code.

  11. #11
    Membre habitué Avatar de - Robby -
    Inscrit en
    Juillet 2003
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 266
    Points : 170
    Points
    170
    Par défaut
    Pas moyen de faire du self-modifing code avec un µP pentium ou compatible ? ca, c'est dommage ! pas possible, tu confirmes Blustuff ?
    Encore un truc de bidouilleur qui disparait alors !

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    si c'est possible j'ai lu ca, je fais un c/c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    27.9 Self-modifying code (All processors)
     
    The penalty for executing a piece of code immediately after modifying it is approximately 19 clocks for PPlain, 31 for PMMX, and 150-300 for PPro, PII and PIII. The 80486 and earlier processors require a jump between the modifying and the modified code in order to flush the code cache.
     
    To get permission to modify code in a protected operating system you need to call special system functions: In 16-bit Windows call ChangeSelector, in 32-bit Windows call VirtualProtect and FlushInstructionCache (or put the code in a data segment).
     
    Self-modifying code is not considered good programming practice, but it may be justified if the gain in speed is considerable.
    les cas ou ca jusitifie ont l'air d'être rare, et donc finalement l'utilisation de cette methoded semble deevenir complexe et issue d'un calcul de performance prise de tête

  13. #13
    Membre habitué Avatar de - Robby -
    Inscrit en
    Juillet 2003
    Messages
    266
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 266
    Points : 170
    Points
    170
    Par défaut
    Très intéressant Blustuff ... très !
    D'ou vient ce morceau de doc ?
    Pourrais tu me refiler le lien ou tu as pu trouver ces informations ?
    Ca m'intéresse énormément !
    Tout grand merci a toi.

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Cherche le post Optimization (pas le 2, le premier) AMILIN donne des liens vers cette doc.

  15. #15
    Membre habitué
    Avatar de Alacazam
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2002
    Messages : 88
    Points : 167
    Points
    167
    Par défaut
    Bonjour,

    To get permission to modify code in a protected operating system you need to call special system functions: In 16-bit Windows call ChangeSelector, in 32-bit Windows call VirtualProtect and FlushInstructionCache (or put the code in a data segment).
    En fait je voulais savoir comment ça se passait pour les .COM ou l'on peut facilement modifier l'adresse d'un JUMP situé 3 lignes plus bas.

    Le fait qu'il n'y ait qu'un seul segment irait dans le même sens que ça : "put the code in a data segment" ...
    Par contre, je ne vois pas au niveau de la cache comment ça se passe.

    Citation Envoyé par Blustuff
    La cache du code n'est utilisé que pour lire le code, et on ne peut pas modifier son contenu si je me souviens bien (d'ou le danger avec le self-modifying code)
    Est-ce que seule la cache donnée est utilisée ?

    Merci par avance,
    Mathieu
    Développeur confirmé C++, Java, Python, JS.

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Je me suis trompé, ce qu'on ne peux pas faire, c'est changer le code alors que les instructiosn sont déja dans le pipeline. (AMILIN donne les liens vers les docs qui expliquent tout ca).

    On peut modifier exactement de la même manière un jump dans un .com ou dans un .exe.

    Sinon, je ne comprends pas la dedrnière question...

  17. #17
    Membre habitué
    Avatar de TangiX
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    139
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 139
    Points : 168
    Points
    168
    Par défaut
    Au pire on peu peu modifier le code
    et aprés recharger la cache (ya une instruction pour ca ,non?)
    aprés on saute sur le code modifié

    j'ai deja lu cette méthode quelque part
    (peut etre le code d'un virus pratiquant le morphing)

  18. #18
    Membre actif

    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    339
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 339
    Points : 279
    Points
    279
    Par défaut
    Alors là, j'en apprends des bonnes, je comprend maintenant pourkoi certains de mes progs ne fonctionnaient pas

    Oui Blustuff, ta doc m'intéresse évidemment, tu sais que je suis preneur de toutes les docs mais va pas foutre ton forfait pour moi
    Ma boule de cristal s'était éclaircie et puis plus rien. Alors je me suis mis à internet et maintenant j'ai plus de renseignements qu'avec cette satané boule .....

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Oh pardon, je me fait attendre... Mon forfait ? aurais-je parlé de mon forfait ici ?

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    842
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 842
    Points : 696
    Points
    696
    Par défaut
    Palfebreux ! je n'ai plus ton adresse e-mail... Elle a du partir avec la vague de dedstrtuction ded mail sur mon pc...

Discussions similaires

  1. Répertoire caché
    Par KUBITUS dans le forum Delphi
    Réponses: 30
    Dernier message: 13/04/2007, 08h19
  2. XMLGram, Import et cache
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 13
    Dernier message: 05/03/2003, 18h09
  3. Qu'est ce que le cache ?
    Par irrou dans le forum Assembleur
    Réponses: 4
    Dernier message: 25/11/2002, 00h28
  4. Ouvrir (fopen) un fichier caché
    Par shef dans le forum C
    Réponses: 2
    Dernier message: 09/09/2002, 10h06
  5. Webbrowser : Comment ne pas prendre la page en cache
    Par cedm78 dans le forum Web & réseau
    Réponses: 3
    Dernier message: 30/08/2002, 12h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo