logo search
!Архитектура ЭВМ и вычислительных систем

Память. Адресация. Страничная и сегментная организация.

В компьютерах с процессором х86 исторически сложилась довольно сложная система адресации памяти. Мы постепенно разберем все основные варианты, а сейчас, просто отметим, что хотя с каждым новым поколением процессоров внедрялись новые принципы управления памятью, но даже самый современный Pentium 4 должен уметь работать с памятью так же, как любой из его предшественников. Это, конечно, не всегда удобно для пользователей, которые не используют старого программного обеспечения, но зато гарантирует, что любую программу, созданную для компьютеров, совместимых с IBM PC, можно заставить работать на новом персональном компьютере (бывают исключения, связанные с особенностью архитектуры некоторых старых компьютеров).

Одна из особенностей процессоров х86 заключается в том, что в процессоре 8086 с целью сокращения общего числа контактов для шины адреса и шины данных использовались одни и те же контакты. Соответственно, для получения информации из памяти вначале процессор должен был выработать адрес нужного байта, который запоминался одной из микросхем системной платы, а уже потом его прочитать. Начиная с процессора 80286, шина адреса получила на корпусе процессора отдельные контакты. Но по традиции все равно приходится считать, что процессор сначала устанавливает адрес, а уж потом данные. (Ограничения на количество контактов коснулись также и ряда микросхем оперативной памяти, где одни и те же контакты используются для адресации и ввода/вывода данных.)

Другая особенность процессоров х86 — это различная размерность шины данных и адреса. Для 16-разрядного процессора 8086 использовалась 20-разрядная шина адреса, а для 80286 — 24-разрядная. В 32-разрядных процессорах 386 и 486 шина адреса была увеличена до 32 битов, а в процессорах Pentium до 64 битов.

Так как компьютеры оперируют адресным пространством, кратным 2", где п — разрядность шины, то получается следующий практический ряд:

16 линий (битов) — 65 536 байтов, или 64 Кбайт;

20 линий (битов) — 1 048 576 байтов, или 1 Мбайт;

22 линии (бита) — 4 194 304 байтов, или 4 Мбайт;

24 линии (бита) — 16 777 216 байтов, или 16 Мбайт;

26 линий (битов) — 67 108 864 байтов, или 64 Мбайт;

28 линий (битов) — 268 435 456 байтов, или 256 Мбайт;

30 линий (битов) — 1 073 741 824 байт, или 1024 Мбайт, или 1 Гбайт;

32 линии (бита) — 4 294 967 296 байтов, или 4 Гбайт.

Кроме всего прочего, у первых микропроцессоров количество выводов было ограничено, поэтому адрес передавался по шине данных в два этапа — сначала младшую половину бита, а потом старшую. В дальнейшем от такого способа отказались, но потом снова стали использовать для адресации ячеек памяти в микросхемах динамической памяти.

Обычно полагают, что матрица запоминающей микросхемы имеет квадратный вид, поэтому принято считать, что младшая половина адреса — это сигнал CAS (Column Access Strobe), или адрес столбца запоминающей матрицы, а старшая половина адреса — это сигнал RAS (Row Access Strobe), или адрес строки матрицы. Если матрица памяти по каким-либо причинам является прямоугольной, то сокращается размерность адреса RAS.

При обращении к запоминающему устройству с микросхемами динамической памяти контроллер памяти, который может быть в чипсете или в самой микросхеме памяти, устанавливает сигнал RAS, а потом — CAS (рис. 3.20). В разных типах микросхем DRAM длительности сигналов RAS и CAS и порядок их следования различны. Излюбленным приемом повышения производительности ОЗУ является однократная установка сигнала RAS, а последовательным изменением сигнала CAS считывается вся строка. В более новых микросхемах присутствует счетчик, который автоматически увеличивает адрес RAS при считывании большого массива данных. В программе настройки BIOS предусмотрена установка параметров сигналов CAS и RAS, а также возможность указания порядка их чередования. Для настройки пакетного режима с памятью служит установка параметров, например, 5-3-3-3 или 5-1-1-1. Первый случай предусматривает 5 тактов для задания базового адреса блока памяти и по 3 такта для чтения или записи каждого машинного слова (байта), второй, соответственно, только по 1 такту для чтения или записи каждого байта. Если "поиграть" параметрами пакетного режима, можно получить значительный выигрыш в производительности, правда, при этом следует пользоваться тестовыми программами, чтобы удостовериться в устойчивой работе компьютера с новыми настройками.

Страничная организация памяти.

Страничный диспетчер памяти, имеющийся в микропроцессоре, обеспечивает следующую возможность:1)представляет пользователю возможность работать с большим адресным пространством;

2)обеспечивает защиту ОС и программное обеспечение пользователя;

3)реализует быструю трансляцию адресов.

Линейное адресное пространство памяти объемом 4 Гб при страничной организации разбито на 220 страниц объемом по 4 кб каждая страница. Фиксированный размер всех страниц позволяет загружать любую требуемую виртуальную страницу в нужную физическую страницу.

Страничная трансляция включается в защищенный режим установкой в единицу 31-го разряда нулевого регистра управления CRQ и выключается сбросом этого разряда в ноль.

При страничной организации сегмент разбивается на отдельные разделы, число которых может достигнуть до 210.

В свою очередь каждый раздел может содержать до 210 страниц объемом по 4 кб каждая. Начальные (базовые) адреса страниц каждого раздела хранятся в соответствующей таблице страниц, содержащейся в памяти. Обращение к этой таблице производится с помощью каталога, в котором содержатся начальные адреса таблиц страниц для всех разделов. Таким образом, страницы могут быть рассеяны по разным частям памяти, а их размещение в памяти определяется содержимым каталогов разделов и таблиц страниц.

Линейный 32-ый адрес при страничной организации памяти является исходной информацией для формирования физического адреса с помощью каталога разделов и таблиц страниц. При этом линейный адрес рассматривается как совокупность трех полей.

TABLE – указывает относительный адрес таблицы страниц выбираемого раздела в каталоге.

PAGE – задает относительный адрес требуемой страницы данного раздела.

BYTE – содержит относительный адрес выбираемого на странице байта.

Каталог занимает одну страницу памяти, где для каждого раздела содержатся 32-разрядные указатели входа в таблицу страниц этого раздела. Каждая из таблиц страниц также занимает одну страницу памяти, где для каждой страницы дается 32-хразрядный указатель входа в эту страницу.

Указатели входа в раздел и в страницу имеют одинаковый формат.

Каждый указатель содержит информацию, определяющую порядок использования страниц. Старшие 20 разрядов занимает базовый адрес. Остальные разряды имеют следующий смысл.

Р – бит присутствия. Если Р=1, то разрешается использование таблицы страниц, если Р=0, то такое использование запрещается. При Р=0 попытка обращения к соответствующему разделу или странице вызывает прерывание из-за отсутствия нужной страницы в оперативной памяти. После загрузки нужной страницы в память, бит Р устанавливается в «1» и в этом случае обращение к данной странице становится возможной. Это нужно для того, чтобы ОС знала, где находится страница.

R/W - бит чтения/записи.

U/S - бит пользователь/супервизор.

Эти два бита определяют право доступа к соответствующей странице или разделу для программ пользователя. Программа пользователя обычно имеет самый низкий уровень привилегий равный 3. Если осуществляется запрос с уровнем привилегий равным 3, то при значении U/S = 0 программе пользователя запрещается доступ к разделу или странице.

При U/S = 1 обращение разрешается, но при этом учитывается значение бита R/W.

Если R/W = 0, то программе пользователя разрешается только чтение раздела или страницы.

Если R/W = 1, то разрешается как чтение, так и запись. Если осуществляются запросы с большим уровнем привилегий (0, 1 и 2), то допускается запись и чтение разделов и страниц при любых значениях ‘1’ и ‘2’ разрядов.

Такие уровни привилегий имеет ОС.

А - бит доступа. Этот бит автоматически устанавливается в «1» микропроцессором при обращении к данному разделу или странице для записи или чтения.

D – бит «мусора». В указателе кадра страницы этот бит устанавливают в «1» при записи на данную страницу. Для указателей таблиц страниц значение бита D является неопределенной.

Биты D и A используются ОС, поддерживающей виртуальную память, для определения в ОЗУ тех разделов и страниц, которые подлежат удалению из ОЗУ, поскольку к ним долгое время не было обращения. Проверку и сброс этих разрядов выполняет ОС.Проиллюстрируем процесс вычисления физического адреса с помощью следующей схемы:

Содержимое CR3 (регистр управления) задает старшие 20 разрядов базового адреса для входа в каталог раздела. Для получения физического адреса строки каталога разделов к этим 20 разрядам добавляется 10-тиразрядное поле TABLE линейного адреса и 2 нулевых младших разрядов. По полученному таким образом адресу обращаются к каталогу разделов, откуда выбирают указатели входа в таблицу страниц. Этот указатель содержит 20-разрядный базовый адрес таблицы страниц. К этим 20 разрядам добавляется поле PAGE и 2 нулевых младших разряда. В результате получается адрес строки таблицы страниц. В этой строке находится указатель входа в страницу, содержащий 20-разрядный базовый адрес страницы. Добавление к этому базовому адресу 12-тиразрядного поля BYTE дает физический адрес байта.

Существенное сокращение времени преобразования адресов в микропроцессоре достигается путем внутренней ассоциативной памяти, которая называется «буфером ассоциативной трансляции» и обозначается TLB.

TLB представляет собой память с ассоциативной выборкой, которая содержит 20-тиразрядные базовые адреса 32-х страниц, то есть, старшие 20 разрядов физического адреса страницы. Каждый из базовых адресов имеет свой признак (тег). В качестве тега используются старшие 20 разрядов линейного адреса, то есть поля TABLE и PAGE. Формирование физического адреса с использованием TLB производится следующим образом:

При поступлении в блок управления страницами линейного адреса его старшие 20 разрядов сравниваются с тегами физических адресов, хранящихся в TLB. Если обнаруживается совпадение этих разрядов с каким-либо из тегов, то из TLB выбирается соответствующий этому тегу базовый адрес. Страничный диспетчер формирует 32-хразрядный физический адрес, в котором выбранный из TLB базовый адрес задает 20 старших разрядов, а поле BYTE линейного адреса – 12 младших разрядов.

Случай, когда базовый адрес страницы находится в TLB, называется КЭШ-попаданием. При этом не требуется обращаться к ОЗУ для выборки указателя входа в таблицу страниц и в саму страницу.

Если базовый адрес нужной страницы отсутствует в TLB, то такое обращение называется КЭШ-промахом. При этом микропроцессор выполняет описанную выше процедуру формирования физического адреса с помощью каталога разделов и таблиц страниц. Полученный при этом из таблицы страниц 20 - разрядный базовый адрес вместе с соответствующими 20 разрядами старшей части адреса (тегом) записывается в свободную или дольше других занимаемую ячейку TLB. Таким образом, обеспечивается непрерывное обновление содержимого TLB.

Помимо тега для каждого базового адреса страницы в TLB хранится дополнительная информация, позволяющая определить, какую страницу можно заменить на вновь вводимую. Поскольку TLB хранит адреса только 32 страниц объема 4 кб каждая, то микропроцессор может непосредственно формировать физические адреса для 128 кб памяти (4 х 32). При этом по статистике вероятность КЭШ попадания равна 0,98 и, следовательно, только 2% обращений вызывают КЭШ промах и требуют двухступенчатого преобразования адресов.

При сегментной организации вся виртуальная память, используемая программой, разбивается на части, называемые сегментами. Это разбиение выполняется либо самим программистом (если он программирует на языке ассемблера), либо компилятором используемого языка программирования. Размеры сегментов могут быть различными, но в пределах максимального размера, используемого в данной архитектуре. Разбиение обычно производится на логически осмысленные части, такие, как сегмент данных, сегмент кода, сегмент стека и т.п. Большая программа может содержать несколько сегментов одного типа, например, несколько сегментов кода или данных.

Таким образом, при сегментной организации у программы нет единого линейного адресного пространства. Виртуальный адрес состоит из двух частей: селектора сегмента и смещения от начала сегмента.

Селектор сегмента представляет некоторое число, которое обычно является индексом в таблице сегментов данного процесса. Такая таблица содержит для каждого сегмента его размер, режим доступа (только чтение или возможна запись), флаг присутствия сегмента в памяти. Если сегмент находится в памяти, то в таблице хранится его базовый адрес (адрес физической памяти, соответствующий началу сегмента). Отсутствие сегмента означает, что его данные временно вытеснены на диск и хранятся в файле подкачки (swap file).