¿Cómo se sincroniza el caché de instrucciones x86?

Me gustan los ejemplos, así que escribí un poco de código auto-modificable en c ...

#include <stdio.h>
#include <sys/mman.h> // linux

int main(void) {
    unsigned char *c = mmap(NULL, 7, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|
                            MAP_ANONYMOUS, -1, 0); // get executable memory
    c[0] = 0b11000111; // mov (x86_64), immediate mode, full-sized (32 bits)
    c[1] = 0b11000000; // to register rax (000) which holds the return value
                       // according to linux x86_64 calling convention 
    c[6] = 0b11000011; // return
    for (c[2] = 0; c[2] < 30; c[2]++) { // incr immediate data after every run
        // rest of immediate data (c[3:6]) are already set to 0 by MAP_ANONYMOUS
        printf("%d ", ((int (*)(void)) c)()); // cast c to func ptr, call ptr
    }
    putchar('\n');
    return 0;
}

... que funciona, al parecer:

>>> gcc -Wall -Wextra -std=c11 -D_GNU_SOURCE -o test test.c; ./test
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29

Pero honestamente, no lo hice.esperar para que funcione en absoluto. Esperaba la instrucción conteniendoc[2] = 0 para ser almacenado en caché en la primera llamada ac, tras lo cual todas las llamadas consecutivas ac ignoraría los repetidos cambios realizados enc (A menos que de alguna manera explícitamente invalide el caché). Afortunadamente, mi cpu parece ser más inteligente que eso.

Supongo que la CPU compara RAM (asumiendo quec incluso reside en la memoria RAM) con el caché de instrucciones cada vez que el puntero de la instrucción realiza un gran salto (como en el caso de la llamada a la memoria mmapped anterior), e invalida el caché cuando no coincide (¿todo esto?), pero Espero obtener información más precisa sobre eso. En particular, me gustaría saber si este comportamiento puede considerarse predecible (a menos que exista alguna diferencia de hardware y sistema operativo), y se puede confiar en él.

(Probablemente debería consultar el manual de Intel, pero esa cosa tiene miles de páginas y tiendo a perderme en ella ...)

Respuestas a la pregunta(5)

Su respuesta a la pregunta