Ядро Linux отображает большую часть виртуального адресного пространства, принадлежащего ядру, для выполнения сопоставления 1: 1 со смещением первой части физической памяти. (чуть меньше, чем для 1Gb для 32-битной x86, может отличаться для других процессоров или конфигураций). Например, для кода ядра на x86 адрес 0xc00000001 сопоставлен с физическим адресом 0x1.
Это называется логическим отображением - отображением 1: 1 (со смещением), которое позволяет ядру получать доступ к большей части физической памяти компьютера.
Но этого недостаточно - иногда у нас более 32 ГБ физической памяти на 32-битной машине, иногда мы хотим ссылаться на несмежные блоки физической памяти как на смежные, чтобы упростить задачу, иногда мы хотим отобразить отображенные в память области ввода-вывода, не RAM.
Для этого ядро удерживает область наверху своего виртуального адресного пространства, где оно выполняет «случайное» отображение страниц на страницы. Отображение там не соответствует шаблону 1: 1 области логического отображения. Это то, что мы называем виртуальным отображением.
Важно добавить, что на многих платформах (например, x86) логическое и виртуальное сопоставление выполняются с использованием одного и того же аппаратного механизма (TLB, управляющий виртуальной памятью). Во многих случаях «логическое отображение» фактически выполняется с использованием виртуальной памяти процессора, поэтому это может немного сбить с толку. Таким образом, различие заключается в том, как выполняется сопоставление: 1: 1 для логического, что-то случайное для виртуального.