История изменений
Исправление Deleted, (текущая версия) :
Теоретически, пользовательская программа (процесс) может адресовать всё 32- или 64-битное адресное пространство. Но если полезет куда не положено, ядро её сурово покарает, вполоть до высшей меры.
Из всего огромного пространства фактически программа имеет доступ только к малой части, которая на данный момент отображена в адресное пространство программы. Это код программы вместе с библиотеками, стек, куча, и т.п. кусочки. Если программе нужно еще, она просит об этом ядро посредством системных вызовов mmap() и sbrk().
Схема обустройства адресного пространства процесса зависит от ОС, версии, платформы и опций ядра. Даже в Линуксе оно бывает очень разным. Пример:
di@di:~$ pmap 13750
13750: /bin/bash -l
0000000000400000 1024K r-x-- bash
0000000000700000 12K r---- bash
0000000000703000 36K rw--- bash
000000000070c000 40K rw--- [ anon ]
000000000253f000 1764K rw--- [ anon ]
00007ff8c5796000 40K r-x-- libnss_files-2.24.so
00007ff8c57a0000 2048K ----- libnss_files-2.24.so
00007ff8c59a0000 4K r---- libnss_files-2.24.so
00007ff8c59a1000 4K rw--- libnss_files-2.24.so
00007ff8c59a2000 24K rw--- [ anon ]
00007ff8c59a8000 44K r-x-- libnss_nis-2.24.so
00007ff8c59b3000 2044K ----- libnss_nis-2.24.so
00007ff8c5bb2000 4K r---- libnss_nis-2.24.so
00007ff8c5bb3000 4K rw--- libnss_nis-2.24.so
00007ff8c5bb4000 80K r-x-- libnsl-2.24.so
00007ff8c5bc8000 2048K ----- libnsl-2.24.so
00007ff8c5dc8000 4K r---- libnsl-2.24.so
00007ff8c5dc9000 4K rw--- libnsl-2.24.so
00007ff8c5dca000 8K rw--- [ anon ]
00007ff8c5dcc000 28K r-x-- libnss_compat-2.24.so
00007ff8c5dd3000 2044K ----- libnss_compat-2.24.so
00007ff8c5fd2000 4K r---- libnss_compat-2.24.so
00007ff8c5fd3000 4K rw--- libnss_compat-2.24.so
00007ff8c5fd4000 2860K r---- locale-archive
00007ff8c629f000 1620K r-x-- libc-2.24.so
00007ff8c6434000 2048K ----- libc-2.24.so
00007ff8c6634000 16K r---- libc-2.24.so
00007ff8c6638000 8K rw--- libc-2.24.so
00007ff8c663a000 16K rw--- [ anon ]
00007ff8c663e000 12K r-x-- libdl-2.24.so
00007ff8c6641000 2044K ----- libdl-2.24.so
00007ff8c6840000 4K r---- libdl-2.24.so
00007ff8c6841000 4K rw--- libdl-2.24.so
00007ff8c6842000 152K r-x-- libtinfo.so.5.9
00007ff8c6868000 2044K ----- libtinfo.so.5.9
00007ff8c6a67000 16K r---- libtinfo.so.5.9
00007ff8c6a6b000 4K rw--- libtinfo.so.5.9
00007ff8c6a6c000 140K r-x-- ld-2.24.so
00007ff8c6c67000 8K rw--- [ anon ]
00007ff8c6c85000 28K r--s- gconv-modules.cache
00007ff8c6c8c000 12K rw--- [ anon ]
00007ff8c6c8f000 4K r---- ld-2.24.so
00007ff8c6c90000 4K rw--- ld-2.24.so
00007ff8c6c91000 4K rw--- [ anon ]
00007ffe398d8000 132K rw--- [ stack ]
00007ffe399b2000 12K r---- [ anon ]
00007ffe399b5000 8K r-x-- [ anon ]
total 22516K
di@di:~$
Собственно память - это anon и stack. Каждая виртуальная страница может указывать на какую-то физическую, находящуюся в RAM или swap. Причем много виртуальных могут указывать на одну физическую. Когда anon выделяется при помощи mmap(), то изначально все страницы этого куска указывают на одну и ту же физическую пустую страницу (специальную). Потом по мере использования (записи в память) выделяются отдельные физические страницы.
Исходная версия Deleted, :
Теоретически, пользовательская программа (процесс) может адресовать всё 32- или 64-битное адресное пространство. Но если полезет куда не положено, ядро её сурово покарает, вполоть до высшей меры.
Из всего огромного пространства фактически программа имеет доступ только к малой части, которая на данный момент отображена в адресное пространство программы. Это код программы вместе с библиотеками, стек, куча, и т.п. кусочки. Если программе нужно еще, она просит об этом ядро посредством системных вызовов mmap() и sbrk().
Схема обустройства адресного пространства процесса зависит от ОС, версии, платформы и опций ядра. Даже в Линуксе оно бывает очень разным. Пример:
di@di:~$ pmap 13750
13750: /bin/bash -l
0000000000400000 1024K r-x-- bash
0000000000700000 12K r---- bash
0000000000703000 36K rw--- bash
000000000070c000 40K rw--- [ anon ]
000000000253f000 1764K rw--- [ anon ]
00007ff8c5796000 40K r-x-- libnss_files-2.24.so
00007ff8c57a0000 2048K ----- libnss_files-2.24.so
00007ff8c59a0000 4K r---- libnss_files-2.24.so
00007ff8c59a1000 4K rw--- libnss_files-2.24.so
00007ff8c59a2000 24K rw--- [ anon ]
00007ff8c59a8000 44K r-x-- libnss_nis-2.24.so
00007ff8c59b3000 2044K ----- libnss_nis-2.24.so
00007ff8c5bb2000 4K r---- libnss_nis-2.24.so
00007ff8c5bb3000 4K rw--- libnss_nis-2.24.so
00007ff8c5bb4000 80K r-x-- libnsl-2.24.so
00007ff8c5bc8000 2048K ----- libnsl-2.24.so
00007ff8c5dc8000 4K r---- libnsl-2.24.so
00007ff8c5dc9000 4K rw--- libnsl-2.24.so
00007ff8c5dca000 8K rw--- [ anon ]
00007ff8c5dcc000 28K r-x-- libnss_compat-2.24.so
00007ff8c5dd3000 2044K ----- libnss_compat-2.24.so
00007ff8c5fd2000 4K r---- libnss_compat-2.24.so
00007ff8c5fd3000 4K rw--- libnss_compat-2.24.so
00007ff8c5fd4000 2860K r---- locale-archive
00007ff8c629f000 1620K r-x-- libc-2.24.so
00007ff8c6434000 2048K ----- libc-2.24.so
00007ff8c6634000 16K r---- libc-2.24.so
00007ff8c6638000 8K rw--- libc-2.24.so
00007ff8c663a000 16K rw--- [ anon ]
00007ff8c663e000 12K r-x-- libdl-2.24.so
00007ff8c6641000 2044K ----- libdl-2.24.so
00007ff8c6840000 4K r---- libdl-2.24.so
00007ff8c6841000 4K rw--- libdl-2.24.so
00007ff8c6842000 152K r-x-- libtinfo.so.5.9
00007ff8c6868000 2044K ----- libtinfo.so.5.9
00007ff8c6a67000 16K r---- libtinfo.so.5.9
00007ff8c6a6b000 4K rw--- libtinfo.so.5.9
00007ff8c6a6c000 140K r-x-- ld-2.24.so
00007ff8c6c67000 8K rw--- [ anon ]
00007ff8c6c85000 28K r--s- gconv-modules.cache
00007ff8c6c8c000 12K rw--- [ anon ]
00007ff8c6c8f000 4K r---- ld-2.24.so
00007ff8c6c90000 4K rw--- ld-2.24.so
00007ff8c6c91000 4K rw--- [ anon ]
00007ffe398d8000 132K rw--- [ stack ]
00007ffe399b2000 12K r---- [ anon ]
00007ffe399b5000 8K r-x-- [ anon ]
total 22516K
di@di:~$