Usar memória virtual não é opcional, um aplicativo não pode evitá-lo. Supondo que estamos falando de memória protegida x86, que é o que a maioria dos sistemas operacionais atuais, como Linux, OS X e Windows, usam no x86.
Basicamente, cada processo vê um espaço de endereço virtual (VAS) de 4 GB. O sistema operacional, em conjunto com o hardware, configura as chamadas tabelas de descritor de página (PDT) que descrevem como esse VAS é mapeado, com granularidade de página (geralmente 4 KB). Uma página pode ser mapeada para a memória física, pode ser mapeada para um arquivo (o que significa que quando o processo tenta ler a partir daquela parte do VAS, ele vai se prender no sistema operacional que lerá a página do arquivo no disco e coloque-o na memória), ou pode não ser mapeado em todos os casos, caso em que tentar acessar essa parte do VAS fará com que o processo trave. E, à parte, enquanto a memória do kernel é mapeada no processo, o processo não pode acessá-la diretamente e irá falhar se tentar fazer isso.
E, o sistema operacional pode usar um arquivo de paginação ou uma partição swap, permitindo que o sistema operacional mova páginas de memória menos usadas para o disco e use a memória para algo mais útil. Novamente, se isso acontecer, os PDTs precisam ser atualizados de acordo e, assim como os arquivos mapeados na memória, se o processo tentar acessar as páginas que foram trocadas, ele será retido no sistema operacional, o que trará a página de volta à memória. (Embora a capacidade de troca seja frequentemente confundida com a memória virtual em si, a ideia fundamental por trás da memória virtual é o conceito de os endereços virtuais serem distintos dos endereços de memória física.)