LINUX.ORG.RU

История изменений

Исправление 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:~$