1. #1
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    mars 2009
    Messages
    337
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 337
    Points : 70
    Points
    70

    Par défaut registre cr0 et assembler in line (VS C++)

    Hello world

    J'ai traduis depuis un cod en assembleur GCC en assembleur en ligne pour Visual C ++. Sa compile bien mais quand je débogue les applications freeze quand elle rencontre le registre cr0. L'espion m'indique des valeurs pour tout les registres sauf cr0. Malgre que je soit en mode Kernel j'ai cette erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cr0	CXX0017: Error: symbol "cr0" not found
    Visual C++ assembler in line code:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void disableCache(void)
    {
       uint32_t mask = (1 << 30) | (1 << 29);
       __asm
       {
          mov ecx,mask
          mov eax,cr0
          or eax,ecx
          mov cr0,eax
       }
      return;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void enableCache(void) 
    {
    	uint32_t mask = ~((1 << 30) | (1 << 29)); // CD | NW
    	  __asm
       {
          mov ecx,mask
          mov eax,cr0
          and eax,ecx
          mov cr0,eax
       }
      return;
    }
    Pouvez vous m'aider SVP?

    THX

    NB: le code original en GCC inline.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    void disableCache(void) {
      uint32_t mask = (1 << 30) | (1 << 29); // CD | NW
      __asm__ __volatile__ ("movl %%cr0,%%eax\n"
                            "orl %%ecx,%%eax\n"
                            "movl %%eax,%%cr0"
                            :
                            :"c"(mask)
                            :"eax","memory");
      return;
    }
     
    void enableCache(void) {
      uint32_t mask = ~((1 << 30) | (1 << 29)); // CD | NW
      __asm__ __volatile__ ("movl %%cr0,%%eax\n"
                            "andl %%ecx,%%eax\n"
                            "movl %%eax,%%cr0"
                            :
                            :"c"(mask)
                            :"eax","memory");
      return;
    }

  2. #2
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    mars 2009
    Messages
    337
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 337
    Points : 70
    Points
    70

    Par défaut

    Dans les 2 cas sa freeze a cette ligne:


  3. #3
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    mars 2009
    Messages
    337
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 337
    Points : 70
    Points
    70

    Par défaut

    Il semble que le premier code est des redondance et il peut etre reecrit ainsi, de plus je travail sur une veille config avec seulment 128mo de ram:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    void disableCache(void)
    {
          __asm
       {	   
    	mov     eax, cr0   
            or        eax, 0FFFFFFFH   
            mov     cr0, eax
       }
      return;
    }
    penser qu'il produit le meme resultat?

  4. #4
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    9 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 9 005
    Points : 19 847
    Points
    19 847

    Par défaut

    Je présumes que tu veux activer/désactiver le cache. Tu dois dans ce cas masquer ou forcer à 1 le bit 30 de cr0 sans modifier les autres bits.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  5. #5
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    mars 2009
    Messages
    337
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 337
    Points : 70
    Points
    70

    Par défaut

    Merci

    Citation Envoyé par chrtophe Voir le message
    Je présumes que tu veux activer/désactiver le cache. Tu dois dans ce cas masquer ou forcer à 1 le bit 30 de cr0 sans modifier les autres bits.
    Je ne sais pas comment faire. Sa freeze toujours a cette ligne:

    J'ai trouve ce code mais sa freeze toujours:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mov eax,cr0
    	or  eax,60000000h
    	mov cr0,eax
    Sinon j'ai sa, sa freeze pas mais je sais si c'est la meme chose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        mov     eax, cr0
        bts     eax, 30
        btr     eax, 29
        mov     cr0, eax

  6. #6
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    mars 2008
    Messages
    274
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : mars 2008
    Messages : 274
    Points : 460
    Points
    460

    Par défaut

    ce code met le bit 29 et 30 a 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mov eax,cr0
    or  eax,60000000h
    mov cr0,eax

    ce code met le bit 30 a 1 et le bit 29 a 0:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mov eax,cr0
    bts     eax, 30
    btr     eax, 29
    mov cr0,eax
    si tu veux seulement mettre le bit 30 a 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mov eax,cr0
    or  eax,40000000h
    mov cr0,eax
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mov eax,cr0
    bts     eax, 30
    mov cr0,eax

  7. #7
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    mars 2009
    Messages
    337
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 337
    Points : 70
    Points
    70

    Par défaut

    Merci
    Du coup si je fait sa est ce que j'aurais 29 et 30 = 1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    mov eax,cr0
    bts     eax, 30
    bts     eax, 29
    mov cr0,eax

  8. #8
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    mars 2008
    Messages
    274
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : mars 2008
    Messages : 274
    Points : 460
    Points
    460

    Par défaut

    oui, l'intruction "bts reg/mem,x" signifie Bit Test and Set. ça met le bit x de reg/mem dans le bit de retenue (carry flag) et met a un le bit dans reg/mem et dans le même esprit btr signifie Bit Test and Reset (on met le bit a zéro), btc signifie Bit Test and Complement (on inverse le bit), et bt pour Bit Test (qui ne modifie pas le bit)

  9. #9
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    mars 2009
    Messages
    337
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 337
    Points : 70
    Points
    70

    Par défaut

    Du coup j'ai le meme freeze donc conclusion c'est le passage du bit 29 vers 1 qui pose probleme...

  10. #10
    Responsable Systèmes


    Homme Profil pro
    Technicien maintenance
    Inscrit en
    août 2011
    Messages
    9 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : août 2011
    Messages : 9 005
    Points : 19 847
    Points
    19 847

    Par défaut

    A mon avis, tu génère une exception que l'os n'arrive pas à résoudre.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur la création d'un système : http://chrtophe.developpez.com/tutoriels/minisysteme/
    Mon article sur le P2V : http://chrtophe.developpez.com/tutoriels/p2v/
    Consultez nos FAQ : Windows, Linux, Virtualisation

  11. #11
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    mars 2008
    Messages
    274
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : mars 2008
    Messages : 274
    Points : 460
    Points
    460

    Par défaut

    j'ai trouvé ici: https://software.intel.com/en-us/art...dm#nine-volume dans le volume 3A chapitre 11 a la page 424, des informations sur l'effet du changement de bit 30(CD) et 29(NW)
    il semblerait que le mode de cache avec ces deux bit a 1 ne soit pas supporté par les processeur a partir du pentium4, sans doute est ce que la source dont tu test inspiré pour écrire ton code est trop ancienne

    et par curiosité, pourquoi vouloir désactiver le cache?

  12. #12
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    mars 2009
    Messages
    337
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 337
    Points : 70
    Points
    70

    Par défaut

    Je travaille sur un PIII. C'est du tres vieux hardware.

  13. #13
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    mars 2009
    Messages
    337
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 337
    Points : 70
    Points
    70

    Par défaut

    Ce code ne freeze pas mais je sais si il fait le job:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        mov eax, cr0
        or  ax, 1
        mov cr0, eax

  14. #14
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    mars 2008
    Messages
    274
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : mars 2008
    Messages : 274
    Points : 460
    Points
    460

    Par défaut

    ces lignes font passer le processeur en mode protégé, et si t'est déjà en mode protégé, c'est normal que ça ne fasse rien

    comment est exécuté ton programme?

  15. #15
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    mars 2009
    Messages
    337
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 337
    Points : 70
    Points
    70

    Par défaut

    Citation Envoyé par bifur Voir le message
    j'ai trouvé ici: https://software.intel.com/en-us/art...dm#nine-volume dans le volume 3A chapitre 11 a la page 424, des informations sur l'effet du changement de bit 30(CD) et 29(NW)
    il semblerait que le mode de cache avec ces deux bit a 1 ne soit pas supporté par les processeur a partir du pentium4, sans doute est ce que la source dont tu test inspiré pour écrire ton code est trop ancienne

    et par curiosité, pourquoi vouloir désactiver le cache?
    c'est pour utiliser toute la ram dispo, au lieu de la moitié sur une apps precise. Bon il s'agit de vieux matos PIII avec 128mo de ram.
    Du coup comment desactivé les deux?

    NB: ce petit semblerait resoudre mon probleme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    mov ecx, 0x2ff
    rdmsr
    mov al, 0x06
    wrmsr

  16. #16
    Membre confirmé Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    mars 2008
    Messages
    274
    Détails du profil
    Informations personnelles :
    Âge : 33

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : mars 2008
    Messages : 274
    Points : 460
    Points
    460

    Par défaut

    j'ai jamais entendu parler que la désactivation du cache faisait gagner de la ram (et encore moins la doubler) et le bout de code que tu as proposé semble bien configurer la ram mais pour le moment c'est pas facile a comprendre parce que ça fait appel aux "machine specific register" que je n'avait jamais cherché a manipuler


    edit: peut être que pour pouvoir utiliser plus de ram pour ton app il faudrait voir du coté du système d'exploitation (c'est lui qui gère l'allocation des ressources)

  17. #17
    Membre régulier Avatar de Nono Sto
    Profil pro
    Inscrit en
    mars 2009
    Messages
    337
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : mars 2009
    Messages : 337
    Points : 70
    Points
    70

    Par défaut

    Merci à tous

    Il semblerait qu'il y ait un souci avec les PIII :

    cr0 supports many different features but only the CD and NW flags have to do with caching. In other words, don't waste time experimenting with other bits.
    For the Pentium III, when CD and NW bits are set, external snoops are supported only on dual processors, so it will hang in uniprocessor systems as you could confirm. If you don't snoop it will run good.
    En debug sa freeze toujours alors que lorsque je lance normalement le programme pas de souci...c'est bizarre...

  18. #18
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    décembre 2013
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : décembre 2013
    Messages : 14
    Points : 1
    Points
    1

    Par défaut Initialisations....de la GDB

    Bonjour tout le Monde


    Avant de commuter en mode protege, il faut initialiser la GDT de facon a ce qu'apres le passage dans le nouveau mode, il n'y ait pas de probleme d'adressage. La GDT doit contenir des descripteurs pour les segments de code, de donnees et de pile.


    Cordialement.

Discussions similaires

  1. [Windows]accès base de registre windows
    Par Greg01 dans le forum APIs
    Réponses: 27
    Dernier message: 05/06/2007, 15h14
  2. Utilisez vous la base de registres ?
    Par gRRosminet dans le forum C++Builder
    Réponses: 8
    Dernier message: 04/06/2002, 13h55

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