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+.
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+.
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.
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)
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 :
Ah ! interessant. Qu'est la CMOS RAM ??Envoyé par HelpPC
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 !Envoyé par HelpPC
Albus, et si tu as une barette de RAM partiellement deffectueuse ?
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 ?
bah, ....Albus, et si tu as une barette de RAM partiellement deffectueuse ?
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]
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 mov ax, 0x08 mov ds, ax mov eax, [ds:ecx]
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 ?
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.ils détectaient la taille de la RAM pour savoir comment l'alloue
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 Moi je ne l'ai jamais fait
non, c'est pour ça que j'ai dis dans un ancien post: "pour bien faire il faudrait réecrire la GDT"
Code : Sélectionner tout - Visualiser dans une fenêtre à part Toi tu regardes comment elle est allouée pour connaïtre sa taille, non ?
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 ^^
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 !
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.
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part asm("":::"memory");
Bon amusement
Merci ! je l'avais perdu ce site !
non, je les tiens du fruit de mon imagination.Je suppose qu'Albus tiens ces infos de là ?
Mais ça me fais plaisir de voir que c'est pas un méthode bidon et qu'elle est vraiment utilisée.
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.
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.
Bah tu la change !!! :s :sAlbus, et si tu as une barette de RAM partiellement deffectueuse ?
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...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....
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager