vuelve usuario tipo quitar puede modo manualmente impresora elimino eliminar dispositivo denegado controladores controlador como aparecer acceso c linux-kernel virtual-memory

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 usando alloc_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 adjunto vma a current->mm .

Cuando ocurre un error de página:

  • Establecí vmf->page en la página que vmf->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 usando page_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 .