К9-12В. Вопросы и ответы к ГОСам 2013 / Микропроцессорные системы / 06. Достоинства и недостатки использования сементированного адресного пространства. сегментированного адресного простран
6. Достоинства и недостатки использования сегментированного адресного пространства. Структура логического адреса в сегментированном адресном пространстве. Селектор, дескриптор сегмента, смещение. Назначение и структура таблиц дескрипторов. Формирование линейного и физического адресов в сегментированном адресном пространстве.
Логическое адресное пространство
Для адресации операндов в физическом адресном пространстве программы используют логическую адресацию. Процессор автоматически транслирует логические адреса в физические, выдаваемые затем на системную шину.
Архитектура компьютера различает физическое адресное пространство (ФАП) и логическое адресное пространство (ЛАП). Физическое адресное пространство представляет собой простой одномерный массив байтов, доступ к которому реализуется аппаратурой памяти по адресу, присутствующему на шине адреса микропроцессорной системы. Логическое адресное пространство организуется самим программистом исходя из конкретных потребностей. Трансляцию логических адресов в физические осуществляет блок управления памятью MMU.
В архитектуре современных микропроцессоров ЛАП представляется в виде набора элементарных структур: байтов, сегментов и страниц. В микропроцессорах используются следующие варианты организации логического адресного пространства:
* плоское (линейное) ЛАП: состоит из массива байтов, не имеющего определенной структуры; трансляция адреса не требуется, так как логический адрес совпадает с физическим;
* сегментированное ЛАП: состоит из сегментов — непрерывных областей памяти, содержащих в общем случае переменное число байтов; логический адрес содержит 2 части: идентификатор сегмента и смещение внутри сегмента; трансляцию адреса проводит блок сегментации MMU;
* страничное ЛАП: состоит из страниц — непрерывных областей памяти, каждая из которых содержит фиксированное число байтов. Логический адрес состоит из номера (идентификатора) страницы и смещения внутри страницы; трансляция логического адреса в физический проводится блоком страничного преобразования MMU;
* сегментно-страничное ЛАП: состоит из сегментов, которые, в свою очередь, состоят из страниц; логический адрес состоит из идентификатора сегмента и смещения внутри сегмента. Блок сегментного преобразования MMU проводит трансляцию логического адреса в номер страницы и смещение в ней, которые затем транслируются в физический адрес блоком страничного преобразования MMU.
Таким образом, основой получения физического адреса памяти служит логический адрес. В какой-то степени логическое адресное пространство, с которым имеет дело программист, можно сравнить со структурой книги, где аналогом сегмента выступает рассказ, страница книги соответствует странице ЛАП, а искомая информация — это некоторое слово. При этом если память организована как линейная, то номер искомого слова задается в явном виде и просто отсчитывается от начала книги. При сегментном представлении памяти искомое слово определяется его номером в заданном рассказе. Страничное представление памяти предполагает задание информации о слове в виде номера страницы в книге и номера слова на указанной странице. При сегментно-страничном представлении логический адрес слова задается номером слова в определенном рассказе. В этом случае по оглавлению книги определяется номер страницы, с которой начинается указанный рассказ. Затем, зная количество слов на странице и положение слова в рассказе, можно вычислить страницу книги и положение искомого слова на этой странице.
Микропроцессор способен работать в двух режимах: реальном и защищенном.
При работе в реальном режиме возможности процессора ограничены: емкость адресуемой памяти составляет 1 Мбайт, отсутствует страничная организация памяти, сегменты имеют фиксированную длину 2^16 байт.
Этот режим обычно используется на начальном этапе загрузки компьютера для перехода в защищенный режим.
В реальном режиме сегментные регистры процессора содержат старшие 16 бит физического адреса начала сегмента. Сдвинутый на 4 разряда влево селектор дает 20-разрядный базовый адрес сегмента. Физический адрес получается путем сложения этого адреса с 16-разрядным значением смещения в сегменте, формируемого по заданному режиму адресации для операнда или извлекаемому из регистра EIP для команды (рис. 3.1). По полученному адресу происходит выборка информации из памяти.
В реальном режиме сегментные регистры процессора содержат старшие 16 бит физического адреса начала сегмента. Сдвинутый на 4 разряда влево селектор дает 20-разрядный базовый адрес сегмента. Физический адрес получается путем сложения этого адреса с 16-разрядным значением смещения в сегменте, формируемого по заданному режиму адресации для операнда или извлекаемому из регистра EIP для команды (рис. 3.1). По полученному адресу происходит выборка информации из памяти.
Наиболее полно возможности микропроцессора по адресации памяти реализуются при работе в защищенном режиме. Объем адресуемой памяти увеличивается до 4 Гбайт, появляется возможность страничного режима адресации. Сегменты могут иметь переменную длину от 1 байта до 4 Гбайт.
Общая схема формирования физического адреса микропроцессором, работающим в защищенном режиме, представлена на рис. 3.2.
Как уже отмечалось, основой формирования физического адреса служит логический адрес. Он состоит из двух частей: селектора и смещения в сегменте.
Селектор содержится в сегментном регистре микропроцессора и позволяет найти описание сегмента (дескриптор) в специальной таблице дескрипторов. Дескрипторы сегментов хранятся в специальных системных объектах глобальной (GDT) и локальных (LDT) таблицах дескрипторов. Дескриптор играет очень важную роль в функционировании микропроцессора, от формирования физического адреса при различной организации адресного пространства и до организации мультипрограммного режима работы. Поэтому рассмотрим его структуру более подробно.
Сегменты микропроцессора, работающего в защищенном режиме, характеризуются большим количеством параметров. Поэтому в универсальных 32-разрядных микропроцессорах информация о сегменте хранится в специальной 8-байтной структуре данных, называемой дескриптором, а за сегментными регистрами закреплена основная функция — определение местоположения дескриптора.
Структура дескриптора сегмента представлена на рис. 3.3.
32-разрядное поле базового адреса позволяет определить начальный адрес сегмента в любой точке адресного пространства в 2^32 байт (4 Гбайт).
Поле предела (limit) указывает длину сегмента (точнее, длину сегмента минус 1: если в этом поле записан 0, то это означает, что сегмент имеет длину 1) в адресуемых единицах, то есть максимальный размер сегмента равен 2^20 элементов.
Величина элемента определяется одним из атрибутов дескриптора битом G ( Granularity — гранулярность, или дробность):
Таким образом, сегмент может иметь размер с точностью до 1 байта в диапазоне от 1 байта до 1 Мбайт (при G = 0 ). При объеме страницы в 2^12 = 4 Кбайт можно задать объем сегмента до 4 Гбайт (при G = 1 ):
Бит присутствия P (Present) показывает возможность доступа к сегменту. Операционная система (ОС) отмечает сегмент, передаваемый из оперативной во внешнюю память, как временно отсутствующий, уставливая в его дескрипторе P = 0. При P = 1 сегмент находится в физической памяти. Когда выбирается дескриптор с P = 0 (сегмент отсутствует в ОЗУ), поля базового адреса и предела игнорируются. Это естественно: например, как может идти речь о базовом адресе сегмента, если самого сегмента вообще нет в оперативной памяти? В этой ситуации процессор отвергает все последующие попытки использовать дескриптор в командах, и определяемое дескриптором адресное пространство как бы»пропадает».
Возникает особый случай неприсутствия сегмента. При этом операционная система копирует запрошенный сегмент с диска в память (при этом, возможно, удаляя другой сегмент), загружает в дескриптор базовый адрес сегмента, устанавливает P = 1 и осуществляет рестарт той команды, которая обратилась к отсутствовавшему в ОЗУ сегменту.
Бит обращения A (Accessed) устанавливается в»1″ при любом обращении к сегменту. Используется операционной системой для того, чтобы отслеживать сегменты, к которым дольше всего не было обращений.
В случае обращения за операндом смещение в сегменте формируется микропроцессором по режиму адресации операнда, заданному в команде. Смещение в сегменте кода извлекается из регистра — указателя команд EIP.
Сумма извлеченного из дескриптора начального адреса сегмента и сформированного смещения в сегменте дает линейный адрес (ЛА).
Если в микропроцессоре используется только сегментное представление адресного пространства, то полученный линейный адрес является также и физическим.
Если помимо сегментного используется и страничный механизм организации памяти, то линейный адрес представляется в виде двух полей: старшие разряды содержат номер виртуальной страницы, а младшие смещение в странице. Преобразование номера виртуальной страницы в номер физической проводится с помощью специальных системных таблиц: каталога таблиц страниц (КТС) и таблиц страниц (ТС). Положение каталога таблиц страниц в памяти определяется системным регистром CR3. Физический адрес вычисляется как сумма полученного из таблицы страниц адреса физической страницы и смещения в странице, полученного из линейного адреса.
Достоинство: Можно загружать / выгружать страницами. Виртуальная, оперативная и внешняя память разбивается на страницы одинаковой длинны.
Недостатки: сегменты плохи тем, что имеют переменную длину
Сегментная организация памяти в защищенном режиме
В основе сегментной модели памяти лежит разделение ее на независимые адресные пространства переменной длины — сегменты. Для программы адресное пространство разделено на блоки смежных адресов, называемых сегментами, а программа может обращаться только к данным, находящимся в этих сегментах. Внутри сегментов применяется линейная адресация, то есть программа может обращаться к байту 0, байту 1 и т. д. Такая адресация осуществляется относительно начала сегмента, и физический адрес, ассоциируемый, например, с программным адресом 0, по существу, скрыт от программиста. Этот подход к управлению памятью опирается на тот факт, что программы обычно логически разделяются на области (сегменты) кода, данных и стека. При этом упрощается изоляция программ друг от друга в мультипрограммном режиме работы. Каждый сегмент имеет свое целевое назначение. Каждая задача имеет непосредственный доступ к трем основным сегментам: кода, данных и стека, определяемых сегментными регистрами CS, DS SS соответственно, и к трем дополнительным сегментам данных, определяемых сегментными регистрами ES, FS, GS. Описания этих сегментов содержатся в их дескрипторах. Любая программа, независимо от уровня ее привилегий, не может обращаться к сегменту до тех пор, пока он не описан с помощью дескриптора, а сам дескриптор не помещен в таблицу дескрипторов.
Дескрипторы хранятся либо в глобальной таблице дескрипторов (Global Descriptor Table — GDT), либо в локальных таблицах дескрипторов (Local Descriptor Table — LDT). В GDT содержатся дескрипторы сегментов, которые доступны всем активным задачам, имеющимся в системе на данный момент. GDT может содержать любые дескрипторы сегментов, за исключением дескрипторов прерываний и ловушек. Обычно GDT включает дескрипторы сегментов кодов и данных операционной системы, сегментов состояния задач и дескрипторы сегментов, содержащих локальные таблицы дескрипторов. Микропроцессорная система имеет единственную глобальную таблицу дескрипторов.
Локальная таблица дескрипторов LDT используется для хранения дескрипторов, доступных только данной задаче. Их количество определяется количеством активных задач в системе.
Для нахождения дескриптора в таблице дескрипторов используется селектор, который содержится в одном из сегментных регистров. Селектор представляет собой 16-разрядое слово, которое разбито на 3 поля:
* TI ( Table Indicator — индикатор таблицы ) показывает, к какой таблице идет обращение: TI = 0 — дескриптор находится в глобальной таблице дескрипторов GDT, TI = 1 — в локальной таблице LDT;
* Index: поле индекса — номер дескриптора в соответствующей таблице дескрипторов;
* RPL ( Request privilege level — уровень привилегий запроса ). При обращении сравнивается с полем DPL в байте доступа дескриптора.
Обращение разрешается, если уровень привилегий запроса не ниже, чем уровень привилегий дескриптора.
-«осмысленность» сегментов упрощает их защиту
-позволяет организовать доступ к общим данным/подпрограммам для разных процессов со ссылкой на один физический участок ОП.
-медленное преобразование адреса
-высокий уровень фрагментации, которая возникает из-за непредсказуемости размеров сегментов
(в процессе работы системы в памяти образуются небольшие участки свободной памяти, в которые не может быть загружен ни один сегмент. Суммарный объем, занимаемый фрагментами, может составить существенную часть общей памяти системы, приводя к ее неэффективному использованию)
Формирование физического адреса в реальном режиме. Недостатки реального режима.
Характеристики механизма адресации физической памяти в реальном режиме.
- Диапазон изменения физического адреса — от 0 до 1 Мбайт. Эта величина определяется тем, что шина адреса i8086 имела 20 линий.
- Максимальный размер сегмента— 64 Кбайт. Это объясняется 16-разрядной архитектурой 18086. Нетрудно подсчитать, что максимальное значение, которое могут содержать 16-разрядные регистры, составляет 2 16 — 1, что применительно к памяти и определяет величину 64 Кбайт.
- Для обращения к конкретному физическому адресу оперативной памяти необходимо определить адрес начала сегмента (сегментную составляющую) и смещение внутри сегмента.
Недостатки сегментной организации памяти в реальном режиме:
- Сегменты могут перекрываться друг другом.
- Пользователь может обратиться по любому адресу, в том числе и по несуществующему.
- Ограниченный размер сегмента.
-
Микропроцессор ia-32. Регистры общего назначения
- EAX/AX/AH/AL (Accumulator register) – аккумулятор – применяется для хранения промежуточных данных, а также адресов;
- EBX/BX/BH/BL (Base register) – базовый регистр – применяется для хранения промежуточных данных, а также для хранения базового адреса объектов в памяти;
- ECX/CX/CH/CL (Count register) – регистр-счетчик – применяется для хранения промежуточных данных, а также в циклических командах, производящих некоторые повторяющиеся действия, в качестве счетчика итераций;
- EDX/DX/DH/DL (Data register) – регистр данных – так же, как и регистр EAX/AX/AH/AL, он используется для хранения промежуточных данных.
- ESI/SI (Source Index register) – индекс источника – содержит адрес текущего элемента в цепочке-источнике;
- EDI/DI (Destination Index register) – индекс приемника – содержит адрес текущего элемента в цепочке-приемнике.
- ESP/SP (Stack Pointer register) – регистр указателя стека – содержит указатель (адрес) на вершину стека в сегменте стека. Содержимое регистра неявно изменяется с помощью команд работы со стеком. Использование этого регистра для хранения каких-либо операндов программы недопустимо;
- EBP/BP (Base Pointer register) – регистр указателя базы кадра стека – предназначен для организации произвольного доступа к данным внутри стека. Например, при организации доступа к параметрам, передаваемым в процедуры через стек..
Микропроцессор ia-32. Сегментные регистры
- сегмент кода – содержит машинные команды, для доступа к нему служит регистр CS (Code Segment register) – сегментный регистр кода;
- сегмент стека – для доступа к нему служит регистр SS (Stack Segment register) – сегментный регистр стека;
- сегмент данных – содержит обрабатываемые программой данные, для доступа к нему служит регистр DS (Data Segment register) – сегментный регистр данных;
- дополнительные сегменты данных – их адреса должны содержаться в регистрах ES, GS, FS.
Сегментная адресация памяти
Наиболее распространенная модель адресации памяти — плоская, когда у каждого элемента памяти есть глобальный адрес. Но это не единственный способ работы с памятью, в данной статье я хочу рассмотреть одну из альтернатив — сегментную адресацию. Будут расмотрены несколько исторических систем, реализующих этот подход, преимущества сегментной адресации с точки зрения масштабирования и безопастности, а также высказаны гипотезы о причинах, по которым он не прижился (спойлер: буду ругать язык C и операционную систему Unix).
В подавляющем большинстве компьютерных систем для работы с некоторой ячейкой памяти необходимо как-то указать ее адрес, как правило 16-, 32- или 64-разрядное число. Количество бит в адресе часто называют разрядностью системы. Часто дополнительно используется механизм «трансляции страниц», который отображает области виртуальной памяти пользовательского приложения в физическую память, которой управляет операционная система. Но в каждый момент времени активна только одна «таблица страниц» и с точки зрения приложения (а во многом и с точки зрения ядра ОС) память остается плоской.
Рассмотрим старый процессор Intel 86/88/186. Размер регистров этих процессоров всего 16 бит, что позволяет адресовать только 64 килобайта памяти. Когда эти микросхемы разрабатывались, такого размера памяти уже не хватало для многих приложений, а 32-разрядные процессоры были слишком дороги. Проблему решили добавив в архитекруру сегментные регистры. При обращении к памяти по 16-битному адресу (хранящемуся в регистре общего назначения или прямо в коде команды) прибавлялось значение сегментного регистра, сдвинутое на 4 бита (что то же самое, умноженное на 16) и полученное значение использовалось как физический адрес. Такой подход позволял адресовать до одного мегабайта памяти. В архитектуре персональных компьтеров IBM PC, созданных на базе этих процессров, часть адресного пространства была зарезервирована для системных нужд, а пользовательским приложениям и ОС было доступно до 640 килобайт. Но не все так просто.
К тому времени в области разработки ПО себя очень хорошо зарекомендовал язык C, который позволял писать очень эффективные, но достаточно переносимые между разными платформами программы. Одной из основных фич этого языка была адресная арифметика. Именно благодаря ей удавалось писать код, эффективно использующий железо, но в то же время не опускаться до ассемблера.
Как можно реализовать язык C на i86? Какой выбрать размер указателя на ячейку памяти? Первый вариант — использовть 16-битный адрес. Архитектура процессора поддерживала 4 сегментных регистра — CS, DS, ES и SS. CS всегда содержит сегмент кода. Язык C не предоставляет стандартных средств для модификации кода на лету, что позволяет компилятору и операционной системе более менее вольно с ним обращаться. Если весь код помещается в 64 КБ, то все хорошо, если нет — компилятор вынужден использовать более дорогие межсегментные вызовы и переходы, но это сравнительно небольшая цена. Некоторую сложность создают указатели на функции, которые требуются по стандарту C. Интерфейс функций вызываемых в пределах одного сегмента и с помощью межсегментных вызовов отличался — межсегментные вызовы дополнительно сохраняли в стеке старое значение CS, а для локальных вызовов это не требовалось. Кроме того размер адреса функции был разный — для внутрисегментной достаточно было 16-бит, межсегментная должна хранить сегмент и смещение в этом сегменте. (Компилятор мог бы располагать функции на адресах, кратных 16, и ссылаться только по значению сегмента, но я не видел реализацию C или другого языка, которая бы так умела.)
Регистр DS предназначен для сегмента данных — его использовали по умолчанию практически все команды работы с памятью (кроме некоторых строковых команд, использовавших ES, и обращений в стек, о которых чуть позже). Таким образом если для данных хватало 64 КБ, то можно все их хранить в одном сегменте и использовать 16-битный указатель.
Большинство компиляторов (но не все) на каждый вызов функции создают stack frame, область стека, которая содержит адрес возврата, аргументы и локальные переменные. В i86 для стека используется сегментный регистр SS. Операции push/pop, вызовы подпрограмм и выход из них неявно использовали регистр SP (stack pointer). В i86 не было команд, явно использующих для адресации SP, поэтому компилятор в начале подпрограммы копировал значение SP в регистр BP (base pointer), и для работы с аргументами и локальными переменными использовал его. При адресациии через BP по умолчанию использовался сегмент стека. В i386 появилась возможность явно использовать SP для обращения в память, в этом случае также использовался сегмент стека. Таким образом архитектура позволяла независимо использовать 64 КБ данных и 64 КБ стека, а таже реализовать многозадачность с моделью «общий хип, частные стеки», но.
Но язык C требует возможности получения указателя на произвольный объект, глобальный, аллокированный в сегменте данных или на стеке, в том числе на локальные переменные и аргументы функций. Таким образом, если мы хотим использовать 16-битный указатель, мы должны объединить сегменты данных и стека.
Компиляторы C для i86 поддерживали несколько моделей памяти, каждая из которых имела свои недостатки и ограничения. Кроме того, независимо от модели поддерживалось несколько дополнительных типов указателей — far и huge, которые хранили сегмент и смещение. Отличие было в поддержке адресной арифметики. Far предполагал что все адресуемые через него данные находятся в том же сегменте. Huge поддерживал полноценную адресную арифметику, для чего компилятор генерировал дополнительный код, проверяющий пересечение границы сегмента и пересчитывающий значение сегмента при необходимости.
Таким образом на x86 терялись главные преимущества языка C — эффективность и переносимость.
Архитектура x86 явно использовала 20-битную адресацию памяти и расширить ее не теряя совместимости с существующими приложениями было не просто. Тем не менее в i286 было реализовано интересное решение. Сегмент теперь использовался не как базовый адрес, а как индекс в таблице, по этому индексу извлекались тип, права доступа, размер сегмента и адрес в физической памяти. Значение селектора сегмента делилось на три поля — 13-битный индекс в таблице сегментов, 1-битный признак локальности и 2 бита отводилось для упавления правами. В зависимости от признака локальности, описание сегмента бралось из глобальной или локальной для задачи таблицы дескрипторов сегментов. Дескриптор задачи сам являлся дескриптором сегмента особого типа. Таким образом операционная система могла создать до 2^13 задач, каждая из которых владела бы 2^13 сегментами, каждый по 64 КБ, что составляет аж 4096 террабайт виртуальной памяти. Но структура таблицы поддерживала только 24-битный физический адрес начала сегмента и физической памяти можно было использовать только 16 мегабайт. В дополнение к увеличению доступной памяти была реализована защита памяти, что позволило запускать вполне серьезные операционные системы — Unix (Xenix), Windows 3.1, OS/2.
Ценой этого стали дорогими операции зарузки в сегментные регистры — приходилось лезть в память за описанием сегмента и проверять доступность сегмента для задачи. Проблему можно было бы сгладить кешом дескрипторов сегментов или с помощью переименования регистров, но инженеры Intel на такое усложнение не пошли.
Ограничение на 64 килобайтные сегменты сохранилось, кроме того реализация huge-указателей требовала бы сложной поддержки в операционной системе. То есть большая часть вкусностей новой архитектуры оказалась недоступна для C-программистов, а это был уже самый популярный язык.
Настоящий прорыв в архитектуре x86 случился с появлением процессора i386. Процессор стал 32-битным, 32-битными стали и регистры общего назначения, и размеры сегментов. Также увеличился объем доступной оперативной памяти вместе с битностью адреса начала сегмента. В дополнение появилось еще два сегментных регистра — FS и GS, что должно было немного снизить потери на операциях загрузки сегментов. Но старые программы не могли использовать 32-битной адресации.
Кроме 32-битного режима в i386 появилась трансляция страниц. Это позволило запускать современные системы — Unix и Windows NT. 4 гигабайт адресуемой памяти хватает любым приложениям, и использование сегментов уже не требовалось, все можно поместить в один сегмент. Архитектура Unix была рассчитана на плоскую память языка C (включая код и данные, для удобства реализации загрузчика), и этот подход быстро был поддержан в других ОС.
В архитектуре amd64 использование сегментов сильно ограничили. Регистры CS, DS, ES и SS всегда указывают на всю виртуальную память задачи. Доступны только FS и GS, которые некоторые ОС используют для хранения локальных данных нитей.
x86 — хорошо известная, но не единственная архитектура с сегментной адресацией. Эта статья была задумана с целью немного рассказать про Plessey System 250 и Intel iAPX 432.
Тип сегмента x86 определял содержит он код или данные. В данные попадали и обычные данные, и указатели, и селекторы сегментов. Права на сегмент проверялись при попытке загрузить его в сегментный регистр или выполнить на него переход. А если пойти дальше, и специфицировать, какие сегменты могут содержать ссылки на другие сегменты, а какие не могут? Так и было сделано в Plessey System 250 (PP250).
PP250 — очень древняя система, выпущенная в 1974 году (для сравнения Intel 8086 начал производиться в 1978). К сожалению, я не смог найти описания ее системы команд или готовый эмулятор, поэтому описываю архитектуру памяти исходя из найденных статей. В этой системе поддерживалось несколько типов сегментов, в зависимости от типа сегмент содержал код, данные или ссылки на другие сегменты. Так как у прикладной программы не было возможности получить ссылку на сегмент из сегмента данных, отделять селектор и дескриптор сегментов, как это сделано в Intel 286+, необходимости не было. Также у разработчиков оставалась возможность менять формат ссылок на сегмент в разных версиях системы не теряя совместимости прикладного ПО (например, при увеличении количества доступной памяти), но, на сколько я знаю, она так и не была реализована.
Во многих языках программирования есть возможность создавать пользовательские типы данных, которые объединяют несколько объектов других, как встроенных, так и пользовательских типов, включая ссылочные типы. В PP250 такой объект не получается поместить в один сегмент, так как сегмент мог содержать либо ссылки, либо данные. Эта проблема была решена в Intel iAXP 432.
Intel iAXP 432 с ОС iMAX 432 начал разрабатываться в 1975 и был выпущен в 1981. Архитектура iAXP 432 оказала заметное влияние на организацию памяти в Intel 286, выпущенном годом позже. Основным ЯП для этой системы был язык Ada, но предполагалась поддержка и других языков, в частности Lisp. Одним из преимуществ таких архитектур является различимость указателей и данных, что упрощает реализацию важной для Lisp сборки мусора.
Сегмент iAPX 432 состоял из двух частей — области ссылок и области данных. Таким образом на уровне системы команд не было возможности попытаться превратить данные в указатель (в PP250 попытка загрузить ссылку из сегмента данных могла быть отслежена только во время исполнения).
Интересно, что разделение указателей и данных встречалось и в традиционных архитектурах, рассчитанных на плоскую память. Например в процессоре Motorola 68000 было два регистровых файла — регистры данных и регистры адресов. С точки зрения разработчика аппаратуры это упрощает реализацию конвейера и экономит биты в кодах команд. Правда с точки зрения разработчиков компиляторов это только усложняло алгоритмы распределения регистров. Похожая схема реализована в некоторый CPU для встраиваемых систем, таких как Blackfin.
Хотя сегментная адресация и имеет существенные преимущества в безопасности и масштабируемости, она плохо совместима с языком C и современными ОС, и не получила существенного распостранения. Тем не менее, познакомиться с ней полезно, я надеюсь она еще будет применена, например при проектировании основанных на байткодах виртуальных машин.
- ретрокомпьютеры
- сегменты
- capability-based security
- capability maturity model
Недостатки реального режима адресации в компьютерных системах
Реальный режим адресации — это один из режимов работы процессора, который обеспечивает доступ к физической памяти компьютера. В этом режиме процессор использует сегментированную модель памяти, в которой адресное пространство разделено на сегменты. Каждый сегмент имеет свои ограничения и может быть адресован с помощью сегментного регистра.
Однако реальный режим адресации имеет несколько недостатков, которые могут затруднять разработку программного обеспечения. Одна из проблем заключается в том, что адресное пространство в реальном режиме ограничено 1 МБ. Это может быть недостаточно для современных приложений, требующих большего объема памяти.
Кроме того, реальный режим адресации предоставляет ограниченные возможности для защиты памяти. В этом режиме невозможно применить механизмы защиты, такие как контроль доступа к памяти и защита от перезаписи данных. Это делает систему уязвимой к атакам и злоумышленникам.
Однако существуют решения для преодоления этих недостатков реального режима адресации. Одно из таких решений — переход к защищенному режиму адресации, который включает дополнительные механизмы защиты памяти и расширяет адресное пространство до 4 ГБ. В защищенном режиме возможно также использование виртуальной памяти, что позволяет обеспечить большую гибкость в управлении памятью и защите данных.
Реальный режим адресации: что это?
Реальный режим адресации — это режим работы процессора в компьютере, который был основным режимом работы в более старых версиях операционных систем и процессоров.
В реальном режиме адресации процессор работает сегментно-смещенным способом. Каждый адрес в памяти представлен сегментным и смещенным значением. Сегментное значение указывает на начало сегмента памяти, а смещенное значение — на отдельный байт внутри сегмента.
В реальном режиме адресации процессор может обращаться только к 1 МБ памяти, так как размер сегментного значения составляет 20 бит (2^20 = 1 МБ). Это было ограничение для более старых версий операционных систем и процессоров.
Недостатки реального режима адресации:
- Ограничение доступа к только 1 МБ памяти
- Отсутствие механизма защиты памяти
- Отсутствие поддержки многозадачности и защищенного режима работы
В целом, реальный режим адресации уже не используется в современных компьютерах и операционных системах, однако понимание его принципов работы полезно для изучения истории развития вычислительной техники.
Недостатки реального режима адресации
1. Ограничение по объему доступной памяти
В реальном режиме адресации, используемом в процессорах семейства x86, доступный объем памяти ограничен 1 МБ (вплоть до Pentium процессоров) или 4 ГБ (начиная с процессоров Pentium Pro). Это создает проблему при обработке больших объемов данных или при выполнении сложных вычислений, требующих большого объема памяти.
2. Негибкость при работе с памятью
В реальном режиме адресации отсутствует защита памяти и механизмы виртуальной памяти, что делает систему небезопасной и уязвимой для ошибок и злоумышленников. Кроме того, отсутствует возможность динамического выделения и освобождения памяти, что ограничивает гибкость работы с ней.
3. Ограниченная поддержка многозадачности
В реальном режиме адресации отсутствуют механизмы, позволяющие эффективно выполнять несколько задач одновременно. Это ограничивает возможности параллельной обработки данных и снижает производительность системы в целом.
4. Отсутствие защиты от переполнения стека
В реальном режиме адресации отсутствует защита от переполнения стека, что может привести к непредсказуемому поведению программы или сбою системы. Это может быть использовано вредоносными программами для выполнения атаки на систему.
5. Ограниченные возможности адресации
В реальном режиме адресации доступны только 16-битные и 20-битные адреса, что ограничивает возможности адресации памяти и усложняет работу с большими объемами данных.
Проблемы, возникающие в реальном режиме адресации
Реальный режим адресации, используемый в архитектуре x86, имеет свои ограничения и проблемы, которые могут затруднять разработку программного обеспечения и повышать риск возникновения ошибок.
- Ограниченное адресное пространство: в реальном режиме адресации можно обратиться только к первым 1 МБ оперативной памяти. Это ограничение создает проблемы при работе с большими объемами данных и может затруднять разработку сложных приложений.
- Отсутствие защиты памяти: в реальном режиме адресации отсутствуют механизмы защиты памяти, такие как разделение пространства процессов и защита от несанкционированного доступа. Это может привести к возникновению ошибок, связанных с перезаписью данных или выполнением злонамеренного кода.
- Ограниченная поддержка многозадачности: реальный режим адресации не предоставляет полноценной поддержки многозадачности. Он не обеспечивает механизмы планирования задач и разделения ресурсов, что может создавать проблемы при разработке многозадачных систем.
- Сложности при работе с 16-битными регистрами: в реальном режиме адресации осуществляется работа с 16-битными регистрами, что может быть неудобно и требует дополнительных усилий для работы с большими числами и адресами.
Для решения этих проблем был разработан защищенный режим адресации, также известный как защищенный режим операционной системы. Он расширяет адресное пространство, обеспечивает механизмы защиты памяти и поддержку многозадачности. Однако, реальный режим адресации все еще используется в некоторых ситуациях, например, для поддержки старых программ или работы с прошивкой компьютера.
Решения для преодоления недостатков
Недостатки реального режима адресации в компьютерах могут быть решены с помощью следующих подходов:
- Использование виртуальной памяти: Виртуальная память позволяет обращаться к физической памяти компьютера через адресные пространства, которые не ограничены размерами оперативной памяти. Это позволяет более эффективно использовать ресурсы компьютера и увеличить производительность.
- Сегментация: С использованием сегментации адреса физической памяти разделяется на отдельные сегменты различного размера. Это позволяет гибко управлять адресным пространством и упростить адресацию данных и инструкций.
- Страницы: Вместо адресации памяти в виде одного непрерывного блока, память разделяется на страничные блоки фиксированного размера. Это позволяет эффективно управлять памятью и минимизировать фрагментацию памяти.
- Кэширование: Использование кэш-памяти позволяет ускорить доступ к данным, сохраняя часто используемые данные в быстродействующей памяти ближе к процессору. Это уменьшает задержки и повышает производительность системы.
- Управление внешней памятью: Организация внешней памяти, такой как жесткие диски, может быть улучшена с помощью различных технологий, таких как RAID-массивы, кэш-память на дисковых контроллерах и компрессия данных. Это позволяет эффективно использовать внешнюю память и повысить скорость доступа к данным.
Вместе эти решения помогают улучшить производительность компьютерных систем и повысить эффективность использования ресурсов. Они позволяют работы с большим объемом данных, упрощают адресацию и ускоряют доступ к памяти и данным.
Преимущества альтернативных режимов адресации
В реальном режиме адресации существуют некоторые проблемы и ограничения, такие как ограничение на доступную память, низкая производительность и сложности при разработке программного обеспечения. Однако с появлением альтернативных режимов адресации эти проблемы могут быть решены. Вот некоторые из преимуществ альтернативных режимов адресации:
- Расширенная адресуемая память: одним из основных преимуществ альтернативных режимов адресации является возможность доступа к большей памяти, чем в реальном режиме адресации. Некоторые альтернативные режимы адресации позволяют адресовать до 4 гигабайт памяти, что существенно увеличивает возможности программистов.
- Защита памяти: альтернативные режимы адресации предоставляют механизмы для защиты памяти от несанкционированного доступа. Это позволяет создавать безопасные программы и обеспечивает надежность и стабильность работы системы.
- Увеличенная производительность: благодаря более современным архитектурам и возможности использования современных инструкций и режимов работы процессора, альтернативные режимы адресации обеспечивают лучшую производительность по сравнению с реальным режимом адресации. Это особенно важно для задач требующих высокой производительности, таких как обработка графики или вычисления в реальном времени.
- Улучшенные возможности разработки программного обеспечения: альтернативные режимы адресации предоставляют богатый набор инструкций и режимов работы процессора, что облегчает разработку программного обеспечения. Например, в альтернативных режимах адресации доступны различные режимы работы памяти и специализированные инструкции для работы с данными.
- Удобство использования: альтернативные режимы адресации обычно обеспечивают более простой и удобный интерфейс для работы с памятью и другими ресурсами системы. Инструкции и операции, доступные в альтернативных режимах адресации, могут быть более интуитивными и понятными для программистов.
В целом, альтернативные режимы адресации предоставляют более высокую производительность, больше возможностей и удобство использования по сравнению с реальным режимом адресации. Они играют важную роль в разработке современных систем и программного обеспечения.
Вопрос-ответ
Какие основные проблемы возникают при использовании реального режима адресации в компьютерах?
Основные проблемы, связанные с использованием реального режима адресации, включают ограниченный объем адресуемой памяти (1 МБ), непосредственное обращение к аппаратуре компьютера, отсутствие защиты памяти и проблемы совместимости с современными операционными системами.
Какие решения существуют для решения проблем, связанных с реальным режимом адресации?
Для решения проблем, связанных с реальным режимом адресации, был разработан защищенный режим адресации, где адресное пространство разделено на сегменты, чтобы обеспечить защиту памяти и изоляцию задач. Также были созданы эмуляторы, которые позволяют запускать старые программы, написанные для реального режима, на современных операционных системах.
Можно ли обойтись без использования реального режима адресации?
Да, современные компьютеры и операционные системы уже не используют реальный режим адресации, так как он имеет много ограничений и проблем. Вместо этого, используются защищенный режим адресации и виртуальная память, что позволяет более эффективно использовать ресурсы компьютера и обеспечить безопасность и защиту памяти.