On many micro-controllers and micro-processors the program will be using direct physical addresses, for example, ARM, PIC, ST20, 68000, such platforms do not have a memory management unit by default.
There are many OSs available for these platforms such as ThreadX, uCOS/uCOSII, vxWorks, OpenOS, Nucleus, these tend to be relatively light OSs just providing a threading facility with task synchronisation objects, may be some timing facilities and memory management code. Some, like ThreadX, vxWorks, Nucleus have lots of optional modules for control of various hardware peripherals (USB stack, network etc).
On the other hand some micro-controllers, e.g. Cyan eCog1x, have on board memory management units separating logical address from physical address.
Virtual memory/swap partitions just provide an extra source of RAM albeit slower. Normally platforms with swap space use it to store the data for programs that are not currently running. However any system whether it has virtual memory or not is limited to using only the memory it has available.
Your available memory on a system with virtual memory is (virtual memory size* + physical ram size) on a system without virtual memory you are limited to physical ram size.
In either case the OS has to find space for all the memory required for all the processes it is currently running. Although it is not normal for a program to directly access the virtual memory, the OS will swap pages of virtual memory into an out of physical RAM so that the running programs data is in RAM for access.
On an embedded platform normally you will only be running 1 process, possibly with multiple threads.
*Note windows can dynamically increase the size of its virtual memory size however if you get to that point in my experience you will be suffering serious system degradation because too high a proportion of ram is being served from virtual memory.