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 :

Connaitre la taille de la RAM


Sujet :

Assembleur

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    80
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 80
    Points : 69
    Points
    69
    Par défaut Connaitre la taille de la RAM
    Salut à tous,

    Est e que quelqu'un sait comment connaitre la taille de la RAM (si possible sans utiliser d'interuption) installée dans le PC ?

    Merci d'avance a+.

  2. #2
    Membre habitué
    Avatar de zdra
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2002
    Messages : 164
    Points : 187
    Points
    187
    Par défaut
    euh, avec himem.sys ki gère l'xms ya moyen... regarde dans les programes pascal d'haypo sur www.developpez.com/pascal il a fait un unit ki fait tt ça.

  3. #3
    Membre du Club

    Inscrit en
    Août 2003
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 33
    Points : 45
    Points
    45
    Par défaut
    Salut,
    j'ai un moyen tout simple pour trouver la taille de la RAM (hé, hé, hé... )
    tu fais un compteur ecx allant de 0 à 4294967296-1 (soit 0xFFFFFFFF)
    et tu essayes de lire a l'adresse [ecx]: ex: mov eax, [ecx]
    -> si ya de la RAM à cet endrois, ça marche
    -> sinon ça déclenche une exception du genre "segment fault" ( je ne sais plus quelle intrerruption c'est, on va l'appeler intX avec X qui appartient à [0, 15])
    Ensuite il suffit de faire un détournement d'interruption sur l'intX qui récupèrera la valeur de ecx en cours.
    Et voilà tu l'as ta longueur de la RAM, c'est ecx-2 (en plus c'est super précis, à l'octet près)
    Merci qui ? 8)

  4. #4
    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 tu es sous un os quelconque avec le Mapping tu vas être emmerdé. Si tu est en mode réel, ca ne dépassera pas le Mo. Si tu as passé en mode protégé il aura de toute façon fallu écrire la GDT.

    Mais alors petit problème... La mémoire est detectée par le BIOS. Existe t-il un moyen de faire la même détection que le bios. Je suis emmerdé parce que je ne sais pas. En tout cas, il fallait s'attendre à ce que le bios te donne la taille de la mémoire détectée :

    Int 15h, Fct 88h Lire la taille de mémoire étendue BIOS (> AT)

    Cette fonction permet de déterminer la taille de la mémoire installée au-delà de la limite de 1 Mo.

    Entrée :

    AH = 88h

    Sortie :

    AX = Taille de la mémoire

    Remarques :

    · Le paramètre dans le registre AX est exprimé en Ko.
    · La taille de la mémoire sous la limite de 1 Mo peut être lu à l'aide de l'interruption 12h.
    · Le contenu des registres BX, CX, DX, SI, DI, BP et des registres de segment n'est pas modifié par cette fonction. Le contenu de tous les autres registres peut avoir été modifié.

    M'enfin, on ne s'avouera pas vaincu à ne chercher que dans une doc. A cela, un remède : HelpPC qui est en général plus bavard :

    Citation Envoyé par HelpPC
    - works only on 80286 and 80386 machines
    - retrieves bytes 30 and 31 from the CMOS RAM (this data is set y the boot memory scan)
    Ah ! interessant. Qu'est la CMOS RAM ??

    Citation Envoyé par HelpPC
    CMOS RTC - Real Time Clock and Memory (ports 70h & 71h)

    [...]

    30 LSB of extended memory size found above 1 megabyte during POST
    31 MSB of extended memory size found above 1 megabyte during POST

    [...]

    Programming Considerations:

    Write CMOS address to read or write to port 70h
    Read/write port 71h to get/set data

    [...]
    alors voilà ! Mais ainsi on peut avoir jusqu'à 16 Mo de mémoire ! Bon ok, ca n'est peut être pas ce que tu voulais. Mais j'y met de la bonne volonté, je cherche, je cherche. Dès que je trouve comment on peut trouver la taille de la mémoire pour > AT je te fais signe !

  5. #5
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut
    Albus, et si tu as une barette de RAM partiellement deffectueuse ?

  6. #6
    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
    Petite question subsidiaire :

    Combien de temps faudrait il pour accèder octet par octet à la totalité de 512 Mo de mémoire, en comptant toutes les exeptions ?

    Eh, mais plus sérieusement, j'ai l'ai trop con mais... Vous avez un document à me pretter qui parlerait des différents standard AT / XT / PS2 etc. avec hierarchie des compatibilités ascendantes et surtout où on est arrivé ? Il y avait un très bon site qui parlait du développement d'un OS qui donnait pas mal de références, vous avez l'adresse ?

  7. #7
    Membre du Club

    Inscrit en
    Août 2003
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 33
    Points : 45
    Points
    45
    Par défaut
    Albus, et si tu as une barette de RAM partiellement deffectueuse ?
    bah, ....

  8. #8
    Membre du Club

    Inscrit en
    Août 2003
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 33
    Points : 45
    Points
    45
    Par défaut
    Ya ça qui est pas-mal:
    http://osdev.neopages.net/docs.php?cat=0&sort=1
    je viens de tomber là dessus en faisant une recherche, ya pas mal de liens qui ont l'air intéressant, à toi de voir...
    http://www.visopsys.org/osdev/
    j'en connaissais pas mal d'autre sites comme ça mais j'ai perdu tous mes liens... snif

    Sinon pour ce qui est de ma solution, c'était la méthode qu'il fallait regarder:
    pour répondre à Smortex (sérieusement ) on peut adapter ma solution en testant les 100 octets suivant (par exemple) et comme ça en déduire si la RAM est défectueuse oubien que c'est réellement la fin.
    pour répondre à Blustuff, on peux utiliser un algorithme de dichotomie par exemple puis affiner par l'algo que j'ai donné.
    Par contre c'est vrai que pour bien faire il faudrait réecrire la GDT oubien (comme pour beaucoup d'OS) on prends la 2éme entrée de la GDT (celle qui est très souvent associé à cs en ring0) -> donc elle parcourt (logiquement) toute la RAM
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mov ax, 0x08
    mov ds, ax
    mov eax, [ds:ecx]
    [/code]

  9. #9
    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
    C'est quand même vachement restrictif tes conditions. Moi je ne l'ai jamais fait, mais dans les exemples de passages en pmode que j'ai vu, ils détectaient la taille de la RAM pour savoir comment l'allouer. Toi tu regardes comment elle est allouée pour connaïtre sa taille, non ?

  10. #10
    Membre du Club

    Inscrit en
    Août 2003
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 33
    Points : 45
    Points
    45
    Par défaut
    ils détectaient la taille de la RAM pour savoir comment l'alloue
    Ah bon? dans tous ce que j'ai vu (et j'en ai est lu beaucoup), ils allouaient les 4Go pour le descripteur de segment du 'cs' en ring0, donc je suis parti sur ce principe. Sinon si ce que tu dis est vrai, on peut tout simplement récupérer l'adresse de la GDT et ainsi, récupérer la taille de la RAM en lisant directement dans le GDT. Mais bon ça ne marcherais que sous un mini-OS sans swap ni pagination. c'est pour ça que dans ma solution on a besoin de refaire complètement l'interruption intX.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Moi je ne l'ai jamais fait
    Moi non plus en fait mais je compte bien le faire un jour, c'était juste une idée de solution qui m'ai passé par la tête lorsque j'ai lu ce topic.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Toi tu regardes comment elle est allouée pour connaïtre sa taille, non ?
    non, c'est pour ça que j'ai dis dans un ancien post: "pour bien faire il faudrait réecrire la GDT"

  11. #11
    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
    oui, enfin, c'est certain, il existe au moins une interruption BIOS qui donne la taille. Mes docs sont trop vielles puisqu'elles ne parle pas du dépassement des 14 Mo de l'AT. Mais l'intérruption appellait un controleur bien standard comme je l'ai cité plus haut. Ca devrait être à peu près similaire aujourd'hui... Mais ou trouver ces infos ??

    La liste d'interruption de Ralph donne plein d'interruptions pour la taille de la mémoire. Il faudrait savoir lesquelles sont utilisables ^^

  12. #12
    Membre expérimenté

    Inscrit en
    Mai 2002
    Messages
    720
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 720
    Points : 1 594
    Points
    1 594
    Par défaut
    Je suis de l'avis de Blustuff : il doit y avoir moyen de lire la taille quelque part....
    Je n'ai pas le temps de regarder, mais peut etre que des sites comme :
    http://webster.cs.ucr.edu/
    .....

    Aldus, concernant le test des 100 octets suivants.... on peux imaginer que ce soit une des memoires de la barette de RAM qui ait rendu l'ame, donc ca peut etre beacuoup plus que 100 octets qui partent par bloc.... Et comme le souligne Blustuff, ca peut etre long de tout scanner.... Donc moi, voila comment je ferais (Car oui, le coup de la barette parttiellement deffectueuse s'etait surtout pour te faire te poser des questions).... Je testerai au bout de 16 Mo, 32, 64, 128, ... et comme on peux melanger toutes ces barettes de RAM, un peux imaginer un test tous les 16Mo (En considerant que plus personne n'utilise des barettes de 8,4,2,1 Mo.... Je ne parle meme pas des plus petites....)

    Bon courrage !

  13. #13
    Membre du Club

    Inscrit en
    Août 2003
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 33
    Points : 45
    Points
    45
    Par défaut
    Je suis aussi de l'avis de Blustuff, c'est sûr.
    En fait si j'ai eu cette idée c'est que j'ai l'habitude de ne plus utiliser d'interruption, comme je suis en train de coder un OS.
    Je ne pense pas qu'elle marcherait sous windows et c'est beaucoup trop compliqué à programmer (il faudrait déja passer en ring0 et sous winXp c'est pas très facile) mais elle s'adpte bien sur des petits OS comme celui que je fait.

  14. #14
    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
    y'a ça aussi comme adresse :
    http://www.mega-tokyo.com/os/os-faq-memory.html
    Il faut aller chercher tout en bas si on ne veut pas passer par les interruptions.

    Je suppose qu'Albus tiens ces infos de là ?

    Et une petite aide sur le programme quand on a pas l'habitude du C (parce que moi j'en ai chier pour trouver la solution) : la ligne
    sert à dire au compilateur qu'il ne doit pas optimiser à cet endroit là, c'est tout.
    Bon amusement

  15. #15
    Membre du Club

    Inscrit en
    Août 2003
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 33
    Points : 45
    Points
    45
    Par défaut
    Merci ! je l'avais perdu ce site !
    Je suppose qu'Albus tiens ces infos de là ?
    non, je les tiens du fruit de mon imagination.
    Mais ça me fais plaisir de voir que c'est pas un méthode bidon et qu'elle est vraiment utilisée.

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 29
    Points : 35
    Points
    35
    Par défaut
    Bonjour,

    La fonction E820h de l'interruption 15h permet d'obtenir une carte de la mémoire. Cette fonction est disponible via L'ACPI dont on peut touver les spécifications et informations détaillées à cette adresse :
    http://www.acpi.info/

    Sinon, une autre méthode consiste comme le disait Albus à scanner la mémoire par une succession de sauvegarde, test par écriture et comparaison, restauration des octets, méthode couramment utilisée.
    Aussi, l'on peut introduire un test par "pages" de 4Ko afin de limiter le nombre d'itérations.

    Bon code.
    AsnOd.

  17. #17
    Membre du Club Avatar de Arnaudv6
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 82
    Points : 63
    Points
    63
    Par défaut
    Voilà, je remet le sujet a l'actualité :
    je parcourais une doc quand j'ai lu ca....
    Je fais un copié collé parce que j'ai la flemme....

    Int 2Fh, Fct 08h Déterminer la taille de la mémoire étendue disponible XMS

    Cette fonction retourne le volume total disponible dans la mémoire étendue et la taille du plus grand bloc encore libre.

    Entrée :

    AH = 08h

    Sortie :

    AX = Taille du plus grand bloc de mémoire étendue (EMB) en octet
    DX = Volume total disponible dans la mémoire étendue en Ko

    Remarques :

    · Comme toutes les fonctions du driver XMS, celle-ci ne doit également être appelée qu'après avoir vérifié l'existence d'un tel driver à l'aide de l'interruption 2Fh et obtenu le point d'entrée du driver :

    L'appel des fonctions XMS se fait grâce à l'interruption multiplexeur 2Fh qui gère tous les drivers de programmes résidents. Pour tester la présence d'un driver XMS, appelez d'abord l'interruption 2Fh avec le code de fonction 4300h dans le registre AX. Si un driver XMS est présent en mémoire, la fonction renvoie la valeur 80h dans le registre AL (une autre valeur signifie qu'il n'existe aucun driver XMS en mémoire). Appelez une seconde fois l'interruption 2Fh avec la valeur 4310h dans le registre AX. En guise de résultat, vous obtenez l'adresse de segment de l'XMM dans le registre ES et l'adresse d'offset dans le registre BX. Ces adresses permettent d'appeler toutes les routines du standard XMS.

    · Attention ! La HMA n'est pas prise en compte lors de l'évaluation des deux indications même si elle n'a pas été encore allouée. Par conséquent, les indications s'élèvent à 64 Ko parce que l'allocation de la mémoire étendue commence toujours après la HMA.

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 10
    Points : 10
    Points
    10
    Par défaut
    Albus, et si tu as une barette de RAM partiellement deffectueuse ?
    Bah tu la change !!! :s :s
    N'empêche j'avais imaginé la même méthode qu'Albus en réfléchissant a la question bien avant de tomber sur ce thread... donc a priori c'est pas idiot lol....

  19. #19
    Membre du Club

    Inscrit en
    Août 2003
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Août 2003
    Messages : 33
    Points : 45
    Points
    45
    Par défaut
    N'empêche j'avais imaginé la même méthode qu'Albus en réfléchissant a la question bien avant de tomber sur ce thread... donc a priori c'est pas idiot lol....
    C'est pas parce que tu y as pense que c est pas idiot...

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 10
    Points : 10
    Points
    10
    Par défaut

Discussions similaires

  1. [C#] Comment connaitre la taille d'un fichier.
    Par PascalCmoa dans le forum Windows Forms
    Réponses: 6
    Dernier message: 09/02/2018, 09h54
  2. Réponses: 7
    Dernier message: 08/06/2005, 12h04
  3. [JSP] Connaitre la taille d'un fichier
    Par dst dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 21/06/2004, 18h22
  4. [JVM] Connaitre la taille mémoire utilisé par les dif classe
    Par sur_uix dans le forum Général Java
    Réponses: 4
    Dernier message: 18/09/2003, 10h17
  5. recuperer la frequence du proc , la taille de la RAM , ..
    Par Cthulhu 22 dans le forum C++Builder
    Réponses: 5
    Dernier message: 05/09/2002, 13h18

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