Как таблица страниц обрабатывает адреса как стека, так и кучи памяти?
Меня учили, что когда процессор генерирует логический адрес, он преобразуется в физический адрес с использованием таблицы страниц, которая обычно представляет собой непрерывный массив, выделенный в области памяти операционной системы. Индекс в этом массиве - это самые верхние биты виртуального адреса (он же номер страницы).
Кроме того, я знаю, что логический адрес для адресов кучи низкий, а для адресов стека - высокий, так как они растут в противоположных направлениях со стеком, начинающимся с 0xffffffffffffffff.
Поэтому мой вопрос заключается в том, что, поскольку номер страницы является низким для адресов кучи, но очень высоким для адресов стека, номер страницы (или индекс в таблице страниц), который генерирует ЦП, не является случайным, но либо очень высоким, либо очень низким. Тогда как это используется для индексации таблицы страниц без создания очень большой таблицы страниц.
Кроме того, нам необходимо поддерживать размер процесса и вызывать ошибку сегментации, когда номер страницы превышает ограничение (количество страниц / фреймов, выделенных на выход процесса). Как это сделать, если действительные номера страниц не являются непрерывными.
1 ответ
Поэтому мой вопрос заключается в том, что, поскольку номер страницы является низким для адресов кучи, но очень высоким для адресов стека, номер страницы (или индекс в таблице страниц), который генерирует ЦП, не является случайным, но либо очень высоким, либо очень низким. Тогда как это используется для индексации таблицы страниц без создания очень большой таблицы страниц.
Процессор генерирует виртуальную память(виртуальная означает нереальная) и не имеет никакого отношения к реальной физической памяти(также называемой основной памятью). Виртуальная память - не что иное, как один большой воображаемый непрерывный блок памяти.
Обязанностью таблицы страниц (блока управления памятью) является забота об этих виртуальных адресах и преобразование их в фактические физические адреса вашей оперативной памяти (или основной памяти).
virtual page number i
может быть сопоставлен с frame number 2000
физической памяти, и сам следующий virtual page number i + 1
может быть сопоставлен с frame number 10000
физической памяти. В этом прелесть пейджинга, потому что он позволяет выделять память не непрерывно.
Итак, перейдем к вашему вопросу: если таблица страниц очень большая, то существует механизм, называемый многоуровневыми таблицами страниц, который может легко решить проблему больших таблиц страниц.
Кроме того, нам необходимо поддерживать размер процесса и вызывать ошибку сегментации, когда номер страницы превышает ограничение (количество страниц / фреймов, выделенных на выход процесса). Как это сделать, если действительные номера страниц не являются непрерывными
Прежде всего, ошибка сегментации возникает, когда у вас есть сегментация в качестве несмежной схемы выделения памяти. Пейджинг и сегментация - это две разные схемы несмежного выделения памяти. И недействительные номера страниц имеют дело с действительным / недействительным битом, связанным с каждой записью таблицы страниц.