Почему времена пропуска TLB не равны временам ошибки страницы - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь узнать об управлении памятью, если ядро ​​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 меньше, чем время отказа страницы?

...