Wie wird der x86-Anweisungscache synchronisiert?

Ich mag Beispiele, also habe ich ein bisschen selbstmodifizierenden Code in 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;
}

... was anscheinend funktioniert:

>>> 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

Aber ehrlich gesagt habe ich nichterwarten von es überhaupt zu arbeiten. Ich habe erwartet, dass die Anweisung enthältc[2] = 0 beim ersten Aufruf von zwischengespeichert werdenc, danach alle aufeinander folgenden Anrufe anc würde die wiederholten Änderungen ignorierenc (es sei denn, ich habe den Cache explizit ungültig gemacht). Zum Glück scheint meine CPU schlauer zu sein.

Ich denke, die CPU vergleicht RAM (vorausgesetztc befindet sich sogar im RAM) mit dem Anweisungscache, wenn der Anweisungszeiger einen großen Sprung ausführt (wie beim Aufruf des oben abgebildeten MMAP-Speichers) und den Cache ungültig macht, wenn er nicht übereinstimmt (alles?), aber ich hoffe auf genauere informationen dazu. Insbesondere würde ich gerne wissen, ob dieses Verhalten als vorhersehbar angesehen werden kann (abgesehen von Unterschieden zwischen Hardware und Betriebssystem) und auf das man sich verlassen kann.

(Ich sollte mich wahrscheinlich auf das Intel-Handbuch beziehen, aber das Ding ist Tausende von Seiten lang und ich neige dazu, mich darin zu verlieren ...)

Antworten auf die Frage(5)

Ihre Antwort auf die Frage