На следующем рисунке показано, как разделено виртуальное адресное пространство 32-разрядного процесса:
Но как разделить виртуальное адресное пространство 64-битного процесса?
Карта 64-битной виртуальной памяти x86 разделяет адресное пространство на две части: нижняя часть (с верхним битом, установленным в 0), является пользовательским пространством, верхняя часть (с верхним битом, установленным в 1), является пространством ядра. (Обратите внимание, что x86-64 определяет «канонические» адреса «младшая половина» и «верхняя половина», с количеством битов, ограниченным 48 или 56; подробности см. В Википедии .)
Полная карта подробно документирована в ядре ; в настоящее время это выглядит как
========================================================================================
Start addr | Offset | End addr | Size | VM area description
========================================================================================
| | | |
0000000000000000 | 0 | 00007fffffffffff | 128 TB | user-space virtual memory
__________________|_________|__________________|_________|______________________________
| | | |
0000800000000000 | +128 TB | ffff7fffffffffff | ~16M TB | non-canonical
__________________|_________|__________________|_________|______________________________
| | | |
ffff800000000000 | -128 TB | ffffffffffffffff | 128 TB | kernel-space virtual memory
__________________|_________|__________________|_________|______________________________
с 48-битными виртуальными адресами. (56-битный вариант имеет такую же структуру, с 64 ПБ доступного адресного пространства по обе стороны от отверстия 16 КБ.)
В отличие от 32-битного случая, «64-битная» карта памяти является прямым отражением аппаратных ограничений.