usuario - ¿Cómo mapear páginas usando el controlador de fallas de página?
elimino impresora y vuelve a aparecer (1)
Quiero utilizar el controlador de página predeterminada de mi struct vm_area_struct *
para asignar una página física al espacio de usuario.
Así es como procedo:
-
alloc_page(GFP_USER)
una página globalmente usandoalloc_page(GFP_USER)
durante la inicialización del módulo (probé varias GFP). - Creo una
struct vm_area_struct
, establezco un controlador personalizado de default de página y adjuntovma
acurrent->mm
.
Cuando ocurre un error de página:
- Establecí
vmf->page
en la página quevmf->page
previamente y devuelvo 0.
El resultado es que cada página virtual en el vma
debe asignar a la misma página física después de un error de página.
Pero esto es lo que noté:
- Cuando escribo en la página desde mi módulo kernel, se refleja en mi programa de espacio de usuario.
- Cuando escribo en la página desde mi espacio de usuario, no lo veo desde mi módulo kernel.
- Cuando uso
get_user_pages
en mi módulo kernel para obtener la página (en lugar de usar mi variable global), obtengo una dirección física diferente a la variable de página global.page_to_phys(page)
la dirección usandopage_to_phys(page)
. Escribir en esta página se refleja en mi programa de espacio de usuario.
Todo esto se hace en el controlador de fallas de página por cierto.
¿Cómo se puede explicar este curioso comportamiento?
Para acceder a la página desde el espacio del kernel, estoy usando kmap_atomic
y kunmap_atomic
.
Esto se debe al mecanismo de copiado por escritura. Después de que se ejecuta el controlador de errores de página, la página que devolvió en vmf->page
se copia en una página recientemente asignada. Esta es la razón por la cual sus cambios en el espacio de usuario no se reflejan en su módulo kernel. La página que intentabas leer en el kernel no es la que realmente se asignó en tu proceso de espacio de usuario.
Puede do_cow_fault
función do_cow_fault
en mm/memory.c
.