включить / отключить кэш на 64-битной машине Intel: бит CD всегда установлен?

Я пытаюсь отключить все уровни кэша для моей машины Intel (R) Xeon (R) CPU E5-1650 v2 @ 3,50 ГГц в Xen. Я написал инструмент для вызова следующего кода сборки, чтобы отключить / включить кэш и показать регистр CR0 'с ценностью.

case XENMEM_disable_cache:
    __asm__ __volatile__(
        "pushq %%rax\n\t"
        "movq %%cr0,%%rax\n\t"
        "orq $0x40000000,%%rax\n\t"
        "movq %%rax,%%cr0\n\t"
        "movq %%cr0, %0\n\t"
        "wbinvd\n\t"
        "popq  %%rax"
        : "=r"(cr0)
        :
        :);
    // gdprintk(XENLOG_WARNING, "gdprintk:XENMEM_disable_cache disable cache!
    // TODO IMPLEMENT\n");
    printk("printk: disable cache! cr0=%#018lx\n", cr0);
    rc = 0;
    break;

case XENMEM_enable_cache:
    __asm__ __volatile__(
        "pushq %%rax\n\t"
        "movq %%cr0,%%rax\n\t"
        "andq $0xffffffffbfffffff,%%rax\n\t" /*~0x4000000*/
        "movq %%rax,%%cr0\n\t"
        "movq %%cr0, %0\n\t"
        "popq  %%rax"
        : "=r"(cr0)
        :
        :);
    printk("printk: enable cache; cr0=%#018lx\n", cr0);
    rc = 0;
    break;

case XENMEM_show_cache:
    __asm__ __volatile__(
        "pushq %%rax\n\t"
        "movq %%cr0, %%rax\n\t"
        "movq %%rax, %0\n\t"
        "popq %%rax"
        : "=r"(cr0)
        :
        :);
    // gdprintk(XENLOG_WARNING, "gdprintk:XENMEM_show_cache_status! CR0 value is
    // %#018lx\n", cr0);
    printk("printk: XENMEM_show_cache_status! CR0 value is %#018lx\n", cr0);
    return (long)cr0;

Код можно скомпилировать и запустить. После запуска кода отключения кэша система работает очень медленно, что подтверждает отключение кэша. Кроме того, значение CR0 показывает, что бит CD установлен, когда я запускаю код отключения кэша.

Однако, когда я запускаю код show cache, вывод показывает, что бит CD CR0 равен 0, независимо от того, я отключаю / включаю кеш.

Мой вопрос:

Всегда ли бит CD (30 бит) регистра CR0 равен 1, когда кеш отключен?

Если нет, то, должно быть, что-то не так с моим кодом, не могли бы вы помочь мне указать на ошибку, которую я сделал?

ОТВЕТ:

Приведенный выше код устанавливает бит CD регистра CR0 только в том ядре, где выполняется код. Нам нужно использовать smp_call_function () для вызова кода на всех ядрах!

Мой новый вопрос:

Если я отключаю кеш, а затем включаю кеш, используя приведенный выше код, бит CD CR0 очищается. Тем не менее, система "Производительность по-прежнему очень и очень низкая, как при отключении кеша. Так что мне кажется, что включение кеш-кода НЕ работает? Однако, поскольку бит CD был очищен, включающий код кэша должен был работать! Итак, вопрос в том, как долго я должен ждать после того, как я включу кеш, чтобы я мог иметь такую же производительность, как и производительность, прежде чем отключить кеш?

Кстати, когда я запускаю код enble cache, вывод printk показывает, что CR0 'CD бит равен 0.

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

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