flat assembler
Message board for the users of flat assembler.
![]() |
Author |
|
edfed 08 May 2011, 11:29
for memory mapped I/O, cache coherency is not a concern. it shouldn't be.
|
|||
![]() |
|
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. |
|||
![]() |
|
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. |
|||
![]() |
|
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. |
|||
![]() |
|
neville 08 May 2011, 20:27
ouadji wrote:
![]() _________________ FAMOS - the first memory operating system |
|||
![]() |
|
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
![]() 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. |
|||
![]() |
|
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 ![]() 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) |
|||
![]() |
|
< Last Thread | Next Thread > |
Forum Rules:
|
Copyright © 1999-2025, Tomasz Grysztar. Also on GitHub, YouTube.
Website powered by rwasa.