Mémoire étendue sous DOS

Mémoire étendue sous DOS - C - Programmation

Marsh Posté le 21-06-2004 à 18:56:45    

Salut,
Comment faire pour installer un exécutable en mémoire haute sous DOS (freedos).
J'ai installé himem64.exe ainsi que EMM386.exe.
J'ai un problème , je fais un calloc dans mon programme et je n'ais pas assez d'espace mémoire pour l'allocation .
Quelqun aurait la réponse?
merci

Reply

Marsh Posté le 21-06-2004 à 18:56:45   

Reply

Marsh Posté le 21-06-2004 à 19:00:35    

dans l'autoexec.bat :  

Code :
  1. lh executable.exe


question : pour quoi faire, le DOS ?


Message édité par Harkonnen le 21-06-2004 à 19:00:57

---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 21-06-2004 à 23:31:54    

Y a eu des DOS extenders à une époque pour "flatifier" la mémoire, je crois. http://www.tenberry.com/dos4g/ à voir, sais pas si ça convient....

Reply

Marsh Posté le 22-06-2004 à 10:22:08    

Pourquoi sous DOS ?
---> c'est un système embarqué. Avec que DOS d'installé dessus.
Le problème de cette solution c'est que quand tu charge le programme en mémoire, il s'éxecute en même temps.
Merci Carbon_14, il faut sans doute que je prenne cette piste.
Mais ce n'ais pas possible de créer de nouvelle page mémoire avec EMM386.exe(mémoire paginée), je crois que c'est juste pour les drivers, etc... ??

Reply

Marsh Posté le 22-06-2004 à 10:23:01    

Merci a toi aussi Harkonnen

Reply

Marsh Posté le 22-06-2004 à 20:40:37    

bin si, mais avec EMM386 ou himem tu vas rapidement comprendre ta douleur....
 

Reply

Marsh Posté le 22-06-2004 à 21:45:57    

Fonctions de l'EMM : INT 67H, fonctions 01 à 0EH.

Reply

Marsh Posté le 23-06-2004 à 10:44:54    

Ok, je ne vais pas me lancer là dedans!!! (emm386...)
J'ai essayé de compiler mon prog en DOS4/G(dos extender 32bits), le problème c'est que j'utilisais une librairie en 16 bits.  
En utilisant une librairie pour dos4/g, il manque certaines fonctions importantes.
Je vais essayer de créer un nouveau projet PHARLAP (DOS extender aussi )
Merci pour vos conseils...


Message édité par jojobibine le 29-06-2004 à 15:57:48
Reply

Marsh Posté le 29-06-2004 à 15:33:47    

En fait les problèmes de librairies étaient due à l'ancienne version de mon environnement de développement qui me générait des erreurs.
Maintenant mon programme tourne à peut près bien.
A peu près... car certaines fonctions réserve en mémoire des addresses de composants matériels (composants électroniques), et la le programme plante. (un beau crash).
Et ce que c'est le dos extender qui rentre en conflit avec l'emm386 ou bien existe t'il une solution pour que dos4g n'utilise pas une certaine plage d'addresses? (overwrite)
si quelqun peut m'aider!!!
merci d'avance

Reply

Marsh Posté le 29-06-2004 à 15:40:49    

bah, ton hardware, il est dans l'espace mémoire du premier Mo ?

Reply

Marsh Posté le 29-06-2004 à 15:40:49   

Reply

Marsh Posté le 29-06-2004 à 15:55:50    

non, la plge est E000-EFFF

Reply

Marsh Posté le 29-06-2004 à 16:31:51    

oui donc sous le premier Mo...
 
quand tu alloues avec DOS4G, c'est toujours au dessus du premier Mo, donc pas de risque de taper où il ne faut pas..
 
t'as pensé à linéariser tes segments ? ie le segment E000, ça donne 0xE0000.

Reply

Marsh Posté le 29-06-2004 à 16:38:34    

Non je n'y avait pas pensé mais cela ne change rien.
Quand je lance l'exec. , j'ai:
DOS/4GW error(2001) : exception ODh (general protection fault) at....
merci pour tes conseils...

Reply

Marsh Posté le 29-06-2004 à 17:39:52    

Comment faire pour reserver un espace mémoire sous dos4gw?

Reply

Marsh Posté le 29-06-2004 à 21:10:49    

jojobibine a écrit :

Comment faire pour reserver un espace mémoire sous dos4gw?


regarde dans la spec DPMI
http://burks.brighton.ac.uk/burks/ [...] mispec.htm


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 30-06-2004 à 16:27:37    

donne un exemple de ton code.
 
en mode réel, tu changais un registre de segment en E000 pour atteindre ton périphérique.
 
en mode protégé tu n'as pas le droit de modifier ES ou DS avec un E000 sorti de nulle part. (ça ne corresponds pas à un descripteur).
 
donc pour atteindre l'adresse physique E0000 (le segment : offset E000:0000 en mode réel), tu utilises bêtement l'adresse E0000 sans changer un registre de segment.
en faisant bêtement un:  
 
mov al, BYTE PTR[0E0000h]
 
ou un:
 
unsigned char *myhardware=0x0E0000;
 
myhardware[0x4]=0x0fef; /// ce que tu veux....
 
-----
 
après si ton périphérique a un espace mémoire en dehors du premier Mo, il faut utiliser ça:
 
http://www.tenberry.com/dpmi/16.html
 
mais ce n'est pas ton cas, c'est plustôt pour le hardware PCI moderne.


Message édité par bjone le 30-06-2004 à 16:28:24
Reply

Marsh Posté le 30-06-2004 à 19:05:31    

Merci beaucoup, bjone, mon problème est résolu!!!
Merci à toi et JTY
a+
jojo

Reply

Marsh Posté le 01-07-2004 à 23:21:55    

Putain vous êtes balaise là dedans j'ai rien compris ! [:mlc]

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed