Vesa en mode Protégé

Résolu
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011 - 17 sept. 2007 à 14:04
Stabia Messages postés 4 Date d'inscription samedi 12 janvier 2008 Statut Membre Dernière intervention 17 janvier 2008 - 12 janv. 2008 à 18:41
Voila , ca fait un moment que je souhaite quitter le mode réel , pour passer en mode protégé (faire tenir mon environnement 3d RayTracing dans moins d'1Mo de mémoire vive ça m'a donner des crises de nerf) .
Jusque là pas de probleme mais ma librairie de fonction ne fonctionne plus en mode protégé puisque elles utilisent des interruption VESA!
Donc je voudrait savoir comment utiliser vesa en mode protégé , ou encore mieux , n'importe quelle  interruption en mode protégé .
Petites précisions :
-je ne veux pas d'opengl/directx/... , je veux le vesa pour accéder directement à la mémoire video ce qui est le plus rapide .
-je ne veux pas passer en mode real-flat (sauf si vous pouvez me fournir un code source qui marche , parceque j'ai jamais réussi avec ce que je trouve sur le net) .
Merci d'avance ...

20 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
25 sept. 2007 à 15:03
salut,

pour faire ce genre de chose sous winXP c'est possible mais en dpmi/vcpi. regarde plutot du coté des dpmi ("dpmi specifications" dans google devrait t'apporter ce que tu cherche)
cela te permettra de conserver le mode réel en ayant également une interface pour le mode protégé tout en gardant la compatibilité Windows.

sous Windows, tu ne peux pas modifier la GDT et encore moins le registre GDTR, tu dois passer par l'API windows afin de réclamer les descripteurs necessaires. l'interface DPMI devrait fonctionner également sous Windows et te permettra également de réclamer les descripteurs necessaires.

les 4Go de memoire sont accessibles quels que soit la taille de ta memoire physique. C'est le syteme d'exploitation qui decide de quelle portion de memoire physique sera mappée pour etre accessible a telle portion de memoire virtuelle. Cela se passe par l'intermediaire du page directory (cr3) qui n'est bien sur pas modifiable directement sous windows ou tout autre os, on se contente en tant qu'utilisateur d'appeler la fonction VirtualAlloc ou autres.

donc, non, les modifications que tu as faites ne sont pas bonnes, tu dois te servir de l'API de l'OS hôte pour manipuler les registres privilégiés.

Je ne pense pas non plus que tu puisse utiliser masm32 puisqu'il te sort un code 32bits en format COFF/PE. pour utiliser le mode réel, tu dois trouver un assembleur qui accepte le melange entre mode réel et mode protégé style nasm. Regarde du coté du site de Delorie (DJGPP). http://www.delorie.com/djgpp/

@++
3
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
18 sept. 2007 à 12:44
salut,

c'est possible avec le VESA, tu auras toutes tes informations ici:
http://www.vesa.org/public/VBE/vbe3.pdf

@++
0
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011
18 sept. 2007 à 13:29
Merci de la réponse , j'avais déjà trouvé ce document , mais j'arrive toujours à rien :
Même si ils mettent que le code VESA est du 16bit pouvant etre appelé en mode32bit , quand j'appelle les fonction VBE
via int10h , window m'envoie : le programme test.exe a rencontré un probleme et doit fermer , blablabla ...
Dans le .pdf il parlent de "protected mode entry point" , ce que je n'arrive pas à traduire : ca veut dire qu'il y a qqc de particulier à faire par rapport au mode réel ? ou que les fonction VBE sont sensée marcher normalement (auquel cas ca serait ma carte/les drivers qui ne respecterai la norme vesa ?) .
0
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011
18 sept. 2007 à 14:14
Mea Culpa , je viens de relire une enième fois le document et j'ai trouvé pourquoi ca ne marchait pas (il faut utiliser une image du bios vesa ou qqc du même genre apparement) .
Désolé , je suis vraiment pas bon en anglais et j'avais zappé le chapitre d'explication sur le protected mode entry point .
Je reposterai ici , si ca ne marche toujours pas :-) .
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011
19 sept. 2007 à 13:35
Suite ; aprés avoir passé toute la soiré sur le code , ca bloque toujours , je suis victime de ma double ignorance en anglais et en mode protégé :
page 23
"2)Copy the bios from the c0000h physical memory :" ca veut dire que je doit le récupérer à partir de l'offset c0000h ou bien que ce c0000h c'est ce que je doit mettre dans le registre de segment (donc un pointeur valant 0c0000h:[0] )? de plus je croyais qu'on avait plus accés au segments et à leur registre en mode protégé ?
"5)Create selector that point..." je doit mettre un pointeur vers l'offset a0000h ou quand il parle de selecteur , c'est le même genre que ce que l'on bidouille lors du passage en mode real-flat ? , si oui , ca veut dire qu'il faut créer le descripteur dns la GDT et mettre le selecteur dans la table DPMI ? auquel cas , quelqu'un peut m'expliquer comment on fait (j'ai essayer le mode real-flat mais j'ai jamais réussi à faire quoi ce soit avec la GDT) ?
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
19 sept. 2007 à 15:37
salut,

je n'ai jamais pris le temps de regarder le VBE3 a fond, je vais lire la doc des que j'aurais un peu de temps afin de voir comment ça fonctionne, j'en aurais besoin de toute façon a un moment ou un autre.
tu dois te familiariser avec les convertion de segment16:offset16 a offset32.

offset32 = (segment16<<4)+offset16segment16 offset32>>4 avec offset16 offset32 & 0x0f.

@++
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
19 sept. 2007 à 21:28
re,

je viens de commencer a lire la doc.
as-tu réussi a trouver le PMInfoBlock ?
et il y a une autre alternative:  http://www.vesa.org/public/VBE/VBE-AF07.pdf
dans cette seconde doc, tu trouveras des exemples en mode protégé.

@++
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
19 sept. 2007 à 22:56
rere,

ça aussi ça pourra t'aider; c'est un manager dpmi gratuit et avec les sources pour les appels int86 et callRealMode
http://clio.rice.edu/cwsdpmi/

@++
0
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011
20 sept. 2007 à 16:35
Salut ,
Merci pour les deux lien mais je tien à rester dans le VESA classique , ca m'embetterai de devoir mettre à la poubelle toute la librairie que j'avait en mode réel , je vais quand même regarder au cas où .

Pour ce qui est du block PMI c'est le 1er probleme : "0c0000h physical memory" ca veut dire que je doit copier le 32kB du bios à partir d'un pointeur  type es:[di] , avec 0c000h dans es ? ou bien quelquechose du style [edi] , avec edi = 0c0000h ?
J'ai testé ni l'une ni l'autre pour l'instant car j'arrive pas à faire des pointeurs vers le Buffer qui doit recevoir le bios sans que ca plante .
Je vais faire des tests pour comprendre ce qui marche pas (argh , c'était vraiment plus facile le réel !)
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
20 sept. 2007 à 16:57
salut,

dans tous les cas si ta librairie est en mode réel, elle est obsolete mais tu peux peut etre simplement la modifier pour la convertir en mode protégé.
si elle est en mode réel, pourquoi vouloir la faire fonctionner en mode protégé ?

sinon, pour rechercher le PMInfoBlock, cela dépends si tu est en mode protégé ou en mode réel lors de la recherche.
si tu est en mode réel alors
push word 0xC000
xor di,di
mov cx,32K
pop es
.1
mov al,'P'
repne scasb
jecxz .notfound
dec di
inc cx
cmp word [di],'DI'
cmp word [di+2],'MP'
jne .1
; verifier checksum
jne .1
; ici la structure est trouvée a es:di

si tu est en mode protégé.
;-------------------------------------------------------------------
GDT:
;-------------------------------------------------------------------
dd      0,0
FLAT_DATA0  EQU $-GDT   ;+3 pour FLAT_DATA3
.01:
dw      0xFFFF      ;limit -1
dw      0       ;base 0
db      0
db      DESC_D32                        ;present, ring 0, data, expand-up, writable
db      0xCF                            ;page-granular, 32-bit
db      0
.02:
dd  0,0
dd  0,0

mov ax,FLAT_DATA0
mov edi,0xC0000
mov ecx,32K
mov es,ax
.1
mov eax,'DIMP'
repne scasb
jecxz .notfound
dec edi
inc ecx
cmp dword [edi],eax
jne .1
; verifier checksum
jne .1
...

@++
0
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011
22 sept. 2007 à 13:01
salut ,

Merci pour le code ! Je vais tester ca ce weekend .

Pour ce qui est de passer en mode protégé c'est parceque je souhaite faire des jeux . Hors à  l'époque où j'avais commencé ma librairie , j'avait sous estimé la mémoire necessaire ,  vu que je penser rester ad-eternam en 2d . Maintenant je suis passer en 3d et essayer de faire tenir un espace voxel dans moins d'un Mo ca m'a donner des envies de suicides .
Donc maintenant je cherche à la convertir en mode protégé pour bénéficier des 4Go max. de mémoire vive .
0
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011
23 sept. 2007 à 13:55
salut ,

Argh , j'ai vraiment l'impression d'etre un boulet
Petit probleme , mon compilateur refuse certaine de tes syntaxe  , du coup j'improvise un peu (et forcément ça marche pas ) :

mov ax,FLAT_DATA0
mov edi,0C0000h            ;masms32 -> 0xff devient 0ffh
mov ecx,32768                ;limite de 32ko
mov es,ax                        ;Probleme à l'éxécution sur ce mov es,ax
                                       ;"test2.exe à rencontré un probleme et doit fermer ..."

Je pense que ça vient des modification que j'ai dut faire , j'ai peut etre mal interprété ta syntaxe :

GDT:                ;masms32 refuse GDT : A2108 : use of register assumed to ERROR
J'ai remplacé  GDT: dd 0,0 ...
par                GDT  dd 0,0 ... (GDT en temps que nom de variable)
Autre option : si je met GDT: dd 0,0 ... dans ".code" au lieu de ".data" , masms l'accepte , mais je suis pas sur que ce soit
correct de stocker des données dans le segment de code .
Du coup , je suis plus certain que "FLAT_DATA0  EQU $-GDT" soit toujours valable (dans un cas ou dans l'autre) .

Au passage : $ correspond à l'adresse de l'endroit où se trouve le symbole non ? Dans ce cas , FLAT_DATA0 vaut 8 ?

DESC_32    => il faut mettre la valeur binaire 10010010b (0x92) ?

Désolé de te faire perdre du temps avec des trucs pareil mais j'y ait passé tout samedi ... et je trouve toujours pas .
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
24 sept. 2007 à 01:37
tu est sous quel os ?
0
Guilou34 Messages postés 142 Date d'inscription mercredi 5 avril 2006 Statut Membre Dernière intervention 29 janvier 2016 1
24 sept. 2007 à 13:20
Bonjour<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /??>





Si le problème n’est toujours pas résolu et si le passage en mode protégé  est une question  de mémoire, je me demande si tu ne perds pas de vue qu’en mode réel,  tu as accès à un espace mémoire linéaire de 4 gigaoctets dès lors que le processeur est de type 80386 ou supérieur et qu’on utilise les registres 32 bits.





Cela est très bien décrit dans le «  User’s Guide » de TASM version 2.0 (directive P386N).





Or en graphisme on a souvent besoin de transférer une grande quantité de données et l’instruction REP MOVS, par exemple,  qui s’assemble sous F3 A5, déplace ECX doubles mots de DS:ESI à ES:EDI.  





Bien entendu cela ne fonctionne pas dans une fenêtre Dos sous  Windows car dans ce mode qui ne diffère en rien du monde protégé, si ce n’et par l’adressage de type segment: déplacement, une trappe est générée lorsque l’on veut sortir de l’espace alloué qui est toujours de un mégaoctet.





De même, pour gérer les 4 gigaoctets, il faut qu’ils existent physiquement puisqu’il n’y a pas de mémoire virtuelle en mode réel.






 






Amicalement






 
 
 
0
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011
24 sept. 2007 à 14:25
Salut ,

Patalo-> Je suis sous windows XP et je compile avec masms32. Sinon les modifications que j'ai faites sont justes ou pas ?
Guilou-> J'avait deja lut un truc sur le fait qu'on puisse avoir 4go (si ils existent physiquement ) en mode réel . Mais je vois pas trop comment tu t'y prend pour faire tourner un programme sous window en mode réel sans qu'il soit émulé sous MS-DOS . J'ai besoin de plus de 1Mo , d'avoir accés au VESA , aprés , toute les solutions sont les bienvenue (sauf celle du style "utilise opengl , directx ,  ..."). Rester en mode réel mais se libérer de la contrainte imposer par MS , ca m'intéresse beaucoup -> Si tu pense au real flat mode , j'ai déjà essayé mais ca plante toujours sur l'instruction "lgdt fword ptr []" . Mais je vais peut etre re-tenté le coup (à moins que ca plante justement parceque c'est une fentre MS ?).
0
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011
25 sept. 2007 à 17:14
Salut ,

Merci , je m'aperçois qu'y a des tonnes de trucs que je savais pas .
Pour en revenir à l'accés au Vesa entry point en mode protégé :
-ca veut dire que la manip que tu proposais (le 20/09/2007) , marche pas parceque je suis sous window ?
-> Dans ce cas comment on accéde au entry point , en mode protégé , sous window ?
-> Ou d'une maniere générale , comment on accède à une adresse mémoire phyisque , quand on est en mode 32bit (au hazard : 0c0000h )
-masms32 , pour faire du mode protégé y a pas de probleme (c'est juste si on veut faire du mode réel que c'est pas bon)?
j'ai essayé avec masms6.11 , le résulat est le même . Je vais voir avec DGJPP (mais il  va falloir attendre que je le récupère) ...
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
26 sept. 2007 à 07:48
pour acceder a une adresse physique sous windows, je t'ai trouvé un petit truc qui a l'air sympas:
http://support.microsoft.com/kb/131426/fr

ce que je t'ai proposé ne fontionne pas car tu est sous un systeme d'exploitation en mode protégé comme Windows, Linux, OS/2, BeOS, ..., cela fonctionnerai sous DOS puisque c'est un OS en mode réel et qu'il n'utilise pas le mode protégé sauf si tu utilise un extender du style emm386, auquel cas, il faudrait utiliser l'API de l'extender.

Le problème avec tout les masm, c'est que tu ne peux pas melanger le code 16 bits et le code 32 bits, a moins de creer un VxD peut-être (pilotes Windows 9X). Mais apres, comment l'utiliser sous Windows XP ? nasm est beaucoup moins restrictif en la matière et te permettra de creer un .com avec du code réel et protégé.

@++
0
epineurien Messages postés 83 Date d'inscription samedi 21 mai 2005 Statut Membre Dernière intervention 22 mars 2011
28 sept. 2007 à 20:14
Salut ,

Je me suis renseigné sur le DPMI , je crois que je vais utiliser ça et rester en mode réel . (le cpi ca à l'air intéressant aussi) .

Merci de m'avoir aider !
0
Stabia Messages postés 4 Date d'inscription samedi 12 janvier 2008 Statut Membre Dernière intervention 17 janvier 2008
12 janv. 2008 à 18:33
Bonjour,

Je suis moi-aussi entrain de me battre avec VBE 3.0, j'ai apparement un peu plus avancé que "epineurien" mais pas assez !

Déja dans quel système travaillez-vous ? l'adresse 0C00:0000 (ou 0xC0000 si vous préferez) n'est à priori pas absolue et je pense que c'est l'initialisation du S.E. qui copie la ROM du BIOS ici.
Donc dans le cas d'un lancement direct (sans S.E.) li faut copier le BIOS (32ko. ???? où ???? ) en mode réel puis rechercher le bloc d'info, puis convertir les adresses "réelles"en adresses linéaires ...
Ensuite il semble qu'il y ait des opérations d'initialisation à accomplir, et aussi fournir les descripteurs ... c'est ce point qui me semble étrange.
La fonction 4F0A permet aussi de récupérer ces adresses mais ladocumentation indique que le nouveau procédé doit être préfé.

Le tout c'est que faire de ces adresses !
Dans mon cas je passe en mode linéaire, je récupère l'adresse vidéo (0xA0000) mais étrangement alors que je suis en mode protégé et que mon segment couvre la totalité de l'espace adressable (base=0 limite = 0xFFFFFF) je n'arrive à accéder qu'aux premiers 64ko. (comme en mode réel!).

Si quelqu'un à une idée je suis preneur.
0
Stabia Messages postés 4 Date d'inscription samedi 12 janvier 2008 Statut Membre Dernière intervention 17 janvier 2008
12 janv. 2008 à 18:41
Encore moi, désolé jen'avais pas lu les deux pages !, une petite précison sous XP les applications n'ont pas accés aux plages-mémoire "sensible" (essayez de faire un "in" ou "out" par exemple), il faut passez par un pilote (cf. DDK)

Si vous voulez un assembleur sympa et pas pénible allez voir FASM
0
Rejoignez-nous