flat assembler
Message board for the users of flat assembler.

Index > Main > WBINVD / INVD

Author
Thread Post new topic Reply to topic
ouadji



Joined: 24 Dec 2008
Posts: 1081
Location: Belgium
ouadji 08 May 2011, 08:14

hi all Razz
Quote:

Intel/2B (WBINVD)

In situations where cache coherency with main memory is not a concern,
software can use the INVD instruction.
Confused Confused

in which cases the cache coherency with main memory is a concern,
and in in which cases this coherency (memory<->cache) is not a problem ?

When can I use "INVD " and when is it better, or essential to use "WBINVD"?

I think the coherency is always a problem.
It is never certain that all data are already written into main memory,
true or false (??)

_________________
I am not young enough to know everything (Oscar Wilde)- Image
Post 08 May 2011, 08:14
View user's profile Send private message Send e-mail Reply with quote
edfed



Joined: 20 Feb 2006
Posts: 4354
Location: Now
edfed 08 May 2011, 11:29
for memory mapped I/O, cache coherency is not a concern. it shouldn't be.
Post 08 May 2011, 11:29
View user's profile Send private message Visit poster's website Reply with quote
ouadji



Joined: 24 Dec 2008
Posts: 1081
Location: Belgium
ouadji 08 May 2011, 13:13

Edfed is French, so it's much easier for me to answer him in french.

Edfed, explique moi ça en français, s'il te plaît.
Parles-tu des espaces mémoires mappés des I/O, tels que les espaces mémoires de l'IOAPIC, ou des périphériques (clavier, cartes PCI) ? Si oui, bien entendu qu'il n'y a aucun soucis de correspondance pour ces espaces ... ils ne se trouvent tout simplement pas dans le cache. Et si non, de quoi parles-tu ? Mais quand est-il de la mémoire centrale ? Personnellement, je pense que l'on ne peut jamais être certain que la mémoire est "à jour" par rapport au cache... et dans ce cas, je ne vois pas bien quand on pourrait "sans risques" utiliser l'instuction INVD (?) Sujet complexe pour lequel la doc est rare et souvent "floue". Si tu as un avis éclairé sur le sujet, je suis preneur ! Ceci dit, j'ai "lu" à propos de ton bouquin, bravo pour le travail et le résultat obtenu.

_________________
I am not young enough to know everything (Oscar Wilde)- Image
Post 08 May 2011, 13:13
View user's profile Send private message Send e-mail Reply with quote
edfed



Joined: 20 Feb 2006
Posts: 4354
Location: Now
edfed 08 May 2011, 13:29
les memoires du type IOmapped couvrent tout ce qui est en rapport direct avec les peripheriques. donc, l'ecran, l'apic, le dma, etc... le clavier et la souris sont des ports, pas des ram.

aucune de ces zone ne doit ete en cache, c'est inutile, car l'action se passe en IOMAPPED et le CPU n'a presque rien à faire avec. la ram n'a meme pas à voir la dedans car elle est ignorée.

le cache est très simple en theorie, il ne fait que precharger des zones de données indiquées par les segments, comme c'est un mecanisme automatique, il faut le desactiver pour certaines zones. il existe de instructions pour ça, elles prenent en parametre l'adresse de base de la zone à forcer, que se soit pour la mise en cache, ou l'interdiction de mise en cache.

la plupart du temps, le CPU ne fait rien, ce temps, il l'emploie à remplir le cache avec les données utilisées dans le code.

donc, tout est une histoire de code. si tu veux gerer le cache au niveau de l'utilisation, il faut faire une fonction qui utilisera les instructions relatives au cache. c'est cette fonction qui rendra transparent le processus, en determinant d'après une table de la mémoire, quelles zones mettre en cache, et quelles zone interdire.

c'est toujours comme ça sur les PC, il faut travailler au niveau de l'ensemble, et rendre la chose transparente avec une interface propre au programmeur.

une analogie peut etre faite avec la mémoire de l'ecran VGA 0A000h, lorsque l'on joue sur le buffer, c'est de la ram, et lorsque l'on rafraichit l'ecran cette ram avec laquelle on joue est copiée dans la memoire video, en une seule passe.
l'illusion est parfaite, lorsque l'on affiche un pixel sur le buffer, on à l'impression qu'il s'affiche à l'ecran directement.
Post 08 May 2011, 13:29
View user's profile Send private message Visit poster's website Reply with quote
ouadji



Joined: 24 Dec 2008
Posts: 1081
Location: Belgium
ouadji 08 May 2011, 15:08

sorry for French. Too complex topic to speak in English ...
and edfed is French.

Merci pour ta réponse edfed.
Oui, les espaces mappés des entrées/sorties, je connais.
Je me suis amusé à utiliser le HPET (High Precision Event Timer). Programmation de l'IOAPIC pour assigner une nouvelle correspondance IRQ/INT. Le HPET déclenche l'IOAPIC via une IRQ, et l'IOAPIC envoit le vecteur correspondant. Hook des IDTs bien entendu (4 coeurs), gestionnaire d'interception et j'en passe, c'est très amusant et très instructif ... on apprend beaucoup... beaucoup de bsod aussi avant de trouver la "vraie" solution. C'est tip top au point maintenant et parfaitement stable. J'interromps les 4 coeurs à une fréquence de 15Khz et je surfe sur le net "derrière" (test infaillible pour la stabilié, hi)

bon ... tout ceci nous éloigne de ce problème de cache.
J'ai bien compris l'ensemble de ta réponse,
mais je reformule (autrement) mon interrogation.

Si dans mon code je modifie une variable "toto"... cette variable, utilisée par mon code se trouve dans le cache des processeurs. C'est un mécanisme automatique (hardware) d'optimisation, nous sommes d'accord à ce sujet. Mais ... à quel moment cette modification va-t-elle en réalité être retranscrite en mémoire centrale ? Personne ne peut le dire (il me semble). Si, une centaine de lignes plus loin dans mon code (ou 10.000, c'est pareil)... j'ai besoin d'invalider le cache, que faire ? utiliser INVD ou WBINVD ? La modification a-t-elle été retranscrite en mémoire, ou alors pas encore ? Comment le savoir ? Comment savoir si un "Write Back" est nécessaire ou inutile ? (inutile car le processeur "aurait" déjà fait le "write back" lui même) La variable en mémoire a-t-elle déjà été mise à jour ? ... peut être que oui ... peut être non ! voila, tu vois le problème. Mes excuses d'avoir été un peu long. Encore merci à toi.

_________________
I am not young enough to know everything (Oscar Wilde)- Image
Post 08 May 2011, 15:08
View user's profile Send private message Send e-mail Reply with quote
neville



Joined: 13 Jul 2008
Posts: 507
Location: New Zealand
neville 08 May 2011, 20:27
ouadji wrote:

It is never certain that all data are already written into main memory,
true or false (??)
False, it is ALWAYS certain (when you have a Memory Operating System Cool )

_________________
FAMOS - the first memory operating system
Post 08 May 2011, 20:27
View user's profile Send private message Visit poster's website Reply with quote
LocoDelAssembly
Your code has a bug


Joined: 06 May 2005
Posts: 4624
Location: Argentina
LocoDelAssembly 08 May 2011, 20:41
neville, have you actually tested this? Try writing something into memory, and then use this instruction and then attempt to read the memory again to see if your data is still there (really, I'm curious to know what happens and can't test here Razz)

For instance, use the following sequence:
Code:
mov dword [some_address], 0
wbinvd

mov dword [some_address], 'LOCO'
invd

push 100'000'000
.loop:
; Just in case some waiting is needed this probably gives enough time
xor eax, eax
cpuid
dec dword [esp]
jnz .loop
pop eax

mov eax, [some_address]
; Check EAX value here.    
Post 08 May 2011, 20:41
View user's profile Send private message Reply with quote
ouadji



Joined: 24 Dec 2008
Posts: 1081
Location: Belgium
ouadji 08 May 2011, 22:56

I have not checked ... but ... 0 ?

EDIT:

I tried to check (ring0) but I can not!
With "INVD" my debugger crashes, bsod Crying or Very sad ... (syser)
This proves that all changes in cache have not been written into memory...
the main memory is not updated.
My debugger has lost its data.

(with only "WBINVD" no problem)

_________________
I am not young enough to know everything (Oscar Wilde)- Image
Post 08 May 2011, 22:56
View user's profile Send private message Send e-mail Reply with quote
Display posts from previous:
Post new topic Reply to topic

Jump to:  


< Last Thread | Next Thread >
Forum Rules:
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Copyright © 1999-2025, Tomasz Grysztar. Also on GitHub, YouTube.

Website powered by rwasa.