Qual é a diferença entre o ioremap e a operação de arquivo mmap?

5

Atualmente estou trabalhando em um driver de dispositivo PCI para o Ubuntu. Eu tenho um código de exemplo sobre o driver PCI, mas tenho dificuldade em entender o ioremap e o file_operation.mmap.

A descrição da operação do arquivo mmap:

Memory mapping is one of the most interesting features of modern Unix systems. As far as drivers are concerned, memory mapping can be implemented to provide user programs with direct access to device memory. Mapping a device means associating a range of user-space addresses to device memory. Whenever the program reads or writes in the assigned address range, it is actually accessing the device.

A descrição do ioremap:

On many systems, I/O memory is not directly accessible in this way at all. So a mapping must be set up first. This is the role of the ioremap function.The function is designed specifically to assign virtual addresses to I/O memory regions.

A descrição acima vem de "makelinux". Mas ainda não tenho certeza se entendi corretamente a diferença entre as duas funções. Por ora, entendo da seguinte forma: O fops.mmap (mmap de operação de arquivo) associa um intervalo de endereços de espaço do usuário à memória do dispositivo. O que significa que para um dispositivo pci, fazemos um mapa de endereço real para o BAR do dispositivo com fops.mmap . E com ioremap , fazemos um mapa de endereço virtual para esses "endereços reais" obtidos de fops.mmap .

Alguém poderia me dizer se eu estava errado? Thx ~

PS. Eu postei isso também na comunidade Ubuntu, espero não ter quebrado nenhuma regra.

    
por Cong Li 28.10.2015 / 13:31

2 respostas

6

Eu sugiro que você procure no livro do LDD3 , ele é gratuito. Ele explica ioremap no capítulo 9, página 249. Também procure em APIU 3rd edition , capítulo 14.8, página 525. Deixe-me resumir melhor para minhas habilidades:

ioremap é uma função do kernel que permite acessar o hardware através de um mecanismo chamado memória mapeada de E / S. Existem certos endereços na memória que são interceptados pela placa-mãe entre a CPU e a RAM e redirecionados para outro hardware, como discos ou teclado. Não tenho certeza se você pode usar o endereçamento usual por meio de ponteiros ou outras funções do kernel.

I/O memory is simply a region of RAM-like locations that the device makes available to the processor over the bus. This memory can be used for a number of purposes, such as holding video data or Ethernet packets, as well as implementing device registers that behave just like I/O ports (i.e., they have side effects associated with reading and writing them).

mmap é um syscall disponível no espaço do usuário que mapeia uma região de memória de processo para o conteúdo de um arquivo, em vez de uma RAM. Quando você acessa aquela região de memória mapeada, através da referência de ponteiro usual, o kernel traduz para uma operação de arquivo. Basicamente, gravar na memória torna-se gravar em um arquivo. É apenas uma maneira mais extravagante de chamar write ().

Memory-mapped I/O lets us map a file on disk into a buffer in memory so that, when we fetch bytes from the buffer, the corresponding bytes of the file are read. Similarly, when we store data in the buffer, the corresponding bytes are automatically written to the file. This lets us perform I/O without using read or write.

(sidenote) Eu acho que primeiro é chamado de "IO mapeado memória" e segundo é chamado de "memória mapeada IO". Não admira que você esteja confuso.

    
por 28.10.2015 / 17:20
0

O acesso à memória do espaço do usuário é limitado aos endereços de espaço do usuário. Além de mapear um arquivo na memória, o mmap pode ser usado para acessar a memória física, como os registros IO. Você precisa do superusuário para abrir "/ dev / mem" e depois mapear a região da memória física requerida. Então você pode ler e gravar em registros IO. Na maioria dos sistemas, o endereço físico a ser mapeado deve estar em um limite de página.

    
por 15.02.2016 / 22:13