Application software usually benefits from a number of abstractions available in the environment, for the handling of memory. In modern operating systems for personal computers, each process can access its own memory space, which can also be relocated by the system, to resize or move memory blocks using a different physical location. Moreover, dynamic memory allocations are possible through virtual memory pools provided by the kernel. Embedded devices do not rely on these mechanisms, as there is no way to assign virtual addresses to physical memory locations. In all contexts and running modes, all the symbols can be accessed only by pointing at physical addresses.
As we have seen in the previous chapter, booting a bare-metal embedded application requires defining the sections at compile time within the assigned regions in the available address space using the linker...