Estoy buscando una manera de dividir las asignaciones de página enorme (2MiB) del kernel en las entradas de tabla de página más pequeñas (4KiB). Hasta ahora, solo encontré la función set_memory_4k , que solo funciona durante la etapa inicial de arranque (la variable global early_boot_irqs_disabled debe ser verdadera). Soy un poco reacio a deshabilitar las interrupciones para llamar a esta función, pero no conozco ninguna otra forma de dividir una tabla de páginas del kernel (no del usuario).
El objetivo es mapear páginas individuales de 4 KB con diferentes permisos. Sin embargo, las páginas devueltas a través alloc_pages() suelen formar parte de asignaciones de 2 MB. No tengo la opción de usar ningún otro asignador ( vmalloc , kmalloc , memblock , ...), por lo que debo usar la función alloc_pages() o cualquiera de sus variantes.
Información adicional:
Soy consciente de la función existente split_huge_page . Desafortunadamente, este enfoque no funciona para las struct page que representan la memoria del kernel. La razón de esto (según LWN ) es que el campo page->mapping , que se verifica antes de la división, no debe ser NULL . Esto no se aplica a las páginas del kernel, por lo que este enfoque también parece funcionar solo para las páginas del espacio del usuario.
No estoy seguro de entender su pregunta con claridad. Veo que lo que necesitas es split_huge_pmd no split_huge_page ?