Normally when the debugger accesses memory, it uses virtual addresses. However,
if the MMU is disabled, then the mapping is flat and the virtual address is the same
as the physical address.
To force the debugger to use physical addresses, prefix the addresses
P:0+main creates a physical address with the address offset of main()
If your processor additionally contains TrustZone technology, then you have access to Secure and Normal worlds, each with their own separate virtual and physical address mappings. In this case, the address prefix
P: is not available, and
instead you must use
NP: for normal physical and
SP: for secure physical.
Physical address access is not enabled for all operations. For example, the ARM hardware does not provide support for setting breakpoints via a physical address.
When memory is accessed via a physical address the caches are not flushed. Hence, results might differ depending on whether you view memory through the physical or virtual addresses (assuming they are addressing the same memory addresses).