A E / S mapeada na memória é usada somente internamente pelo SO, não exposta e usada por programadores em cima do Linux?

1

No Operating System Concepts, os arquivos mapeados na memória e a E / S mapeada na memória são duas coisas diferentes. Veja abaixo sobre E / S de memória mapeada.

Para usar arquivos mapeados na memória, temos mmap() .

Para usar a E / S mapeada na memória, quais funções podemos usar? A E / S de mapeamento de memória é usada apenas internamente pelo SO, não exposta e usada por programadores em cima do Linux?

Obrigado.

In the case of I/O, as mentioned in Section 1.2.1, each I/O controller includes registers to hold commands and the data being transferred. Usually, special I/O instructions allow data transfers between these registers and system memory. To allow more convenient access to I/O devices, many computer architectures provide memory-mapped I/O. In this case, ranges of memory addresses are set aside and are mapped to the device registers. Reads and writes to these memory addresses cause the data to be transferred to and from the device registers. This method is appropriate for devices that have fast response times, such as video controllers. In the IBM PC, each location on the screen is mapped to a memory location. Displaying text on the screen is almost as easy as writing the text into the appropriate memory-mapped locations.

...

How can the processor give commands and data to a controller to accomplish an I/O transfer? The short answer is that the controller has one or more registers for data and control signals. The processor communicates with the controller by reading and writing bit patterns in these registers. One way in which this communication can occur is through the use of special I/O instructions that specify the transfer of a byte or word to an I/O port address. The I/O instruction triggers bus lines to select the proper device and to move bits into or out of a device register. Alternatively, the device controller can support memory-mapped I/O. In this case, the device-control registers are mapped into the address space of the processor. The CPU executes I/O requests using the standard data-transfer instructions to read and write the device-control registers at their mapped locations in physical memory.

    
por Tim 16.10.2018 / 15:13

2 respostas

8

No Linux, o MMIO é possível a partir do espaço do usuário usando mmap on /dev/mem . Por exemplo, o servidor X faz

fd = open("/dev/mem", O_RDWR);
if (ioBase == NULL) {
    ioBase = (volatile unsigned char *) mmap(0, 0x20000,
                                             PROT_READ | PROT_WRITE,
                                             MAP_SHARED, fd, ioBase_phys);
}
close(fd);

em alguns casos. Isso está saindo de moda e o kernel controla rigorosamente o que pode ser feito usando esse tipo de acesso: acessar /dev/mem requer CAP_SYS_RAWIO , e os kernels de distribuição hoje em dia tendem a ser construídos com STRICT_DEVMEM e IO_STRICT_DEVMEM que restringem o acesso via /dev/mem a alguns intervalos na memória, seja necessário para DOSEMU ou X, ou mapeado para dispositivos e de outra forma não utilizado ( ie fornecendo MMIO para um dispositivo que não é manipulado por um driver).

    
por 16.10.2018 / 15:48
4

E / S de memória mapeada é feita por mmap() ing uma região de um arquivo e, em seguida, usando os dados mapeados.

Se você usa um sistema operacional moderno, o sistema operacional faz a maioria dos processos de I / O internamente:

  • mapeie partes do arquivo em uma área de kernel transitória

  • copyout() os dados mapeados para o espaço de endereço do usuário. Isso faz com que o conteúdo do arquivo seja colocado em falha na área de memória temporária do kernel.

  • desmapear a região

BTW: se você está se referindo a acessar hardware do espaço do usuário, isso geralmente é feito, por exemplo pelo X Server que mmap() s o hardware da placa gráfica e acessa-o do espaço do usuário.

Os registros do dispositivo são acessíveis como endereços de memória e você apenas escreve um código que parece estar dentro do kernel. Em outras palavras: você não usa read () ou write (), mas apenas os ponteiros de cancelamento de referência que apontam para os endereços dos registradores de hardware.

    
por 16.10.2018 / 15:24