2012-07-15 7 views
9

De LDD3/Ch. 15/secciones "Usando remap_pfn_range" y "A Simple Implementation", pfn se ha equiparado al campo vm_pgoff. Estoy confundido por esto. ¿Cómo puede ser eso?¿Cómo se determina el número de cuadro de página para la memoria del dispositivo?

Tenga en cuenta que vm_pgoff se describe como:

El desplazamiento de la zona en el archivo, en las páginas. Cuando un archivo o dispositivo está mapeado , esta es la posición del archivo de la primera página asignada en esta área .

Por lo tanto, si la primera página asignada corresponde también a la primera página del archivo (que, creo que sería bastante común), vm_pgoff sería 0. ¿correcto? Si es así, este no parece ser el valor correcto para el parámetro pfn de remap_pfn_range(). ¿Que me estoy perdiendo aqui? ¿Cuál es el valor correcto? Para facilitar la consulta, reproduzco el código relevante de LDD3 a continuación (Página nº. 426)

static int simple_remap_mmap(struct file *filp, struct vm_area_struct *vma) 
{ 
if (remap_pfn_range(vma, vma->vm_start, vm->vm_pgoff, 
        vma->vm_end - vma->vm_start, 
        vma->vm_page_prot)) 
    return -EAGAIN; 
... 
} 

Respuesta

5

El ejemplo específico que nos ha facilitado está llevando a cabo un archivo de dispositivo de caracteres que permite que uno mapa de memoria física, muy similar a/dev/mem. Al especificar el desplazamiento del archivo, especifica la dirección de la memoria física. De ahí el cálculo que toma el desplazamiento y se divide en el tamaño de página para encontrar el PFN.

Para un controlador de dispositivo "real", normalmente tendría la dirección física de los registros mapeados en la memoria del dispositivo o memoria RAM codificada en la especificación del dispositivo, y use eso para derivar el PFN (dividiendo por el tamaño de página).

Cuestiones relacionadas