Как синхронизируется кэш инструкций x86?

Мне нравятся примеры, поэтому я написал немного самоизменяющегося кода на 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;
}

... который работает, по-видимому:

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

Но, честно говоря, я неexpect это работать на всех. Я ожидал инструкции, содержащейc[2] = 0 быть кэшированным при первом вызовеcпосле чего все последовательные звонкиc будет игнорировать повторные изменения, внесенные вc (если я каким-то образом явно не сделал кэш недействительным). К счастью, мой процессор оказался умнее этого.

Я думаю, что процессор сравнивает оперативную память (при условии,c даже находится в ОЗУ) с кешем инструкций всякий раз, когда указатель инструкций совершает скачок большого размера (как в случае вызова mmapped memory выше), и делает кэш недействительным, когда он не совпадает (все это?), но я Я надеюсь получить более точную информацию об этом. В частности, я хотел бы знать, можно ли считать такое поведение предсказуемым (за исключением каких-либо различий в оборудовании и операционной системе) и на которое можно положиться?

(Вероятно, мне следует обратиться к руководству Intel, но эта страница насчитывает тысячи страниц, и я, как правило, теряюсь в ней ...)

Ответы на вопрос(5)

Ваш ответ на вопрос