Структура виртуальной памяти подразумевает разбиение памяти, используемой каждой программой, на небольшие блоки фиксированного размера, называемые
В системах x86-32 размер страницы составляет 4096 байт. В некоторых других реализациях Linux используются страницы больших размеров. Например, в Alpha — страницы размером 8192 байт, а в IA-64 — изменяемый размер страниц, обычно с исходным объемом 16 384 байт. Программа может определить размер страницы виртуальной памяти системы с помощью вызова sysconf(_SC_PAGESIZE), рассматриваемого в разделе 11.2.
Для поддержки этой организации ядро ведет для каждого процесса
Записи в таблице страниц нужны не всем адресным диапазонам виртуального адресного пространства процесса. Обычно большие диапазоны потенциального виртуального пространства не используются, поэтому нет необходимости вести соответствующие записи в таблице страниц. Если процесс пытается получить доступ к адресу, для которого не имеется соответствующей записи в таблице страниц, он получает сигнал SIGSEGV.
Рис. 6.2.
Диапазон допустимых для процесса виртуальных адресов за время его жизненного цикла может измениться по мере того, как ядро будет выделять для процесса и высвобождать страницы (и записи в таблице страниц). Это может происходить при следующих обстоятельствах:
• когда стек разрастается вниз, выходя за ранее обозначенные ограничения;
• когда память выделяется в куче или высвобождается в ней путем подъема крайней точки программы с использованием вызовов brk(), sbrk() или семейства функций malloc (см. главу 7);
• когда области совместно используемой памяти (System V) прикрепляются с помощью вызова shmat() и открепляются вызовом shmdt();
• когда отображение памяти создается с применением вызова mmap() и убирается с помощью munmap() (см. главу 45).
Реализация виртуальной памяти требует аппаратной поддержки в виде блока управления страничной памятью — Paged Memory Management Unit (PMMU). Блок PMMU переводит каждую ссылку на адрес виртуальной памяти в соответствующий адрес физической памяти и извещает ядро об ошибке отсутствия страницы, когда конкретный адрес виртуальной памяти ссылается на страницу, отсутствующую в оперативной памяти.
Управление виртуальной памятью отделяет виртуальное адресное пространство процесса от физического адресного пространства оперативной памяти. Это дает множество преимуществ.
• Процессы изолированы друг от друга и от ядра, поэтому один процесс не может прочитать или изменить память другого процесса или ядра. Это достигается за счет записей в таблице страниц для каждого процесса, указывающих на различные наборы физических страниц в оперативной памяти (или в области подкачки).
• При необходимости два или несколько процессов могут задействовать память совместно. Ядро дает такую возможность благодаря наличию записей в таблице страниц в различных процессах, ссылающихся на одни и те же страницы оперативной памяти. Совместное использование памяти происходит при двух наиболее распространенных обстоятельствах.
• Несколько процессов, выполняющих одну и ту же программу, могут совместно использовать одну и ту же (предназначенную только для чтения) копию программного кода. Эта разновидность совместного применения памяти осуществляется неявно, когда несколько программ выполняют один и тот же программный файл (или загружают одну и ту же совместно используемую библиотеку).
• Для явного запроса областей совместно используемой памяти с другими процессами процессы могут задействовать системные вызовы shmget() и mmap(). Это делается в целях обмена данными между процессами.