Como se determina o número do quadro da página para a memória do dispositivo?

9

De LDD3 / Ch. 15 / seções "Utilizando remap_pfn_range" e "A Simple Implementation", pfn foi igualado ao campo vm_pgoff. Eu estou confusa com isso. Como isso pode ser assim?

Note que vm_pgoff é descrito como:

  

O deslocamento da área no arquivo, nas páginas. Quando um arquivo ou dispositivo é   mapeada, esta é a posição do arquivo da primeira página mapeada neste   área.

Assim, se a primeira página mapeada também corresponder à primeira página do arquivo (o que, eu acho que seria bastante comum), o vm_pgoff seria 0. correto? Nesse caso, esse não parece ser o valor correto para o parâmetro pfn de remap_pfn_range (). O que estou perdendo aqui? Qual é o valor correto? Para facilitar a referência, estou reproduzindo o código relevante do LDD3 abaixo (Página no. 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;
...
}
    
por venk 15.07.2012 в 09:56
fonte

1 resposta

5

O exemplo específico que você forneceu está implementando um arquivo de dispositivo de caracteres que permite mapear a memória física, muito semelhante a / dev / mem. Ao especificar o deslocamento do arquivo, você especifica o endereço da memória física. Daí o cálculo que leva o deslocamento e divide no tamanho da página para encontrar o PFN.

Para um driver de dispositivo "real", você normalmente teria o endereço físico dos registradores mapeados na memória do dispositivo ou a RAM codificada a partir da especificação do dispositivo e usá-los para derivar o PFN (dividindo pelo tamanho da página). / p>     

por gby 16.07.2012 / 07:29
fonte