First of all, some background. On x86_64 systems, there are two parts of virtual memory: high memory and low memory. Low memory goes from 0 to 0x00007FFFFFFFFFFF, and high memory goes from 0xFFFF800000000000 to ~0. Useful memory (physical memory, shared memory, DMA, etc) can only be mapped in these address ranges.
Generally speaking, the user's program image (code, globals, etc) is stored in low memory, and the heap and stack are stored at opposite ends of high memory.
ASan uses mmap at runtime to set up two "shadow" memory areas, one for high memory and one for low memory. This produces a virtual address space layout similar to what you see in this image. The memory layout is designed such that each addressable bit in the shadow area can be mapped to one byte in "real" memory.