Формат памяти системы
Формат памяти системы
Адресное пространство процесса состоит из 3 сегментов:
· текстового сегмента (команды);
· cегмент данных;
· сегмент стека.
Если адреса в сгенерированном коде трактовать как адреса в физической памяти, два процесса не смогут параллельно выполняться, если их адреса перекрываются.
Поэтому компилятор генерирует адреса для виртуального адресного пространства заданного диапазона, а устройство управления памятью, называемое диспетчером памяти, транслирует виртуальные адреса, сгенерированные компилятором, в адреса ячеек, расположенных в физической памяти. Компилятору нет необходимости знать, в какое место в памяти ядро потом загрузит выполняемую программу.
Виртуальная адресация
Ядро в версии V делит виртуальное адресное пространство процесса на совокупность логических областей. Область - это непрерывная зона виртуального адресного пространства процесса, рассматриваемая в качестве отдельного объекта для совместного использования и защиты. Таким образом, команды, данные и стек обычно образуют автономные области, принадлежащие процессу
Рекомендуемые материалы
На рисунке изображены два процесса, A и B, показаны их области, частные таблицы областей и виртуальные адреса, в которых эти области соединяются. Процессы разделяют область команд 'a' с виртуальными адресами 8К и 4К соответственно. Если процесс A читает ячейку памяти с адресом 8К, а процесс B читает ячейку с адресом 4К, то они читают одну и ту же ячейку в области 'a'. Область данных и область стека у каждого процесса свои.
Процессы и области
Физическая адресация
Центральный Процессор при выполнении процесса переводит виртуальные адреса, используемые в нем в физические, используя таблицы страниц и областей.
Для удобства подобных трансляций память делится на участки фиксированного раздела (страницы) или варьирующегося (сегменты). В дальнейшем будем рассматривать страничную организацию памяти.
Таким образом, адрес делится на две составляющие - номер страницы и смещение относительно ее начала.
Для простоты взяв размер страницы 1 Кб. и 32 битную архитектуру получим:
1) возможный объем виртуальной памяти 2 32 b = 2 22 Kb = 212 Mb = 4 Gb,
2) диапазон смещения 1 Kb = 2 10 b,
3) число страниц 2 22 шт.
Для того чтобы разделить адрес на номер страницы и смещение надо "отрезать" от этого адреса нижние 10 бит - это будет смещение, то, что останется - номер страницы. Или, что то же самое, поделить нацело на 1024 (2 10). Остаток будет смещением, а частное - номером страницы.
Рассмотрим для примера адрес 0x58432. Мы взяли число в шестнадцатиричном коде, т. к. он удобен при переводе в двоичный - каждая цифра переводится в четыре двоичных.
Люди также интересуются этой лекцией: 10 Средства создания HTML-файлов.
Номер страницы получился 0x161, а смещение 0x32
Каждая из составляющих процесса (текст, данные, стек) содержится в отдельной области - непрерывного пространства виртуальных адресов. Рассмотрим, как центральный процессор производит перевод виртуального адреса в физический, используя таблицы страниц и областей.
Возьмем некоторый процесс, виртуальные адреса которого начинаются с 8k (8*1024 = 8192), а его физическое расположение фрагментировано и номера физических страниц указаны в таблице страниц.
По этому рисунку: обращение к виртуальному адресу 68432 (в десятичном коде на этот раз). Этот адрес, как видно (> 64 * 1024), относится к области стека. Вычислим смещение от начала стека: 68432-64*1024=68432-65536=2896. Определим номер страницы в стеке: 2896 div 1024 = 2. По рисунку видно, что второй виртуальной странице стека соответствует физическая страница по адресу 986k (считаем от 0). Смещение относительно начала страницы 2896 mod 1024 = 848. Таким образом, мы получили, что виртуальному адресу 68432 соответствует физический 986*1024+848.
Все эти действия выполняет центральный процессор, а задача операционной системы только составить эти таблицы и сообщить процессору, где они находятся.