12

remap_pfn_range función (utilizado en mmap llamada en el controlador) se puede utilizar para asignar la memoria del núcleo al espacio del usuario. ¿Cómo se hace? ¿Alguien puede explicar pasos precisos? Kernel Mode es un modo privilegiado (PM) mientras que el espacio de usuario no tiene privilegios (NPM). En PM, la CPU puede acceder a toda la memoria, mientras que en NPM, parte de la memoria está restringida, la CPU no puede acceder a ella. Cuando se llama al remap_pfn_range, ¿cómo puede acceder al espacio de usuario ese rango de memoria que estaba restringido solo a PM?¿Cómo remap_pfn_range reasigna la memoria del kernel al espacio del usuario?

En cuanto a remap_pfn_range código allí es pgprot_t struct. Esta es la estructura relacionada con el mapeo de protección. ¿Qué es mapeo de protección? ¿Es la respuesta a la pregunta anterior?

Respuesta

10

Es realmente simple, la memoria del núcleo (generalmente) simplemente tiene una entrada en la tabla de páginas con el bit específico de la arquitectura que dice: "esta entrada en la tabla de páginas solo es válida mientras la CPU está en modo kernel".

Lo que remap_pfn_range hace es crear otra entrada de tabla de página, con una dirección virtual diferente a la misma página de memoria física que no tiene ese bit establecido.

lo general, es una mala idea por cierto :-)

6

El núcleo del mecanismo de la tabla de páginas se MMU:

Related image1 http://windowsitpro.com/content/content/3686/figure_01.gif

o esto:

Related image

Tanto La imagen de arriba son características de la memoria de hardware x86 MMU, no tiene nada que ver con el kernel de Linux.

A continuación se describe cómo los VMA está vinculada a task_struct del proceso:

Related image http://image9.360doc.com/DownloadImg/2010/05/0320/3083800_2.gif

Related image http://images.slideplayer.com/16/5079265/slides/slide_24.jpg

y mirando en la propia función aquí:

http://lxr.free-electrons.com/source/mm/memory.c#L1756

Los datos de la memoria física se puede acceder por el kernel throu gh PTE del núcleo, como se muestra a continuación:

Image result for page protection flags linux kernel http://www.tldp.org/LDP/tlk/mm/page-tables.gif

Pero después de llamar remap_pfn_range() una PTE (para una memoria del núcleo existente, sino que se utilizará en el espacio de usuario para acceder a ella) se deriva (con diferentes banderas de protección de la página) La memoria VMA del proceso se actualizará para usar este PTE para acceder a la misma memoria, lo que minimiza la necesidad de perder memoria al copiar. Pero núcleo y el espacio de usuario PTE tienen diferentes atributos - que se utiliza para controlar el acceso a la memoria física, y los VMA también especifica los atributos a nivel de proceso:

vma-> vm_flags | = VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP;

+0

"parte de que coincide con el de la tabla de páginas del núcleo, que no se duplica para cada proceso" cuando dice que quiere usted decir que sólo hay una copia de la tabla de páginas para el mapeo del núcleo que es utilizado por todos los procesos ? ¿Podrían dar más detalles sobre cómo se podría hacer eso? – user31986

+0

Quizás lea esto: http://turkeyland.net/projects/overflow/intro.php y de la imagen se puede ver ese proceso UN conjunto de tablas de páginas, cuya dirección base se cargará en el registro CR3. Y para todas esas direcciones virtuales (kernel específicamente) que se comparten entre procesos diferentes, todas tendrán el mismo valor apuntando a la misma página física. espero que se aclare. –

+0

¿Cómo sostiene uno el "semáforo mm"? –

Cuestiones relacionadas