включить / отключить кэш на 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.