There are also variations such as I/O instructions using a separate address range, independent of the instruction/data address range - typical of Intel-based CPUs.
In comparison, other such as many Motorola based ones have a single address range and it's down to the system designer to map I/O somewhere in that range, accessed by the same instructions as any other data.
And such as where the CPU looks for the first instruction on start up / reset, or an address for that - the lowest memory address, or the higher address.
The appropriate area generally needs to have ROM there, to hold the startup code or BIOS etc.
Plus on many systems memory management which allows re-mapping of any section or block of physical memory to any part or block of the CPU basic address space.
That can include stopping the program if an access is requested to an incorrect area so the memory map can be re-arranged to suit, or even for data to be swapped out and in from external storage to free up memory for the present task.