2012-07-23 13 views
7

Estoy trabajando en un pequeño sistema integrado. Cuando mi linux se inicia en el espacio de usuario, sé dónde están mis dispositivos en la memoria física. Quiero mapearlos en direcciones virtuales de espacio de usuario. Actualmente, lo estoy haciendo a través de un módulo kernel. Uso vmalloc/kmalloc (dependiendo del tamaño) y luego uso ioremap_page_range en las direcciones virtuales devueltas para mapear mis direcciones físicas. No creo que sea la forma correcta de hacerlo. En primer lugar, estoy asignando memoria y luego estoy pidiendo kernel para reasignar ese espacio de direcciones virtuales a un espacio de dirección física diferente. (Inicialmente mapeado físico-> virtual en vmcall/kmalloc es un poco inútil ya que no me importa esas páginas físicas. Esto definitivamente no es bueno.)Asignación de direcciones físicas a la dirección virtual de Linux

En lugar de esto, hay una mejor manera de asignar la memoria física conocida al usuario proceso espacial. (Sé que no sea mi proceso de espacio de usuario, nadie va a tocar esa memoria.)

Gracias

Respuesta

5

Lo que estamos tratando de hacer es tener acceso a lo que se llama memoria IO. Sólo puedo animar a leer la Linux Device Drivers libro (LDD) y más específicamente el capítulo 9.

Para "asignar" una región, es necesario llamar a

struct resource *request_mem_region(unsigned long start, unsigned long len, char *name) 

. Antes de que el conductor puede acceder a ella, hay que asignarle una dirección virtual, esto se hace con una llamada a

void *ioremap(unsigned long phys_addr, unsigned long size) 

Para asegurarse de que su conductor le luego trabajar en diferentes arquitecturas/plataformas, asegúrese de usar un poco de acceso funcionan en tales áreas (ioread8/16/32 o iowrite8/16/32 y todas sus variantes).

3

En el módulo del kernel, remap_pfn_range() se puede utilizar para convertir la dirección física a la dirección virtual. El siguiente enlace será útil.

How remap_pfn_range remaps kernel memory to user space?

+0

Necesito hacer mmap antes de hacer remap_pfn. Sin embargo, no quiero hacer eso. No tengo un dispositivo conectado con esa memoria. Por lo tanto, quiero asignar directamente esa memoria física a la dirección virtual. Gracias –

0

En el módulo Kernel, remap_pfn_range() se puede usar para convertir la dirección física a la dirección virtual. Cuando no tiene un dispositivo real, puede: 1) crear un dispositivo virtual y, 2) usar mmap en esos dispositivos virtuales para acceder a la misma memoria del kernel a través de la correlación virtual remap_pfn_range de ese proceso. 3) Por lo general, en entornos dedicados, además, puede fijar esas páginas físicas para que no sean quitadas de su proceso. 4) También comparte estas direcciones físicas con diferentes procesos, pero necesitará manejar la sincronización, independientemente a través de otros mecanismos de IPC, ya que en cada proceso se verán como direcciones diferentes.

Cuestiones relacionadas