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