Я пытаюсь узнать об управлении памятью, если ядро Linux, и я пишу код так:
//mem.c
#include <stdio.h>
#include <malloc.h>
#include <unistd.h>
void main()
{
char *brk_end = NULL;
char *p = sbrk(0);
int nr = 10000, i = 0;
brk(p + 4096*nr);
i = 0;
for (i = 0; i < nr; i++) {
*(p + (i*4096) + 100) = 1;
}
}
По моему мнению, каждый раз, когда я делаю *(p + (i*4096) + 100)
fault, происходит сбой страницы (размер страницы 4K). И я добавляю код в ядро Linux, например, для захвата страницы:
if (memcmp(current->comm, "mem", 3)) {
g_counter++;
}
"mem" - это имя моего процесса, и я компилирую ядро. Наконец, g_counter
указывает, что эта программа на самом деле вызывает примерно 10000 раз ошибки страницы.
По моему мнению, сбой страницы должен произойти после пропуска TLB, поэтому время пропуска TLB должно быть равно времени сбоя страницы. Но когда я пытаюсь использовать perf
для обнаружения пропуска TLB программы, я получаю другой ответ:
$perf stat -e dTLB-load-misses,iTLB-load-misses ./mem >/dev/null
Performance counter stats for './mem':
7,426 dTLB-load-misses
397 iTLB-load-misses
0.022220726 seconds time elapsed
Почему время пропуска TLB меньше, чем время отказа страницы?