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).