Модель памяти Linux SPARSEMEM действительно скудна? - PullRequest
0 голосов
/ 25 сентября 2019

Я пытаюсь понять, как работает модель памяти Linux SPARSEMEM.Как я понимаю, когда установлен SPARSEMEM_VMEMMAP, существует второе отображение, которое «склеивает» mem_maps из разных (возможно, отключенных) разделов, так что отображение между PFN и page struct является непрерывным.Пока все хорошо.

Вопрос в том, что если в физической памяти есть дыры, то для преобразования из PFN/page в физический адрес должно потребоваться некоторое настраиваемое отображение, а не простая линейная алгебра, это правильно?

Но в следующем коде (ядро 5.3) это кажется простой математикой:

/include/asm-generic/memory_model.h
#define __phys_to_pfn(paddr)    PHYS_PFN(paddr)
/include/linux/pfn.h
#define PFN_PHYS(x) ((phys_addr_t)(x) << PAGE_SHIFT)
/include/linux/types.h
typedef u64 phys_addr_t;

Означает ли это, что физическое адресное пространство все еще должно быть непрерывным и НИКАКИЕ дыры не допускаются?Или я что-то здесь упустил?спасибо!

1 Ответ

0 голосов
/ 25 сентября 2019

Хорошая сводка о том, как SPARSEMEM работает здесь .

Sparsemem использует массив для предоставления различных трансляций pfn_to_page () для каждой области физической памяти SECTION_SIZE.Это то, что позволяет нарезать mem_map [].

...