Память процессора pentium 2 организована как прямоугольный массив битов
Двухбитное поле Масштаб (Scale) кодирует значение масштабного множителя (1, 2, 4, 8), который указывает размер элементов массива при использовании индексной адресации.
6.3 Аппаратная организация защиты в процессорах Pentium
Современные ВМ поддерживают многопрограммный (мультипрограммный) и многозадачный (мультизадачный) режимы работы /1/.
Многопрограммный режимпредполагает одновременное выполнение процессором нескольких программ, переключаясь между ними. Естественно, в каждый конкретный момент времени процессор может выполнять команды только определённой программы.
Многозадачностью называется способ организации работы компьютера, при котором в его оперативной памяти содержатся программы и данные для одновременного выполнения нескольких процессов обработки информации (задач). Один из способов реализации многозадачности, называемый разделением времени, заключается в предоставлении каждой задаче некоторого интервала времени (кванта обслуживания), в течение которого процессор выполняет команды соответствующей программы. Если по истечении выделенного кванта времени обработка программы не заканчивается, она прерывается и становится в очередь программ, ожидающих обработки. При реализации многозадачности необходимо обеспечить взаимную защиту программ и данных, относящихся к различным задачам.
Для обнаружения и идентификации ошибок современные процессоры, в т.ч., и процессоры Intel, сконструированы со встроенным механизмом защиты. Этой цели способствует организация памяти, которая предусматривает взаимное разделение адресных пространств различных задач с помощью сегментов. Система привилегий жёстко регламентирует взаимоотношения задач с памятью, операционной системой (ОС) и друг с другом. Для эффективного управления всей системой ОС разрешён доступ к памяти всех программ, а пользовательским программам обеспечивается доступ к программам ОС только в разрешённых точках входа. Для поддержки указанных функций в систему команд процессоров Intel введены некоторые привилегированные команды, которые могут выполняться только ОС. Кроме того, в структуре процессора имеется ряд регистров, к которым закрыт доступ со стороны пользовательских программ.
Основной единицей защиты является сегмент. При каждом обращении к сегменту проверяется ряд параметров защиты, задаваемых в дескрипторе, в т. ч., предел, тип сегмента, права, уровень привилегий.
Специальное поле предел определяет границы сегмента. С его помощью процессор обнаруживает такие распространённые ошибки, как переполнение стека, неверные указатели и индексы массивов, неправильные адреса вызовов и переходов. Ошибки нарушения границы обнаруживаются в момент их возникновения, что существенно облегчает поиск их причины. Остальные параметры защиты хранятся в байте доступа (Access Rights) дескриптора, структура которого представлена на рисунке 6.1.
Рисунок 6.1 – Формат байта доступа дескриптора
Специальный бит присутствия Р указывает, где размещён искомый сегмент – в основной памяти ВМ (Р=1) или на диске (Р=0).
Бит доступа А фиксирует каждое обращение к сегменту.
Бит S кодирует назначение и способ использования дескриптора. При S=0 дескрипторы являются системными. Они используются для обращения к системным сегментам TSS, LDT или являются шлюзами для задания разрешённых точек входа в защищённые программы ОС. Дескрипторы несистемных сегментов кода, данных и стека имеют бит S=1.
Поле TYPE доопределяет тип дескриптора. Проверка типа обнаруживать ошибки при использовании сегмента не по назначении. Например, в сегмент кода нельзя записывать, а с сегментом таблицы LDT нельзя явно производить операции считывания, записи и выполнения.
Права, которыми может быть помечен несистемный дескриптор, ограничивают множество операций, которые можно производить с его сегментом. Права указываются также в поле TYPE несистемных дескрипторов. Например, исполняемый сегмент кода дополнительно может быть помечен как читаемый.
Поле привилегий DPL (Descriptor Privilege Level) задаёт разрешённый уровень привилегий для доступа к сегменту. Привилегии – это свойство, которое определяет, какие программы можно выполнять и к каким данным возможен доступ в каждый конкретный момент времени. В целом уровень привилегий программы определяет конкретное подмножество сегментов адресного пространства, к которому программа может обращаться. Привилегии устанавливаются программами ОС в байте доступа дескриптора сегмента при заполнении дескрипторных таблиц. Попытка задачи использовать сегмент с более высоким уровнем привилегий приводит к особому случаю защиты.
Уровни привилегий (PL) удобно представить в виде колец защиты: уровень привилегий PL=0 отводится для ядра ОС, PL=1 – утилитам ОС, PL=2 – служебным программам ОС, системам управления базами данных и др., PL=3 – пользовательским программам.
При любом межсегментном взаимодействии всегда участвуют два сегмента – текущий сегмент кода и сегмент, к которому происходит обращение (сегмент назначения). Обратиться к данным сегмента назначения можно в том случае, если уровень его привилегий равен или меньше уровня привилегий текущего сегмента кода. При межсегментных передачах управления (доступе к другому сегменту кода) переход возможен, если уровень привилегий сегмента назначения равен уровню привилегий текущего сегмента кода (т.е., сегменты кода находятся в пределах одного кольца защиты). Варианты возможных межсегментных взаимодействий наглядно демонстрирует рисунок 6.2 /1/.
Рисунок 6.2 – Обращения в пределах колец защиты и между ними
Последовательность проверок при всех межсегментных обращениях следующая. Перед тем как обратиться к операнду в памяти, программа загружает селектор в один из сегментных регистров, и аппаратным путём выполняется проверка возможности к адресуемому операнду. Сначала процессор сравнивает формируемое внутрисегментное смещение со значением поля предела сегмента и определяет правильность адреса (в случае выхода за границы сегмента процессор формирует прерывание общей защиты). Затем процессор выполняет проверку привилегий сегмента, к которому происходит обращение (такая проверка зависит от типа сегмента назначения). Непосредственно перед каждым обращением к операндам, в т.ч. и внутрисегментном, дополнительно аппаратным путём проверяется ещё ряд параметров защиты. Нарушение любого из них приводит к обработке особого случая и предотвращает обращение к операнду.
Передача управления в защищённом режиме осуществляется командами CALL, JMP, INT, RET, IRET, а также механизмами исключений и прерываний. При выполнении внутрисегментного перехода осуществляется только проверка границы перехода. При исполнении команд межсегментного перехода выполняется проверка привилегированности кодового сегмента назначения. Если межсегментный переход осуществляется в пределах одного кольца защиты, то доступ к вызываемому сегменту разрешён.
Реализуя защиту, процессор запрещает пользовательским программам выполнять те операции, которые выполняются программами ОС. Однако в любой системе есть некоторые стандартные процедуры, которые желательно выполнять на любом уровне привилегий, например, доступ пользовательских программ к утилитам ОС (они имеют PL=1). Это приводит к наличию исключений в общих правилах защиты. Процессоры Pentium обеспечивают 2 способа реализации межсегментных передач управления из менее привилегированного сегмента в более привилегированный: обращение к согласованному сегменту и использование шлюзов вызова.
Согласованный сегмент – это сегмент, у которого отсутствует защита по привилегиям. Выделение согласованного сегмента осуществляется с помощью специального бита подчинения С в поле TYPE байта доступа сегмента кода. Процедуры, размещённые в согласованном сегменте кода, можно вызывать из программ с любым уровнем привилегий. Наличие согласованных сегментов удобно для организации системных библиотек, программы которых должны быть доступны всем задачам.
Шлюзы вызова – это специальные дескрипторы, которые определяют разрешённые точки входа в защищённые процедуры более высокого уровня. Благодаря шлюзам вызова, пользовательские программы получают от ОС только те обслуживания, которые ОС разрешает оказывать пользовательским программам. По существу, шлюзы вызова не являются дескрипторами, но их удобно размещать в дескрипторных таблицах. При использовании шлюзов вызова передача управления всегда осуществляется косвенно. Вызывающая программа обращается к шлюзу вызова, а он определяет точку входа в вызываемой процедуре. 32-разрядный дескриптор шлюза вызова имеет следующий формат: байт доступа, счётчик слов (1 байт), селектор сегмента назначения (1 байт) и смещение (1 байт).
Селектор сегмента назначения содержит адрес дескриптора кодового сегмента назначения, который (дескриптор) также хранится в дескрипторной таблице. Селектор и смещение задают полный адрес перехода, который определяет вход в защищённую процедуру только в разрешённой точке.
При передаче управления более защищённой программе может потребоваться копирование параметров из стека вызывающей программы в стек вызываемой. Для этого в шлюзе вызова предусмотрено поле – счётчик слов, в котором указывается число копируемых параметров.
Доступ к шлюзу вызова контролируется механизмом защиты. Селекторы шлюзов вызова можно загружать только в сегментный регистр кода CS. При доступе к шлюзу действуют такие же ограничения, как и при обращении к данным (см. рисунок 6.2).
6.4 Аппаратные средства поддержки многозадачности
В структуре процессоров Pentium имеются средства поддержки многозадачного режима, с помощью которых реализуется защита и быстрое переключение задач /1/: специальная структура данных, организованная в виде сегмента состояния задачи TSS, дескриптор сегмента TSS, дескриптор шлюза задачи, 16-разрядный регистр TR (Task Register) и связанный с ним программно недоступный теневой 64-разрядный регистр TRт.
Переключение задачи сходно с вызовом процедуры, но требует сохранения большего количества информации о состоянии процессора. Содержимое регистров процессора, участвующих в выполнении задачи, называетсясредой задачи. Для каждой задачи создаётся собственный сегмент TSS, который фактически характеризует состояние виртуального процессора задачи в многозадачной системе. Выполнение задач процессора осуществляется в соответствии с планом и в порядке, определяемым ОС. При переключении задач среда выполняемой задачи переписывается в сегмент TSS этой задачи (на этот сегмент указывает регистр текущей задачи TRт) – (стрелка 1 на рисунке 6.3). После этого в регистр TR помещается селектор нового сегмента TSS (стрелки 2), и в регистры процессора из сегмента TSS вызываемой задачи загружается содержимое её среды (стрелка 3). Выполнение программы новой задачи продолжается с команды, адрес которой указан в регистре EIP новой задачи, а не с самого начала. Указанные операции реализуются автоматически с помощью аппаратных средств процессора. При этом в стеке, в отличие от вызова подпрограмм, никакой информации не сохраняется, управление передаётся полностью в среду выполняемой задачи. Схема переключения задач представлена на рисунке 6.3 /19/.
Длительность процедуры переключения задач составляет 200 тактов.
Если переключение задач осуществляется на одном уровне привилегий (внутри одного кольца защиты), то используется прямое переключение задач, когда селектор указывает на дескриптор задачи. Для вызова задач в более привилегированном кольце используются шлюзы задач, т.е. выполняется косвенное переключение задач, когда селектор указывает на шлюз задачи.
Основным назначением механизма переключения задач является организация очередных переходов между выполняемыми программами. Переключение программ может производиться командами JMP и CALL типа FAR (межсегментные переходы), командами вызова прерываний (INT n) или командой IRET, а также аппаратными прерываниями и ловушками.
Рисунок 6.3 – Схема переключения задач
При выполнении межсегментных переходов в защищённом режиме в регистре EIP содержится смещение (адрес команды внутри сегмента), а в регистре CS может находиться адрес или дескриптора сегмента, или шлюза дескриптора сегмента, или дескриптора TSS, или дескриптора шлюза TSS.
Сегмент TSS определяется одноимённым сегментным дескриптором, который может находиться только в глобальной дескрипторной таблице GDT. Этот дескриптор помимо адреса содержит ещё указание размера и уровня привилегий сегмента TSS. Выбор дескриптора TSS текущей задачи в таблице GDT осуществляется с помощью селектора, загружаемого в программно доступный регистр TR. Для уменьшения времени обращения к операндам сегмента TSS дескриптор TSS текущей задачи после выборки из таблицы GDT запоминается в программно недоступном регистре TRт. Содержимое этого регистра автоматически обновляется процессором при смене задачи. При инициализации системы с помощью специальной команды LTR в регистр TR загружается селектор исходной задачи, а в процессе работы его содержимое может изменяться.
С сегментом TSS нельзя явно проводить операции записи, чтения и выполнения. Для этого используются дополнительные сегменты данных с разрешённой записью, которые имеют тот же базовый адрес и предел, что и программно недоступный системный сегмент.
6.5 Перспективы развития процессоров
Согласно /1/, самым существенным фактором, влияющим на архитектурные решения современных процессоров, является постоянное совершенствование технологии производства ИС. Как следствие,- рост уровня интеграции, уменьшение задержек в вентилях и связях, снижение энергопотребления при переключении вентиля. В целом с ростом уровня интеграции увеличиваются ресурсы на кристалле и повышается тактовая частота работы микросхем, что позволяет повышать производительность процессоров. Первое направление связано с увеличением объёма внутренней кэш-памяти и совершенствованием способов её организации. Второе направление связано с реализацией в процессорах принципов конвейеризации и параллельной обработки в нескольких конвейерах на разных стадиях выборки и выполнения команд.
Практически все накопленные в процессе конкуренции различных фирм архитектурные решения находят своё воплощение в новых архитектурах. По этой причине в архитектуре современных процессоров различных производителей много общего, и ставится вопрос об унификации архитектур. На сегодняшний день можно выделить следующие основные тенденции развития архитектур современных процессоров:
1) Применение суперскалярной обработки с динамическим параллелизмом в процессорах с чисто аппаратным механизмом выборки несвязанных команд программы из памяти и параллельном запуске их на исполнение (например, процессоры Pentium, PowerPC, Alpha, SPARC и др.).
2) Развитие суперскалярной обработки со статическим параллелизмом, при котором выявление скрытого параллелизма и определение возможности параллельного исполнения команд возлагается на оптимизирующий компилятор (например, процессоры Itanium, Crusoe и др.).
3) Использование аппаратных средств, обеспечивающих векторную обработку данных.
Современный процессор – это 64-разрядный суперконвейерный, суперскалярный процессор с RISC-операционным ядром и большим числом дополнительных блоков, реализующий динамическое исполнение команд. Для эффективной обработки данных мультимедиа и графики система команд современных процессоров расширяется за счёт специализированных команд мультимедийной обработки: например, команд расширений MMX, SSE, SSE2 в процессорах компании Intel; ActiVec – IBM, Motorola; VIS – SPARC; 3DNow! – AMD.
Для унификации структур обработки данных в структуры некоторых современных процессоров включают специальные преобразователи исходных кодов команд во внутренние машинные команды «исполнительного процессора» (например, сложных CISC-команд в RISC-команды в процессорах Pentium, AMD или VLIW-команды в процессоре Crusoe).
Как уже упоминалось ранее, масштабные исследования ведутся по созданию процессорных элементов и компьютеров в целом с использованием принципиально иной элементной базы: биполярных молекул, молекул ДНК, квантовых кубитов и света.
Для повышения быстродействия применяются различные архитектурно-логические решения, известно множество различных типов памяти, отличающихся друг от друга своими основными характеристиками.
Основная память соединяется с процессором через адресную шину и шину данных. Каждая шина состоит из множества электрических цепей или бит. Ширина (разрядность) адресной шины определяет, сколько адресов может быть в ОЗУ (адресное пространство), а шины данных — сколько данных может быть передано за 1 цикл. Например, в 1985 г. процессор Intel 386 имел 32-разрядную адресную шину, что дает возможность поддерживать адресное пространство в 4 Гбайт. В процессоре Pentium (1993 г.) ширина шины данных была увеличена до 64 бит, что позволило передавать 8 байт информации одновременно.
Каждая передача данных между процессором и памятью называется циклом шины. Количество бит, которое процессор может передать за один цикл шины, влияет на производительность компьютера и определяет, какой тип памяти требуется.
Рассмотрим основные типы систем памяти
Динамическая память.
Динамическая память (DRAM) используется обычно в качестве оперативной памяти общего назначения, а также как память для видеоадаптера. Из применяемых в современных и перспективных ПК типов динамической памяти наиболее известны DRAM и FPM DRAM, EDO DRAM и BEDO DRAM, EDRAM и CDRAM, Synchronous DRAM, DDR SDRAM и SLDRAM, видеопамять MDRAM, VRAM, WRAM и SGRAM, RDRAM и некоторые другие.
Микросхема памяти этого типа представляет собой прямоугольный массив ячеек, со вспомогательными логическими схемами, которые используются для чтения или записи данных, а также цепей регенерации, поддерживающих целостность данных. Массивы памяти организованы в строки (raw) и столбцы (column) ячеек памяти, именуемые соответственно линиями слов (wordlines) и линиями бит (bitlines). Каждая ячейка памяти имеет уникальное размещение, задаваемое пересечением строки и столбца. Цепи, поддерживающие работу памяти, включают:
усилители, считывающие сигнал из ячейки памяти;
схемы адресации для выбора строк и столбцов;
схемы выбора адреса строки (row adress select /RAS) и столбца (column adress select /CAS), чтобы открывать и закрывать адреса строк и столбцов, а также начинать и заканчивать операции чтения и записи;
цепи записи и чтения информации;
внутренние счетчики или регистры, следящие за циклами регенерации данных;
схемы разрешения выхода (Output enable — ОЕ).
Каждый бит такой памяти представляется в виде наличия (или отсутствия) заряда на конденсаторе, образованном в структуре полупроводникового кристалла. Конденсатор управляет транзистором. Если транзистор открыт и ток идет, это означает «1», если закрыт — «0». С течением времени конденсатор разряжается, и его заряд нужно периодически восстанавливать. Между периодами доступа к памяти посылается электрический ток, обновляющий заряд на конденсаторах для поддержания целостности данных (вот почему данный тип памяти называется динамическим ОЗУ). Этот процесс называется регенерацией памяти.
Интервал регенерации измеряется в наносекундах (не), и это число отражает «скорость» ОЗУ. Большинство ПК на основе процессоров Pentium характеризуются скоростью 60 или 70 не. Процесс регенерации снижает скорость доступа к данным, поэтому доступ к DRAM обычно осуществляется через кэш-память. Однако когда быстродействие процессоров превысило 200 МГц, кэширование перестало существенно влиять на присущую DRAM низкую скорость и возникла необходимость использования других технологий ОЗУ.
Цикл чтения включает следующие события (см. рис. 2.15, для EDO DRAM):
выбор строки. Активизация цепи /RAS используется для связывания со строкой памяти и инициации цикла памяти;
выбор столбца. Сигнал /CAS используется для связывания со столбцом памяти и инициации операции записи-чтения;
разрешение записи (Write enable /WE);
разрешение вывода (Output enable /ОЕ). Во время операций чтения из памяти этот сигнал предотвращает появление данных прежде времени;
ввод/вывод данных. Выводы DQ на чипе памяти предназначены для ввода и вывода. Во время операции записи высокое («1») или низкое («0») напряжение подается на DQ. При чтении данные считываются из выбранной ячейки и передаются на DQ, если доступ осуществлен и /ОЕ открыт.
Охарактеризуем вкратце системы динамической оперативной памяти.
FPM DRAM (Fast page mode DRAM) - представляет собой стандартный тип памяти, быстродействие которой составляет 60 или 70 нс. Система управления памятью в процессе считывания активирует адреса строк, столбцов, осуществляет проверку данных и пере дачу информации в систему. Столбцы после этого деактивируются, что приводит к нежелательному состоянию ожидания процессора в некоторых сочетаниях операций с памятью. В наилучшем случае данный режим реализует временную схему пакета вида 5-3-3-3.
EDO RAM (RAM с расширенным выходом). Обращение на чтение осуществляется таким же образом, как и в FPM, за исключением того, что высокий уровень /CAS не сбрасывает выходные данные, а использование триггера позволяет сохранять данные то тех пор, пока уровень CAS снова не станет низким. Тем самым не происходит сброса адреса столбцов перед началом следующей операции с памятью.
Упрощенная схема работы EDO показана на рис. 2.2. Выходная величина поддерживается последовательностью стробируюших импульсов до тех пор, пока она не будет считана ЦП. Эта память обеспечивает лучшие параметры для серии быстрых последовательных считываний, чем FPM RAM. Теоретически скорость памяти на 27 % выше, чем для FMP DRAM.
BEDO RAM (Burst extended data out DRAM — пакетная с расширенным выходом), как это видно из названия, читает данные в виде пакета, что означает, что после получения адреса каждая из следующих трех единиц информации читается за один цикл таймера, а ЦП считывает данные в виде пакета 5-1-1-1. Быстродействие системы на 100 % превосходит FPM и на 50 % — EDO DRAM.
SDRAM (Synchronous DRAM — Синхронная динамическая память). Этот тип памяти существенно отличается от других тем, что использует тот факт, что большинство обращений к памяти является последовательным и спроектировано так, чтобы передать все биты пакета данных как можно быстрее (когда начинается передача пакета, все последующие биты поступают с интервалом 10 нс).
Как видно из названия, эта память обеспечивает синхронизацию всех входных и выходных сигналов с системным таймером. Наибольшая скорость SDRAM в циклах ЦП — это 5-1-1-1 для пакета чтения четырех единиц информации (байт/слово/двойное слово), что делает ее такой же быстродействующей, как и BEDO RAM; однако самое большое достоинство SDRAM — то, что она легко поддерживает частоту шины до 100 МГц.
SDRAM PC100. Для материнских плат, поддерживающих внешние частоты 100 МГц и выше, необходима память (SDRAM), которая сможет нормально и без сбоев работать с такими частотами, обеспечивая оптимальную скорость. Такие модули памяти должны иметь время доступа не более 8 нс, но самого быстродействия как такового недостаточно. Память, способная устойчиво работать на внешних частотах 100 МГц и выше, должна удовлетворять специальному стандарту - PC 100.
SDRAM PC133 — память, соответствующая стандарту PC 133. Спецификация PC 133 SDRAM DIMM разработана группой компаний VIA Technologies, IBM Microelectronics, Micron Semiconductor Products, NEC Electronics, Samsung Semiconductor (Revision 0.4, 7 июня 1999 г.). Память PC 133 — это лучшие образцы памяти стандарта PC 100, «разогнанные» до 133 МГц.
Пиковая пропускная способность PC 133 SDRAM приблизительно равна 1 Гб/с и средняя пропускная способность около 250 Мбайт/с, что соответствует пропускной способности AGP 4-х (1 Гбайт/с — пиковая и 200 Мбайт/с — средняя).
DDR SDRAM (SDRAM II). В системах с синхронизацией данные обычно передаются по фронту импульса синхронизации (clock tick). Так как сигнал генератора импульсов изменяется между «1» и «0», данные могут передаваться или по переднему фронту импульса (изменение с «0» на «1»), или по заднему (с «1» на «0»).
Компанией Samsung предложена система DDR (Double Data Rate) SDRAM или SDRAM II, в которой передача данных осуществляется по обоим фронтам тактовых импульсов одновременно, чем достигается удвоение скорости передачи при той же тактовой частоте. Кроме того, DDR использует DLL (delay-locked loop — цикл с фиксированной задержкой) для выдачи сигнала DataStrobe, означающего доступность данных на выходных контактах. Используя один сигнал DataStrobe на каждые 16 выводов, контроллер может осуществлять доступ к данным более точно и синхронизировать входящие данные, поступающие из разных модулей, находящихся в одном банке. DDR фактически увеличивает скорость доступа вдвое по сравнению с SDRAM, используя при этом ту же частоту.
DDR II SDRAM. К числу основных отличий технологии DDR- II от предыдущего варианта (DDR-I) относится то, что в ней размер выборки данных увеличен вдвое — с 2 до 4 бит, а значит, во столько же раз возрастает скорость передачи. Память DDR-II отличается от DDR-I более низким напряжением питания — 1,8 вместо 2,5 В.
SLDRAM (Synchronous linked DRAM). Этот тип устройств разработан консорциумом крупнейших производителей модулей памяти — SLDRAM Consortium. Считается, что применение SLDRAM экономически выгодно при объеме ОЗУ не менее 256 Мбайт. Повышение производительности достигается за счет распространения пакетного протокола передачи данных на сигналы управления (отсюда название этого типа памяти — Linked SDRAM). В SLDRAM адреса, команды, а также сигналы управления передаются в пакетном режиме по однонаправленной шине Command Link.
Одновременно с ними по другой, двунаправленной шине Data Link, и тоже в пакетном режиме, передаются данные, причем передача происходит на обоих фронтах тактовых импульсов, как и в случае с DDR SDRAM.
Максимальная достижимая скорость передачи SLDRAM превышает 1 Гбайт/с на каждый разряд при частоте 400 МГц. Контроллер программирует все чипы модуля памяти так, чтобы они выдавали данные на шину одновременно, независимо от разброса их параметров и степени удаленности микросхем от контроллера. В результате самая удаленная микросхема выдает данные без задержки, а самая близкая — через промежуток времени, нужный, чтобы сигнал распространился от самой удаленной до самой близкой.
ESDRAM (Enhanced SDRAM — улучшенная SDRAM) — более быстрая версия SDRAM, соответствующая стандарту JEDEC компании Enhanced Memory Systems (EMS). С точки зрения времени доступа производительность ESDRAM в 2 раза выше по отношению к стандартной SDRAM.
Основные отличия от SDRAM:
более быстрое время доступа (27 нс вместо стандартных 60 нс);
производительность, повышенная почти до уровня статического ОЗУ;
кэш-память, связанная с каждым банком памяти;
гибкое использование кэш-памяти для обеспечения максимальной производительности при различных типах обращений.
Недостаток ESDRAM — усложнение контроллера: он должен учитывать возможность подготовки к чтению новой строки ядра. Кроме того, при произвольных адресах чтения кэш-память используется крайне неэффективно, поскольку чтение строки ядра целиком происходит очень редко. Этого недостатка нет у другого типа памяти — CDRAM.
CDRAM (Cached DRAM — DRAM с кэш-памятью). Этот тип ОЗУ разработан в корпорации Mitsubishi и представляет собой улучшенный вариант ESDRAM. Изменения коснулись кэш-памяти — ее объема, принципа размещения данных, средств доступа. Cached DRAM имеет раздельные адресные линии для статического кэша и динамического ядра. Необходимость управлять разнородными типами памяти усложняет контроллер, однако эффективность кэш-памяти, размешенной внутри микросхемы, выше, чем при традиционной архитектуре ПК, так как перенос в кэш осуществляется блоками, в восемь раз большими, чем при выдаче из микросхемы обычной DRAM.
Direct Rambus (DRDRAM). Одной из наиболее быстродействующих является память RDRAM (Rambus DRAM), разработанная компанией Rambus (США) и выпускаемая такими компаниями, как NEC, Toshiba и Fujitsu. Память RDRAM является 9-разрядной, тактируется частотой 250 МГц и достигает пиковой скорости передачи данных 500 Мбайт/с.
Подсистема памяти Rambus состоит из следующих компонентов: основной контроллер (RMC — Rambus Memory Controller), канал (RC — Rambus Channel), разъем для модулей (RRC — Rambus RIMM Connector), модуль памяти (R1MM — Rambus In-line Memory Module), генератор дифференциальных импульсов (DRCG — Direct Rambus Clock Generator) и сами микросхемы памяти (RDRAM — Rambus DRAM).
VCM (Virtual Channel Memory) — разработанная NEC и Siemens технология, позволяющая оптимизировать доступ к оперативной памяти нескольких процессов (запись данных центральным процессором, перенос содержимого оперативной памяти на жесткий диск, обращения графического процессора и т. п.) таким образом, что переключение между процессами не приводит к падению производительности. В отличие от традиционной схемы, когда все процессы делят одну и ту же шину ввода-вывода, в технологии VCM каждый из них использует виртуальную шину. Организованное на уровне чипа взаимодействие виртуальных шин и реальной шины позволяет достичь прироста производительности системы до 25 %.
Чтобы при одновременном обращении к памяти нескольких процессов не снизилась производительность, число каналов доведено до 16 по 1024 бита каждый (в модулях по 256 Мбайт каждый канал может передавать до 2048 бит). Работает VC SDRAM при частоте до 143 МГц. Тип корпуса — стандартный, совместимый по контактам и набору команд с SDRAM.
Active Link — разработка NEC, которая нагружает DRAM новыми функциями — архивация (сжатие информации) в основной памяти. Чтобы не загружать рутинной работой процессор, функция компрессии/декомпрессии возлагается на сам чип DRAM. В результате несколько расширилось обрамление кристалла, но налицо двойной выигрыш — нужна меньшая по количеству ячеек микросхема DRAM, и доступ к информации происходит быстрее, чем обычно. Поскольку все больше информации в компьютерах имеет мультимедийную природу, можно выбрать соответствующий алгоритм компрессии. По утверждению NEC, видеоданные сжимаются в чипе ActiveLink в 4 раза.
IRAM (Intellectual Random Access Memory). Главная идея IRAM — в размещении процессора и DRAM в одном чипе. Это дает возможность чтения и записи данных длинными словами (от 128 до 16 384 бит), обеспечивая повышение пропускной способности памяти. Раньше это было невозможно — все упиралось в неприемлемо большое число выводов микросхемы. Средняя скорость RAC/CAS равна приблизительно 10—30 не для модулей 64—256 Мбайт IRAM. При этом снижается энергопотребление и уменьшается площадь, занимаемая микросхемами памяти.
Магнитная оперативная память. Надо заметить, что первые образцы ОЗУ были выполнены на кольцевых магнитных ферритовых сердечниках, нанизанных на адресные и информационные шины (провода). Емкость таких ЗУ не превосходила 64 Кбайт. В последующем длительный период времени устройства ОЗУ выполнялись на кремниевых полупроводниковых элементах.
В 2000 г. IBM и Infineon Technologies AG (ФРГ) объявили программу разработки MRAM (Magnetic Random Access Memory).
Принцип организации элементов памяти — магнитная среда, заключенная между слоями металла.
Преимущества технологии — высокая емкость, скорость, низкая стоимость, возможность применения как в форме статической, так и динамической памяти, более низкое энергопотребление.
За последнюю неделю дважды объяснял людям как организована работа с памятью в х86, с целью чтобы не объяснять в третий раз написал эту статью.
И так, чтобы понять организацию памяти от вас потребуется знания некоторых базовых понятий, таких как регистры, стек и тд. Я по ходу попробую объяснить и это на пальцах, но очень кратко потому что это не тема для этой статьи. Итак начнем.
Как известно программист, когда пишет программы работает не с физическим адресом, а только с логическим. И то если он программирует на ассемблере. В том же Си ячейки памяти от программиста уже скрыты указателями, для его же удобства, но если грубо говорить указатель это другое представление логического адреса памяти, а в Java и указателей нет, совсем плохой язык. Однако грамотному программисту не помешают знания о том как организована память хотя бы на общем уровне. Меня вообще очень огорчают программисты, которые не знают как работает машина, обычно это программисты Java и прочие php-парни, с квалификацией ниже плинтуса.
Так ладно, хватит о печальном, переходим к делу.
Рассмотрим адресное пространство программного режима 32 битного процессора (для 64 бит все по аналогии)
Адресное пространство этого режима будет состоять из 2^32 ячеек памяти пронумерованных от 0 и до 2^32-1.
Программист работает с этой памятью, если ему нужно определить переменную, он просто говорит ячейка памяти с адресом таким-то будет содержать такой-то тип данных, при этом сам програмист может и не знать какой номер у этой ячейки он просто напишет что-то вроде:
int data = 10;
компьютер поймет это так: нужно взять какую-то ячейку с номером стопицот и поместить в нее цело число 10. При том про адрес ячейки 18894 вы и не узнаете, он от вас будет скрыт.
Все бы хорошо, но возникает вопрос, а как компьютер ищет эту ячейку памяти, ведь память у нас может быть разная:
3 уровень кэша
2 уровень кэша
1 уровень кэша
основная память
жесткий диск
Это все разные памяти, но компьютер легко находит в какой из них лежит наша переменная int data.
Этот вопрос решается операционной системой совместно с процессором.
Вся дальнейшая статья будет посвящена разбору этого метода.
Архитектура х86 поддерживает стек.
Стек это непрерывная область оперативной памяти организованная по принципу стопки тарелок, вы не можете брать тарелки из середины стопки, можете только брать верхнюю и класть тарелку вы тоже можете только на верх стопки.
В процессоре для работы со стеком организованны специальные машинные коды, ассемблерные мнемоники которых выглядят так:
push operand
помещает операнд в стек
pop operand
изымает из вершины стека значение и помещает его в свой операнд
Стек в памяти растет сверху вниз, это значит что при добавлении значения в него адрес вершины стека уменьшается, а когда вы извлекаете из него, то адрес вершины стека увеличивается.
Теперь кратко рассмотрим что такое регистры.
Это ячейки памяти в самом процессоре. Это самый быстрый и самый дорогой тип памяти, когда процессор совершает какие-то операции со значением или с памятью, он берет эти значения непосредственно из регистров.
В процессоре есть несколько наборов логик, каждая из которых имеет свои машинные коды и свои наборы регистров.
Basic program registers (Основные программные регистры) Эти регистры используются всеми программами с их помощью выполняется обработка целочисленных данных.
Floating Point Unit registers (FPU) Эти регистры работают с данными представленными в формате с плавающей точкой.
Еще есть MMX и XMM registers эти регистры используются тогда, когда вам надо выполнить одну инструкцию над большим количеством операндов.
Рассмотрим подробнее основные программные регистры. К ним относятся восемь 32 битных регистров общего назначения: EAX, EBX, ECX, EDX, EBP, ESI, EDI, ESP
Для того чтобы поместить в регистр данные, или для того чтобы изъять из регистра в ячейку памяти данные используется команда mov:
mov eax, 10
загружает число 10 в регистр eax.
mov data, ebx
копирует число, содержащееся в регистре ebx в ячейку памяти data.
Регистр ESP содержит адрес вершины стека.
Кроме регистров общего назначения, к основным программным регистрам относят шесть 16битных сегментных регистров: CS, DS, SS, ES, FS, GS, EFLAGS, EIP
EFLAGS показывает биты, так называемые флаги, которые отражают состояние процессора или характеризуют ход выполнения предыдущих команд.
В регистре EIP содержится адрес следующей команды, которая будет выполнятся процессором.
Я не буду расписывать регистры FPU, так как они нам не понадобятся. Итак наше небольшое отступление про регистры и стек закончилось переходим обратно к организации памяти.
Как вы помните целью статьи является рассказ про преобразование логической памяти в физическую, на самом деле есть еще промежуточный этап и полная цепочка выглядит так:
Логический адрес --> Линейный (виртуальный)--> Физический
Все линейное адресное пространство разбито на сегменты. Адресное пространство каждого процесса имеет по крайней мере три сегмента:
Сегмент кода. (содержит команды из нашей программы, которые будут исполнятся.)
Сегмент данных. (Содержит данные, то бишь переменные)
Сегмент стека, про который я писал выше.
Линейный адрес вычисляется по формуле:
линейный адрес=Базовый адрес сегмента(на картинке это начало сегмента) + смещение
Сегмент кода
Базовый адрес сегмента кода берется из регистра CS. Значение смещения для сегмента кода берется из регистра EIP, в котором хранится адрес инструкции, после исполнения которой, значение EIP увеличивается на размер этой команды. Если команда занимает 4 байта, то значение EIP увеличивается на 4 байта и будет указывать уже на следующую инструкцию. Все это делается автоматически без участия программиста.
Сегментов кода может быть несколько в нашей памяти. В нашем случае он один.
Сегмент данных
Данные загружаются в регистры DS, ES, FS, GS
Это значит что сегментов данных может быть до 4х. На нашей картинке он один.
Смещение внутри сегмента данных задается как операнд команды. По дефолту используется сегмент на который указывает регистр DS. Для того чтобы войти в другой сегмент надо это непосредственно указать в команде префикса замены сегмента.
Сегмент стека
Используемый сегмент стека задается значением регистра SS.
Смещение внутри этого сегмента представлено регистром ESP, который указывает на вершину стека, как вы помните.
Сегменты в памяти могут друг друга перекрывать, мало того базовый адрес всех сегментов может совпадать например в нуле. Такой вырожденный случай называется линейным представлением памяти. В современных системах, память как правило так организована.
Теперь рассмотрим определение базовых адресов сегмента, я писал что они содержаться в регистрах SS, DS, CS, но это не совсем так, в них содержится некий 16 битный селектор, который указывает на некий дескриптор сегментов, в котором уже хранится необходимый адрес.
Так выглядит селектор, в тринадцати его битах содержится индекс дескриптора в таблице дескрипторов. Не хитро посчитать будет что 2^13 = 8192 это максимальное количество дескрипторов в таблице.
Вообще дескрипторных таблиц бывает два вида GDT и LDT Первая называется глобальная таблица дескрипторов, она в системе всегда только одна, ее начальный адрес, точнее адрес ее нулевого дескриптора хранится в 48 битном системном регистре GDTR. И с момента старта системы не меняется и в свопе не принимает участия.
А вот значения дескрипторов могут меняться. Если в селекторе бит TI равен нулю, тогда процессор просто идет в GDT ищет по индексу нужный дескриптор с помощью которого осуществляет доступ к этому сегменту.
Пока все просто было, но если TI равен 1 тогда это означает что использоваться будет LDT. Таблиц этих много, но использоваться в данный момент будет та селектор которой загружен в системный регистр LDTR, который в отличии от GDTR может меняться.
Индекс селектора указывает на дескриптор, который указывает уже не на базовый адрес сегмента, а на память в котором хранится локальная таблица дескрипторов, точнее ее нулевой элемент. Ну а дальше все так же как и с GDT. Таким образом во время работы локальные таблицы могут создаваться и уничтожаться по мере необходимости. LDT не могут содержать дескрипторы на другие LDT.
Итак мы знаем как процессор добирается до дескриптора, а что содержится в этом дескрипторе посмотрим на картинке:
Дескрипторы состоит из 8 байт.
Биты с 15-39 и 56-63 содержат линейный базовый адрес описываемым данным дескриптором сегмента. Напомню нашу формулу для нахождения линейного адреса:
линейный адрес = базовый адрес + смещение
[база; база+предел)
В зависимости от 55 G-бита(гранулярити), предел может измеряться в байтах при нулевом значении бита и тогда максимальный предел составит 1 мб, или в значении 1, предел измеряется страницами, каждая из которых равна 4кб. и максимальный размер такого сегмента будет 4Гб.
Для сегмента стека предел будет в интервале:
(база+предел; вершина]
Кстати интересно почему база и предел так рвано располагаются в дескрипторе. Дело в том что процессоры х86 развивались эволюционно и во времена 286х дескрипторы были по 8 бит всего, при этом старшие 2 байта были зарезервированы, ну а в последующих моделях процессоров с увеличением разрядности дескрипторы тоже выросли, но для сохранения обратной совместимости пришлось оставить структуру как есть.
Значение адреса «вершина» зависит от 54го D бита, если он равен 0, тогда вершина равна 0xFFF(64кб-1), если D бит равен 1, тогда вершина равна 0xFFFFFFFF (4Гб-1)
С 41-43 бит кодируется тип сегмента.
000 — сегмент данных, только считывание
001 — сегмент данных, считывание и запись
010 — сегмент стека, только считывание
011 — сегмент стека, считывание и запись
100 — сегмент кода, только выполнение
101- сегмент кода, считывание и выполнение
110 — подчиненный сегмент кода, только выполнение
111 — подчиненный сегмент кода, только выполнение и считывание
44 S бит если равен 1 тогда дескриптор описывает реальный сегмент оперативной памяти, иначе значение S бита равно 0.
Самым важным битом является 47-й P бит присутствия. Если бит равен 1 значит, что сегмент или локальная таблица дескрипторов загружена в оперативку, если этот бит равен 0, тогда это означает что данного сегмента в оперативке нет, он находится на жестком диске, случается прерывание, особый случай работы процессора запускается обработчик особого случая, который загружает нужный сегмент с жесткого диска в память, если P бит равен 0, тогда все поля дескриптора теряют смысл, и становятся свободными для сохранения в них служебной информации. После завершения работы обработчика, P бит устанавливается в значение 1, и производится повторное обращение к дескриптору, сегмент которого находится уже в памяти.
На этом заканчивается преобразование логического адреса в линейный, и я думаю на этом стоит прерваться. В следующий раз я расскажу вторую часть преобразования из линейного в физический.
А так же думаю стоит немного поговорить о передачи аргументов функции, и о размещении переменных в памяти, чтобы была какая-то связь с реальностью, потому размещение переменных в памяти это уже непосредственно, то с чем вам приходится сталкиваться в работе, а не просто какие-то теоретические измышления для системного программиста. Но без понимания, как устроена память невозможно понять как эти самые переменные хранятся в памяти.
В общем надеюсь было интересно и до новых встреч.
Пользовательские регистры. Они называются так потому, что программист может использовать их при написании своих программ. К этим регистрам относятся:
1) восемь 32-битных регистров, которые могут использоваться программистами для хранения данных и адресов (их еще называют регистрами общего назначения -РОН):
1.1) eax – 32 бита/ ax – 16 бит/ ah/ al – по 8 бит;
1.2) ebx – 32 бита/ bx – 16 бит/ bh/ bl – по 8 бит;
1.3) edx – 32 бита/ dx – 16 бит/ dh/ dl – по 8 бит;
1.4) ecx – 32 бита/ cx – 16 бит/ ch/ cl – по 8 бит;
1.5) ebp – 32 бита/ bp – 16 бит;
1.6) esi – 32 бита/ si – 16 бит;
1.7) edi – 32 бита/di – 16 бит;
1.8) esp – 32 бита/ sp – 16 бит.
2) шесть регистров сегментов: cs, ds, ss, es, fs, gs по 16 бит;
3) регистры состояния и управления:
3.1) регистр флагов eflags – 32 бита/ flags – 16 бит;
3.2) регистр указателя команды eip – 32 бита/ ip – 16 бит.
Микропроцессоры i486 и Pentium имеют в основном 32-разрядные регистры. Их количество, за исключением сегментных регистров, такое же, как и у i8086, но размерность больше, что и отражено в их обозначениях — они имеют приставку e (Extended).
Перечислим регистры, относящиеся к группе регистров общего назначения. Так как эти регистры физически находятся в микропроцессоре внутри арифметико-логического устройства (АЛУ), то их еще называют регистрами АЛУ:
1) eax/ax/ah/al (Accumulator register) — аккумулятор. Применяется для хранения промежуточных данных. В некоторых командах использование этого регистра обязательно. Например, при выполнении операций умножения и деления используется для хранения первого числа, участвующего в операции, и результата операции после ее завершения.
2) ebx/bx/bh/bl (Base register) — базовый регистр. Применяется для хранения базового адреса некоторого объекта в памяти (например, массивов).
3) ecx/cx/ch/cl (Count register) — регистр-счетчик. Применяется в командах, производящих некоторые повторяющиеся действия. Его использование зачастую неявно и скрыто в алгоритме работы соответствующей команды. К примеру, команда организации цикла loop кроме передачи управления команде, находящейся по некоторому адресу, анализирует и уменьшает на единицу значение регистра ecx/cx;
4) edx/dx/dh/dl (Data register) — регистр данных. Так же, как и регистр eax/ax/ah/al, он хранит промежуточные данные. В некоторых командах его использование обязательно; для некоторых команд это происходит неявно. Используется как расширение регистра- аккумулятора при работе с 32- разрядными чмслами.
Следующие два регистра используются для поддержки цепочечных операций, то есть операций, производящих последовательную обработку цепочек элементов, каждый из которых может иметь длину 32, 16 или 8 бит:
1) esi/si (Source Index register) — индекс источника. Этот регистр в цепочечных операциях содержит текущий адрес элемента в цепочке-источнике;
2) edi/di (Destination Index register) — индекс приемника (получателя). Этот регистр в цепочечных операциях содержит текущий адрес в цепочке-приемнике.
В архитектуре микропроцессора на программно-аппаратном уровне поддерживается такая структура данных, как стек. Для работы со стеком в системе команд микропроцессора есть специальные команды, а в программной модели микропроцессора для этого существуют специальные регистры:
1) esp/sp (Stack Pointer register) — регистр указателя стека. Содержит указатель вершины стека в текущем сегменте стека.
2) ebp/bp (Base Pointer register) — регистр указателя базы начального адреса поля памяти, непосредственно отведенного под стек. Предназначен для организации произвольного доступа к данным внутри стека.
Большинство из перечисленных регистров могут использоваться при программировании для хранения операндов практически в любых сочетаниях. Но некоторые команды используют фиксированные регистры для выполнения своих действий. Это нужно обязательно учитывать.
В программной модели микропроцессора имеется шесть сегментных регистров: cs, ss, ds, es, gs, fs. Фактически в этих регистрах содержатся адреса памяти? с которых начинаются соответствующие сегменты. Логика обработки машинной команды построена так, что при выборке команды, доступе к данным программы или к стеку неявно используются адреса во вполне определенных сегментных регистрах. Микропроцессор поддерживает следующие типы сегментов:
1) Сегмент кода. Содержит команды программы. Для доступа к этому сегменту служит регистр cs (code segment register) — сегментный регистр кода. Он содержит адрес сегмента с машинными командами, к которому имеет доступ микропроцессор (то есть, эти команды загружаются в конвейер микропроцессора).
2) Сегмент данных. Содержит обрабатываемые программой данные. Для доступа к этому сегменту служит регистр ds (data segment register) — сегментный регистр данных, который хранит адрес сегмента данных текущей программы.
3) Сегмент стека. Этот сегмент представляет собой область памяти, называемую стеком. Работу со стеком микропроцессор организует по следующему принципу: последний записанный в эту область элемент выбирается первым. Для доступа к этому сегменту служит регистр ss (stack segment register) — сегментный регистр стека, содержащий адрес сегмента стека.
4) Дополнительный сегмент данных. Неявно алгоритмы выполнения большинства машинных команд предполагают, что обрабатываемые ими данные расположены в сегменте данных, адрес которого находится в сегментном регистре ds. Если программе недостаточно одного сегмента данных, то она имеет возможность использовать еще три дополнительных сегмента данных. Но в отличие от основного сегмента данных, адрес которого содержится в сегментном регистре ds, при использовании дополнительных сегментов данных их адреса требуется указывать явно с помощью специальных префиксов переопределения сегментов в команде. Адреса дополнительных сегментов данных должны содержаться в регистрах es, gs, fs (extension data segment registers).
В микропроцессор включены несколько регистров, которые постоянно содержат информацию о состоянии, как самого микропроцессора, так и программы, команды которой в данный момент загружены на конвейер. К этим регистрам относятся:
1) регистр флагов eflags/flags;
2) регистр указателя команды eip/ip.
Младшая часть регистра eflags полностью аналогична регистру flags (слово состояния процессора, описанного выше) для i8086.
Регистр eip/ip содержит смещение следующей подлежащей выполнению команды относительно содержимого сегментного регистра cs в текущем сегменте команд. Этот регистр непосредственно недоступен программисту, но загрузка и изменение его значения производятся различными командами управления, к которым относятся команды условных и безусловных переходов, вызова процедур и возврата из процедур. Возникновение прерываний также приводит к модификации регистра eip/ip.
Перейдем к рассмотрению основных команд язык ассемблера, необходимых для выполнения лабораторных работ.
Команды языка ассемблера
В персональных ЭВМ форматы команд достаточно разнообразны. Имеются команды с одним или двумя операндами.
1) формат команды “регистр — регистр” (2 байта);
2) формат команды “регистр — память” (2 — 4 байта);
3) формат команды “регистр — непосредственный операнд” (3 — 4 байта);
4) формат команды “память- непосредственный операнд” (3-6 байтов).
Команды передачи данных
Предназначены для пересылок данных, адресов и непосредственных операндов в регистры или в ячейки памяти. Их описание представлено в таблице 4.2.
Таблица 4.2 — Формат команд передачи данных
Название команды | Мнемоника и формат команды | Описание действия |
Передать | MOV DST,SRC | (DST)(SRC) |
Загрузить эффективный адрес | LEA DST,SRC | (REG) (SRC) |
Загрузить в DS указатель | LDS DST,SRC | (REG) (SRC)(DS) (SRC+2) |
Загрузить в ES указатель | LES DST,SRC | (REG) (SRC)(ES) (SRC+2) |
Обменять | XCHG OPR1,OPR2 | (OPR1) (OPR2) |
Ни один из флажков не изменяется. Что касается режимов адресации, то получатель не может быть непосредственным и не может быть CS. В командах LEA, LES, LDS операнд REG не может быть сегментным регистром, а источник не может иметь непосредственный или регистровый режим. В команде MOV один из операндов должен быть регистром. В команде XCHG хотя бы один из операндов должен быть регистром, но ни один из операндов не может быть сегментным регистром.
Статьи к прочтению:
Hackerdom-10-03 Регистры процессоров
Похожие статьи:
Intel Pentium Dual-Core Mobile T4500 — AW80577GG0521MA Процессор » Intel » Pentium Dual-Core семей » Pentium Dual-Core Mobile » T4500 Семья Intel Pentium…
Счетчик команд– адрес текущей выполняемой или прерванной команды процессора. Таблица состояния устройств– таблица, хранимая и используемая операционной…
Читайте также: