Salut à tous!
Je suis nouveau sur ce forum, et débutant en C++. Je cherche les fonctions, une unité, librairie pour accéder à la RAM. J'ai besoin d'un accès très rapide aux données. Pouvez-vous me conseiller?
Merci de votre aide!![]()
Salut à tous!
Je suis nouveau sur ce forum, et débutant en C++. Je cherche les fonctions, une unité, librairie pour accéder à la RAM. J'ai besoin d'un accès très rapide aux données. Pouvez-vous me conseiller?
Merci de votre aide!![]()
Je cherche les fonctions, une unité, librairie pour accéder à la RAM. J'ai besoin d'un accès très rapide aux donnéesLe moyen direct en C++ pour accéder à la RAM cela s'appelle un pointeur cher ami.Je suis nouveau sur ce forum, et débutant en C++.
ex:
Donc conseil : prendre un bon livre sur le C++.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 char *p; p=NULL; p=new char[25]; ..... delete [] p;
Utiliser pour cela des listes chaînées.J'ai besoin d'un accès très rapide aux données
Sous Windows , on ne peut pas accéder directement au matériel ( contrairement au DOS ).Sinon écrire des Device Drivers.
Sinon on peut mixer code assembleur machine et C++
Je confirme ce qu'a dit addicted_to_MFC quant à l'utilisation de l'asm dans ton code : y'a pas plus rapide(tu travailles avec les registres du processeur). Pour des fonctions pas trop complexes au début, il n'est pas très difficile de se mettre à l'asm...
C'est ce que je pensais au début, mais après des tests, je me suis rendu compte que l'allocation d'un pointeur utilisait plutôt la mémoire virtuelle malgré les 40 Mo libres de ma RAM...Envoyé par addicted_to_MFC
Après mes recherches sur le SDK, j'ai trouvé peut-être cette piste:
Qu'en pensez-vous? Suis-je sur la bonne voie?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 Declare Function AllocateUserPhysicalPages Lib "kernel32.dll" _ (ByVal hProcess As Long, ByRef NumberOfPages As OUT, ByRef PageArray As PULONG_PTR ) As Long
Pourquoi veux tu exactement accèder à la ram?
la fonction AllocateUserPhysicalPages est juste une fonction qui permet d'allouer des pages mémoires à un processus mais pas d' accéder à des pages mémoires existantes.par le principe même des systemes protégés tu ne pourra jamais accèder à la mémoire allouée par les autres processus que ton prog.et si tu trouvais un moyen ce serait une faille de sécurité donc non portable.
Pour accéder à la gestion mémoire il faut être en ring 0 et seul l'os y a accès.Je sais qu'il existait des bidouilles seur les systemes 9x qui permettait d'exécuter du code en ring 0 à partir du ring 3 par l'utilisation des call gate.
par contre il existe des techniques pour ecrire ou lire dans la mémoire d'un autre processus par les fonctions ReadProcessMemory et WriteProcessMemory à condition que la zone mémoire partagée ait l'accès ecriture ou lecture
C'est exact , je me suis trompé en partie car avec des OS comme Unix par ex. ( ça reste à vérifier ) l'allocation d'un pointeur donne un accès direct à la mémoire.C'est ce que je pensais au début, mais après des tests, je me suis rendu compte que l'allocation d'un pointeur utilisait plutôt la mémoire virtuelle malgré les 40 Mo libres de ma RAM...
Sous Windows il est vrai on n'accède pas du tout directement à la mémoire physique mais plutôt à une mémoire virtuelle.
Tu sais ce que c'est un pointeur donc pas débutant .et débutant en C++. Je
Tu ne te serais pas en train de te payer notre tête ?
Charon a tout juste quand il dit que parce que système protégé tu ne peux pas accéder aux pages mémoires.
Je pense qu'un des moyens les plus rapides pour effectuer des traitements ( ce n'est pas accéder à des données mais ces données il faut les traiter -but de l'informatique ) c'est l'utilisation de Threads avec un certain niveau de priorité
Et le but des manoeuvres dans tout cela c'est quoi ???
Envoyé par addicted_to_MFC
Je ne me permettrais sûrement pas de me payer votre tête!
Oublie définitivement la gestion mémoire avec himem.sys ça appartient largement au passéAvec TP sous dos, j'utilisais le driver Himem.sys, et les fonctions qui vont avec... Les variables utilisent la mémoire conventionnelle, donc pas de problèmes de rapidité!
Non monsieur :Pour te démontrer l'utilité d'accéder à la RAM, imagine un programme d'animation, où toutes les images sont chargées en RAM, puis sont affichées à l'écran à grande vitesse (comme un player de vidéo divx ou mpg .Ces programmes ne peuvent se faire qu'avec un accès direct de la mémoire physique (et non virtuelle).
Ceci était valable sous DOS mais pas sous Windows.
Parce que si on peut stocker des images bitmaps en mémoire et admettons directement dans la RAM , après il faut les afficher à l'écran.
Problème parce que périphériques vidéos différents les uns des autres.
Effectivement sous DOS on pouvait accéder grâce à un pointeur sur la mémoire vidéo ( adresse A000:000 )et afficher de cette manière un buffer .
Mais sous Windows c'est impossible parce que surcouche logicielle indépendante du matériel.
Windows fait la translation entre une procédure écrite en Delphi ou en C++ entre le GDI et le matériel.
Pour jouer une vidéo le plus simple et plus performant est d'utiliser DirectShow.
Pour stocker des images en mémoire , fonctions GDI ou "surfaces " DirectDraw.
Mieux vaut consacrer une partie pour son projet et une autre pour la recherche d'un emploi ( SSII ou autre) . Car pour commercialiser un projet informatique ( donc un logiciel ) , il faut présenter quelque chose de béton.Ca fait plus d'un an que je suis au chomage, et ce projet est la seule chose qui me permet de tenir le coups!
tout à fait d'accord!
Tu sais, m'expliquer vos théories sur l'utilisation ne m'aide pas plus que ça, je te rappel que j'ai toujours besoin de la RAM en accès direct, et rien d'autres...
si tu veux accéder à la ram en accès direct crée un driver avec le ddk de microsoft,les drivers s'exécutent dans un ring plus privilégié et y ont donc accès ou du moins par l'api fourni par les drivers.Mais il faut que tu saches que la mémoire en mode protégé n'est pas linéaire,Il y a un système de pagination et segmentation.Ensuite puisque tu veux accéder apparemment à la mémoire video directement je dirais là même chose que addicted_to_MFC utilise directx c'est fait pour çà.
Merci pour toutes vos réponses!
En fait, c'est pas pour de la video, mais pour charger des samples en RAM...
Si il faut que je fasse un driver, alors comment faire?
pour la gestion mémoire au niveau des drivers regarde là:
http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/k106_544y.asp
pour la doc complete du ddk regarde à driver development kit sur le meme site.
sinon le ddk lui même était téléchargeable sur le site de msdn mais je crois maintenant qu'il faut le commander.
par contre je voudrais juste te poser quelques questions pour éclairer ma lanterne au risque d'être pris pour un boulet.Je ne vois pas du tout pour tes samples audio pourquoi tu n'utiliserais pas la gestion normale de la mémoire en utilisant new.est-ce parce que la mémoire à laquelle tu veux accéder est de la mémoire E/S(tu parlais d'interfaces electroniques).quand tu dis accéder à la ram,tu veux faire quoi exactement ? accéder à une adresse bien précise?Où est ce que tu veux être certain que la page correspondante à ta zone mémoire ne sera jamais stockée sur le disque et rechargée accélérant ainsi l'accès?
dans les 2 cas,je crois qu'au niveau d'un driver il y a des fonctions qui permettent d'assigner une zone de mémoire physique.Ceux sont les mêmes qu'utilisent généralement les developpeurs de drivers pour réserver la mémoire entrée-sortie de leur matos.
sinon au passage dans windows l'interface audio/video est géré par la technologie mci.On accède à cette technologie par une api windows prévue et de l'autre coté il y a des drivers MCI developpés avec le ddk
qui communiquent avec des cartes sons,télés..Je crois qu'il existe dans les mci une notion de mixer.peut être devrais-tu developper ton propre driver mci.Tu devrais te renseigner la dessus.
Quand on est têtu c'est pour la vie !Tu sais, m'expliquer vos théories sur l'utilisation ne m'aide pas plus que ça, je te rappel que j'ai toujours besoin de la RAM en accès direct, et rien d'autres...
charon a suggéré de développer un Device Driver , chose très ardue.
Bonne chance pour faire cela !! ( fais moi-signe quand tu auras terminé)
De plus accéder DIRECTEMENT à la mémoire RAM ne sert à rien car l'OS déplace les blocs de mémoire en fonction des besoins.
Comme l'a suggéré charon , utiliser les commandes MCI.En fait, c'est pas pour de la video, mais pour charger des samples en RAM...
Sinon avoir recours à Direct Sound.
L'intérêt de Direct X comme son nom l'indique est un accés direct au matériel en outrepassant les couches logicielles.
Les équipes de développement de Microsoft sont à mon avis plus à même de développer des technologies pour leur OS que le moindre programmeur dans son coin et ses drivers.
Moralité : s'acheter un bon livre de programmation Windows comme le Petzold !
J'aurais peut-être du commencer par là: J'ai besoin de charger des samples en mémoire pour faire le mixage en temps réel. Encore merci de votre aide! à+
S'il ya un retard sur le mixage des échantillons , il faut avoir recours à ce moment-là à la programmation de threads ou autres processus ( j'ai déjà indiqué cette méthode ) . Car en définit le coeur du problème n'est pas d'accéder rapidement à la mémoire mais plutôt le traitement d'un échantillon ( application de filtres de traitements , calculs etc...).
Pour cela avoir recours à des threads : avec Delphi/VCL il y a la classe TThread.
Attention avec l'utilisation de librairies tierces comme Midas : il faut payer des royalties en utilisation commerciale !
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