To be able to effectively talk with a peripheral, we need to have a way to read and write within its registers and, to do that, we have two ways: by using I/O ports or by using I/O memory. The former mechanism is not covered in this book because it is not used so much in modern platforms (apart form x86 and x86_64 ones), while the latter just uses normal memory areas to map each peripheral register and is the one that is commonly used in modern CPUs. In fact, I/O memory mapping is really common in System-on-Chip (SoC) systems, where the CPU can talk to its internal peripherals just by reading and writing into well-known physical addresses; in this scenario, each peripheral has its own reserved address and each one is connected to a register.
Getting access to I/O memory
To see a simple example of what I'm talking about, you can get the SAMA5D3 CPU's datasheet from http...