Memory-Mapped I/O vs Port I/O

In memory-mapped I/O, how does the CPU communicate with hardware devices?

A

The CPU sends data to devices over the network stack

B

Through special I/O instructions that use a separate address bus

C

Device registers are mapped into the regular memory address space

D

The OS kernel forwards messages to devices through system calls