Память на шине процессора i486 называется физической памятью. Она организованна как последовательность 8-ми битовых байтов. Каждому байту соответствует уникальный адрес, называемый физическим, который может находиться в интервале от 0 до 2**32-1 (4 Гбайт). Диспетчер памяти - это аппаратный механизм для надежного и эффективного использования памяти. При использовании данного механизма, прикладные программы не используют прямой адресации к физической памяти, а адресуются к некоторой модели памяти, называемой виртуальной памятью. Диспетчер памяти поддерживает сегментацию и замещение страниц (подкачку). Сегментация - это механизм, обеспечивающий разбиение памяти на отдельные независимые адресные пространства. Подкачка - это механизм поддержки модели большого адресного пространства ОЗУ, реально используя меньший объем ОЗУ и некоторое дисковое пространство. Возможно использование одного из указанных механизмов или их одновременное использование. Адрес, используемый в программе, называется логическим адресом. Устройство сегментации преобразует логический адрес в некоторый промежуточный адрес несегментированного адресного пространства, называемый линейным. Устройство замещения страниц преобразует полученный линейный адрес в физический.
+-----------+ Логический +------------------------+ | Программа | ----------------> | Усторйство сегментации | +-----------+ адрес +------------------------+ // В зависимости || // от CR0 || Линейный 0|- <----------- // || адрес 0|- <------------/ CR0=0 CR0=1 || Физическая 0|- \/ 0|- Физический +-----------------------+ память 0|- <--------------- | Устройство замещения | 0|- <--------------- | страниц | 0|- адрес +-----------------------+
Реально, память может представлять собой единое адресное пространство, похожее на физическую память. Или, она может представлять собой набор из одного или более независимых пространств памяти, называемых сегментами. Сегменты могут быть использованы специально для хранения кода программы (команд), данных или стека. Фактически, каждая конкретная программа может использовать до 16383 сегментов различной длины и различного назначения. Сегментация может быть использована для повышения надежности программ и систем. Например, размещение стека программы и ее кода в различных сегментах позволяет избежать наложения данных и кода в случае переполнения стека. Вне зависимости от того, используется много сегментов или нет, логический адрес трактуется как смещение в сегменте и согласно этому преобразуется в линейный. Каждый сегмент имеет дискриптор, который содержит его базовый адрес и максимальный размер. Если смещение меньше размера и нет препядствий для чтения сегмента, линейный адрес получается сложением базового адреса и смещения. Линейный адрес, выработанный устройством сегментации, используется непосредственно как физический адрес, если 31-ый бит регистра CR0 очищен (описание регистра CR0 смотри в Главе 4). Данный бит регистра указывает, используется или не используется механизм подкачки страниц. Если же данный бит не очищен, для преобразования линейного адреса в физический используется устройство подкачки страниц. Устройство подкачки страниц обеспечивает другой уровень организации памяти. Оно разбивает линейное адресное пространство на блоки фиксированной длины (4К байт), называемые страницами. Логическое адресное пространство отображается в линейное адресное пространство, которое отображается на несколько страниц. Страницы могут находиться как в памяти, так и на диске. При обращении программы по логическому адресу, он транслируется в адрес на странице памяти, или генерируется исключение (если данная страница отсутствует в памяти). При возникновении исключения, управление передается операционной системе, которая должна попытаться считать нужную страницу с диска и обновить таблицу страниц. После этого, работа программы, которая вызвала исключение возобновляется без генерации исключения. Если используется несколько различных сегментов, они являются частью программного окружения, видимого для прикладного программиста. Если же используется подкачка, то, как правило, механизм замещения для прикладного программиста остается невидимым. Исключение составляет случай, когда прикладная программа взаимодействует с алгоритмом замещения страниц операционной системы. Данный алгоритм активизируется когда все страницы памяти использованы и операционная система должна решить, какую страницу необходимо вытеснить на диск. Все алгоритмы замещения страниц (исключая метод случайного вытеснения) в некоторых ситуациях могут работать крайне неэффективно, что может быть исправлено специальной прикладной программой. Архитектура процессора i486 дает разработчикам свободу выбора модели памяти для каждой отдельной программы, даже если эти программы выполняются одновременно. Возможен выбор любой модели организации памяти, являющейся промежуточной между двумя следующими моделями:
"Плоское" адресное пространство, при котором пространства кодов, стека и данных отображаются в общие линейные адреса. В этом случае сегментация игнорируется и позволяется доступ любого типа указателя на память к любому типу данных.
Сегментированное адресное пространство с различными сегментами для пространств кода, данных и стека. Может быть использовано до 16383 линейных адресных пространств, размером до 4 гигобайт каждое. Обе эти модели могут обеспечивать защиту памяти. Кроме того, возможен выбор любой модели, промежуточной между указанными. Принципы выбора модели памяти и способы работы системных программистов в выбранной модели описаны в Части II - Системное программирование.
2.1.1 Несегментированная или "Плоская" модель
Несегментированная модель - это самая простая модель памяти. Несмотря на то, что не существует бита режима или управляющего регистра, которые позволяли бы включать и выключать механизм сегментации, необходимый эффект достигается отображением всех сегментов в единое линейное адресное пространство. В результате этого все операции с памятью обращаются к общему пространству памяти. В плоской модели, сегменты могут покрывать весь 4-х гигабайтный диапазон физических адресов, или только те адреса, которые отображаются на физическую память. Преимущество минимального адресного пространства заключается в том, что оно обеспечивает минимальный уровень аппаратной защиты от программных ошибок. Исключение составляет случай, когда логический адрес указывает на адрес несуществующей памяти.