Acredito que haja alguma confusão aqui, pois há uma diferença entre os dispositivos de E / S e os não-I / O.
Na Wikipédia E / S mapeada de memória (MMIO) :
Memory-mapped I/O uses the same address bus to address both memory and I/O devices – the memory and registers of the I/O devices are mapped to (associated with) address values. So when an address is accessed by the CPU, it may refer to a portion of physical RAM, but it can also refer to memory of the I/O device. Thus, the CPU instructions used to access the memory can also be used for accessing devices. Each I/O device monitors the CPU's address bus and responds to any CPU access of an address assigned to that device, connecting the data bus to the desired device's hardware register. To accommodate the I/O devices, areas of the addresses used by the CPU must be reserved for I/O and must not be available for normal physical memory.
Do seu artigo:
Base address Registers (or BARs) can be used to hold memory addresses used by the device, or offsets for port addresses. Typically, memory address BARs need to be located in physical ram while I/O space BARs can reside at any memory address (even beyond physical memory).
The Type field of the Memory Space BAR Layout specifies the size of the base register and where in memory it can be mapped. If it has a value of 0x00 then the base register is 32-bits wide and can be mapped anywhere in the 32-bit Memory Space. A value of 0x02 means the base register is 64-bits wide and can be mapped anywhere in the 64-bit Memory Space (A 64-bit base address register consumes 2 of the base address registers available).
Assim, não há conflito entre os dois, pois tudo depende do dispositivo. Se o dispositivo interceptar a referência de memória no barramento, o endereço será virtual. Se não, então é o endereço físico real que é usado para se comunicar com o dispositivo (por exemplo, NVRAM).
No entanto, em todos os casos, o endereço físico real é usado para dispositivos de E / S, já que as instruções do computador que se referem a ele só podem usar endereços reais. Essa memória pode ser desperdiçada se o dispositivo interceptar referências a ela. Para evitar esse desperdício, o sistema operacional geralmente o aloca além do memória física real (isso não causará erros de acesso ruim à memória, desde que o dispositivo irá interceptar todas as referências).
Esta é a razão do conhecido problema dos computadores Windows de 32 bits aparentemente não é capaz de usar todos os 4 GB de memória. A razão era que o Windows, sendo de 32 bits, alocava a memória do dispositivo usando endereços reais, que então ficou indisponível para ambos os casos: se a memória endereçada foi realmente usada, ou não usado porque foi interceptado pelo dispositivo.
Outro artigo útil da wikipedia é: Espaço de configuração PCI .