Виды адресации в оперативной памяти
Адрес памяти (англ. Memory adress ) - это понятие данных, используемых программно-аппаратными средствами для получения доступа к требуемому участку памяти компьютера. Адрес памяти представляет собой последовательность цифр фиксированной длины, которые, обычно, отображаются и обрабатываются как целые числа. Причиной такой формы записи являются особенности CPU (такие как программный счетчик и возрастающие регистры адреса(ячейки) памяти), а также использование памяти как массива, поддерживаемого различными языками программирования.
Схемы адресации
Компьютерная программа может обращаться к адресу, указанному явным образом - в низкоуровневом программировании его обычно называют абсолютным адресом или иногда конкретным адресом, он известен как указатель в языках более высокого уровня. Но программа также может использовать относительный адрес, который указывает местоположение по отношению к другому месту (базовому адресу). Также существует много других способов косвенной адресации.
Логический адрес
Без знания номера и параметров сегмента, в котором указан эффективный адрес, последний бесполезен. Сам сегмент выбирается ещё одним числом, именуемым селектором. Пара чисел, записываемая как selector:offset , получила имя логический адрес. Так как активные селекторы хранятся в группе специальных регистров, чаще всего вместо первого числа в паре записывается имя регистра, например, ds:0x11223344.
Здесь обычно у тех, кто столкнулся с этими понятиями впервые, голова начинает идти кругом. Несколько упростить (или усложнить) ситуацию помогает тот факт, что почти всегда выбор селектора (и связанного с ним сегмента) делается исходя из «смысла» доступа. По умолчанию, если в кодировке машинной инструкции не сказано иного, для получения адресов кода используются логические адреса с селектором CS, для данных — с DS, для стека — с SS.
Гостевой физический
До введения возможностей аппаратной виртуализации в процессорах Intel страничное преобразование было последним в цепочке. Когда же на одной системе работают несколько виртуальных машин, то физические адреса, получаемые в каждой из них, приходится транслировать ещё один раз. Это можно делать программным образом, или же аппаратно, если процессор поддерживает функциональность EPT (англ. Extended Page Table). Адрес, раньше называвшийся физическим, был переименован в гостевой физический для того, чтобы отличать его от настоящего физического. Они связаны с помощью EPT-преобразования. Алгоритм последнего схож с ранее описанным страничным преобразованием: набор связанных таблиц с общим корнем, последний уровень которых определяет, существует ли физическая страница для указанной гостевой физической.
Эффективный адрес
Эффективный адрес — это начало пути. Он задаётся в аргументах индивидуальной машинной инструкции, и вычисляется из значений регистров, смещений и масштабирующих коэффициентов, заданных в ней явно или неявно.
Например, для инструкции (ассемблер в AT&T-нотации)
addl %eax, 0x11(%ebp, %edx, 8)
эффективный адрес операнда-назначения будет вычислен по формуле:
eff_addr = EBP + EDX * 8 + 0x11
Виртуальные адреса
В литературе и в документации других архитектур встречается ещё один термин — виртуальный адрес. Он не используется в документации Intel на IA-32, однако встречается, например, в описании Intel® Itanium, в котором сегментация не используется. Можно смело считать, что для IA-32 виртуальный == линейный. В советской литературе по вычислительной технике этот вид адресов также именовался математическим.
Модели памяти в х86 архитектуре
Старые компьютеры x86 использовали сегментированные адреса модели памяти на основе комбинации двух чисел: сегмента памяти и смещения внутри этого сегмента. Некоторые сегменты неявно трактовались как сегменты кода, предназначенные для команд, сегментов стека или обычных сегментов данных. Хотя использование было разным, сегменты не имели какой-либо защиты памяти. В плоской модели памяти все сегменты (сегментные регистры) обычно устанавливаются в ноль, и только смещения являются переменными.
За последнюю неделю дважды объяснял людям как организована работа с памятью в х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, и производится повторное обращение к дескриптору, сегмент которого находится уже в памяти.
На этом заканчивается преобразование логического адреса в линейный, и я думаю на этом стоит прерваться. В следующий раз я расскажу вторую часть преобразования из линейного в физический.
А так же думаю стоит немного поговорить о передачи аргументов функции, и о размещении переменных в памяти, чтобы была какая-то связь с реальностью, потому размещение переменных в памяти это уже непосредственно, то с чем вам приходится сталкиваться в работе, а не просто какие-то теоретические измышления для системного программиста. Но без понимания, как устроена память невозможно понять как эти самые переменные хранятся в памяти.
В общем надеюсь было интересно и до новых встреч.
Мне периодически приходится объяснять разным людям некоторые аспекты архитектуры Intel® IA-32, в том числе замысловатость системы адресации данных в памяти, которая, похоже, реализовала почти все когда-то придуманные идеи. Я решил оформить развёрнутый ответ в этой статье. Надеюсь, что он будет полезен ещё кому-нибудь.
При исполнении машинных инструкций считываются и записываются данные, которые могут находиться в нескольких местах: в регистрах самого процессора, в виде констант, закодированных в инструкции, а также в оперативной памяти. Если данные находятся в памяти, то их положение определяется некоторым числом — адресом. По ряду причин, которые, я надеюсь, станут понятными в процессе чтения этой статьи, исходный адрес, закодированный в инструкции, проходит через несколько преобразований.
На рисунке — сегментация и страничное преобразование адреса, как они выглядели 27 лет назад. Иллюстрация из Intel 80386 Programmers's Reference Manual 1986 года. Забавно, что в описании рисунка есть аж две опечатки: «80306 Addressing Machanism». В наше время адрес подвергается более сложным преобразованиям, а иллюстрации больше не делают в псевдографике.
Начнём немного с конца — с цели всей цепочки преобразований.
Модели памяти
Многие программисты предпочитают адресовать память таким образом, чтобы не было различий между пространством кода и пространством данных, а также физической и виртуальной памятью, другими словами, численно идентичные указатели относятся к точно одному и тому же байту ОЗУ.
Однако многие старые компьютеры не поддерживали плоскую модель памяти - в частности, аппараты архитектуры Harvard вынуждали память с командами полностью отделяться от памяти с данными. Многие современные DSP(digital signal processor) (такие как Motorola 56000) имеют три отдельные области хранения - хранение программ, хранение коэффициентов и хранение данных. Некоторые часто используемые команды извлекаются из всех трех областей одновременно - меньшее количество областей хранения (даже если бы были одинаковые общие байты памяти) приводило бы к замедлению выполнения этих команд.
Эффективные адреса
Эффективный адрес — это начало пути вычисления физического адреса. Он задаётся в аргументах индивидуальной машинной инструкции, и вычисляется из значений регистров, смещений и масштабирующих коэффициентов, заданных в ней явно или неявно.
Типы адресов памяти
Размер слова в зависимости от размера адреса
Размер слова является характеристикой для данной архитектуры компьютера. Он обозначает количество цифр, которое процессор может обрабатывать за один раз. Современные процессоры, включая встроенные системы, обычно имеют размер слова 8, 16, 24, 32 или 64 бита; Большинство современных компьютеров общего назначения используют 32 или 64 бита. В истории же использовалось много различных вариантов, включая 8, 9, 10, 12, 18, 24, 36, 39, 40, 48 и 60 бит.
Очень часто, когда речь идет о размере слова современного компьютера, также оценивается размер адресного пространства на этом компьютере. Например, компьютер, называемый «32-битным», также обычно разрешает 32-разрядные адреса памяти; 32-разрядный компьютер с байтовой адресацией может адресовать 2^32 = 4,294,967,296 байт памяти или 4 гибибайта (GB). Это позволяет эффективно хранить адрес памяти одним словом.
Теоретически современные 64-разрядные компьютеры с байтовой адресацией могут адресовать 2 64 байта, но на практике объем памяти ограничен процессором, контроллером памяти или особенностями печатной платы (например, количеством разъемов физической памяти или количеством паяемой памяти).
Страничное преобразование
Следующее после сегментации преобразование адресов: линейный → физический — имеет множество вариаций в своём алгоритме, в зависимости от того, в каком режиме (32-битном, PAE или 64-битном) находится процессор.
Примечательно, сколько различных бит из разных системных регистров процессора влияют на процесс страничного преобразования в настоящее время. Я просмотрел свежую сентябрьскую редакцию Intel SDM [1], и вот полный список: CR0.WP, CR0.PG, CR4.PSE, CR4.PAE, CR4.PGE, CR4.PCIDE, CR4.SMEP, CR4.SMAP, IA32_EFER.LME, IA32_EFER.NXE, EFLAGS.AC.
Однако общая идея всегда одна и та же: линейный адрес разбивается на несколько частей, каждая из которых служит индексом в одной из системных таблиц, хранящихся в памяти. Записи в таблицах — это адреса начала таблицы следующего уровня или, для последнего уровня — искомая информация о физическом адресе страницы в памяти и её свойствах. Самые младшие биты не преобразуются, а используются для адресации внутри найденной страницы. Например, для режима PAE с размером страниц 4 кбайт преобразование выглядит так:
В разных режимах процессора различается число и ёмкость этих таблиц. Преобразование может завершиться неудачей, если очередная таблица не содержит валидных данных, или права доступа, хранящиеся в последней из них, запрещают доступ к странице; например, при записи в регионы, помеченные как «только для чтения», или попытке чтения памяти ядра из непривилегированного процесса.
Физический адрес
Конечный результат всех преобразований других типов адресов, перечисленных далее в этой статье — физический адрес. На нём кончается работа внутри центрального процессора по преобразованию адресов.
На самом деле, легко понять, что это ещё не конец. В платформе, которая должна обработать запрос данных от процессора, может быть несколько чипов DRAM, имеющих собственную структуру разбиения на блоки, а также различные периферийные устройства, отображённые на общее пространство физической памяти. Дальнейший путь транзакции с некоторым физическим адресом будет зависеть от конфигурации нескольких декодеров, находящихся на её пути внутри устройств платформы.
Единица измерения адреса
Некоторые старые компьютеры (десятичные компьютеры) были десятизначными с цифровой адресацией. Например, каждый адрес в магнитной памяти IBM 1620 идентифицировал одну шестиразрядную двоично-кодированную десятичную цифру, состоящую из бита четности, бита флага и четырех числовых битов. В 1620 использовались пятизначные десятичные адреса, поэтому в теории максимально возможный адрес был 99,999. На практике CPU поддерживал 20000 ячеек памяти и мог добавить до двух дополнительных модулей внешней памяти, каждый из которых поддерживает 20 000 адресов, в общей сложности 60 000 (00000-59999).
Логические адреса
Без знания номера и параметров сегмента, в котором указан эффективный адрес, последний бесполезен. Сам сегмент выбирается ещё одним числом, именуемым селектором. Пара чисел, записываемая как selector:offset, получила имя логический адрес. Так как активные селекторы хранятся в группе специальных регистров, чаще всего вместо первого числа в паре записывается имя регистра, например, ds:0x11223344 [Источник 3] . В старых компьютерах логические и физические адреса были согласованы, но с момента появления виртуальной памяти у большинства прикладных программ нет информации о физических адресах. Скорее, они адресуют логические адреса [Источник 4] или виртуальные адреса, используя блок управления памятью компьютера и отображение памяти операционной системы.
Содержание
Физические адреса
Память цифрового компьютера (или основная память) состоит из множества ячеек памяти, каждая из которых имеет физический адрес. [Источник 1] - код, который центральный процессор (или другое устройство) может использовать для доступа к ней. Как правило, только системное программное обеспечение, то есть BIOS [Источник 2] , операционные системы, и некоторые специализированные вспомогательные программы (например, тестеры памяти), обращаются к физической памяти с использованием операторов машинного кода и регистров процессора, Инструктируя CPU направлять аппаратное устройство, называемое контроллером памяти, использовать шину памяти или системную шину или отдельные управляющие, адресные и информационные шины для выполнения команд программы. Шина контроллеров памяти состоит из нескольких параллельных линий, каждая из которых представлена двоичной цифрой (бит). Ширина шины и, следовательно, количество адресуемых единиц хранения и количество битов в каждой единице варьируется среди компьютеров. Физический адрес - это конечный результат всех преобразований других типов адресов, перечисленных далее. На нём кончается работа внутри центрального процессора по преобразованию адресов.
Линейные адреса
Эффективный адрес — это смещение от начала сегмента — его базы. Если сложить базу и эффективный адрес, то получим число, называемое линейным адресом:
lin_addr = segment.base + eff_addr
Преобразование логический → линейный не всегда может быть успешным, так как при его исполнении проверяется несколько условий на свойства сегмента, записанных в полях его дескриптора. Например, проверяется выход за границы сегмента и права доступа.
Адресное пространство в программировании приложений
В современной многозадачной среде процессы приложений обычно имеют в своем адресном пространстве (или пространствах) куски памяти следующих типов:
- Машинный код, в том числе:
- Собственный код программы;
- Совместно используемые библиотеки.
- Инициализированные данные;
- Неинициализированные (но выделенные) переменные;
- Стек для переменных исполняемой программы;
- Куча;
- Совместно используемая память и отображенные в память файлы.
Некоторые части адресного пространства могут вообще не отображаться.
Линейный адрес
Эффективный адрес — это смещение от начала сегмента — его базы. Если сложить базу и эффективный адрес, то получим число, называемое линейным адресом:
lin_addr = segment.base + eff_addr
Преобразование логический → линейный не всегда может быть успешным, так как при его исполнении проверяется несколько условий на свойства сегмента, записанных в полях его дескриптора. Например, проверяется выход за границы сегмента и права доступа.
Описанное выше верно при включенной сегментации. В 16-битном реальном режиме смысл селекторов другой, они хранят только базу, а преобразование не осуществляет сегментных проверок. Фактически, обозначения CS, DS, FS, GS, ES, SS имеют совершенно разный смысл в этих двух режимах, что добавляет путаницы.
Сегментация была модной на некотором этапе развития вычислительной техники. В настоящее она почти всюду была заменена другими механизмами, и используется только для специфических задач. Так, в режиме IA-32e (64-битном) только два сегмента могут иметь ненулевую базу. Для остальных четырёх в этом режиме всегда линейный адрес == эффективный.
Что такое виртуальный адрес?
В литературе и в документации других архитектур встречается ещё один термин — виртуальный адрес. Он не используется в документации Intel на IA-32, однако встречается, например, в описании Intel® Itanium, в котором сегментация не используется. Можно смело считать, что для IA-32 виртуальный == линейный.
В советской литературе по вычислительной технике этот вид адресов также именовался математическим.Полная картина
Я попытался собрать все преобразования адреса в одну иллюстрацию. В ней преобразования обозначены стрелками, типы адресов обведены в рамки.
Как уже было сказано выше, каждое из преобразований может вернуть ошибку для адресов, не имеющих представления в следующем по цепочке виде. Устранение подобных проблем — это задача операционных систем и мониторов виртуальных машин, реализующих абстракцию виртуальной памяти.
Содержание отдельной ячейки памяти
Каждая ячейка памяти на компьютере с хранимой программой хранит двоичное число или десятичное число некоторого типа. Эти числа определяются как данные или как команды, а их использование определяется командами, которые извлекают и взаимодействуют с ними. Некоторые «ранние» программисты сочетали команды и данные в словах как способ сэкономить память: «Манчестер-Марк-1» имел место в своих 40-битных словах для хранения нескольких бит данных - его процессор игнорировал небольшую секцию в середине слова - и это часто использовалось как эксплойт для хранения дополнительных данных. Самовоспроизводящиеся программы, такие как вирусы, иногда рассматривают себя как данные, а иногда как команды. Самовоспроизводящийся код в настоящее время устаревает, поскольку его тестирование и техническое обслуживание непропорционально сложно для экономии нескольких байт, а также он может выдавать неверные результаты из-за предположений компилятора или процессора относительно состояния машины, но все же он иногда используется намеренно, с большой осторожностью.
Заключение
Эволюция, что в природе, что в технике — странная вещь. Она порождает неожиданные структуры, необъяснимые с точки зрения рационального проектирования. Её творения полны атавизмов, правила их поведения иногда почти полностью состоят из исключений. Для того, чтобы понять работу такой системы, часто требуется прокрутить её эволюцию с самого начала, и под нагромождениями всех слоёв найти истину в виде принципа: «ничего не выбрасывать». Я склонен считать архитектуру IA-32 замечательным примером эволюционного развития.Вскоре после завершения написания этой статьи я натолкнулся на презентацию об архитектуре IBM System z, которая примечательна в том числе своей долгой и интересной историей поддержки виртуализации. В этом документе нашлось перечисление всех типов адресов памяти, используемых в System z:
Система адресации обеспечивает в МП устройствах доступ к операндам, хранящимся в устройствах памяти, внутренних программно- доступных регистрах и внешних устройствах через порты ввода/вывода. Длина формата команды (общее количество бит в коде команды) определяет скорость выполнения команды и зависит от способа адресации операндов. Способы адресации играют большую роль в организации управления ходом выполнения программы, во многом определяют скорость обработки информации. Существуют следующие основные способы адресации:
Прямая адресация – исполнительный адрес размещается в адресном поле команды. В этом способе непосредственно используется счетчик команд и аккумулятор МП. При прямой адресации содержимое счетчика команд передается на ША и из адресуемой ячейки выбирается очередная команда, поступающая в устройство управления МП. С помощью прямой адресации в АЛУ может вызываться и операнд. Для этого на ША передается адрес ячейки памяти, содержащийся в команде. При необходимости изменения последовательного порядка выполнения программы адресуется ячейка памяти, содержащая адрес условного или безусловного перехода. Команда, содержащая прямой адрес, занимает 2-3 ячейки памяти, что соответственно требует и 2-3 обращений к памяти. Еще одно обращение может потребоваться для непосредственного вызова операнда.
С использованием прямой адресации могут быть загружены только аккумулятор и регистры выделенные для хранения косвенного адреса (в МП типа К580, i - 8080 и 8085 это регистровая пара Н). В современных микроконтроллерах для косвенной адресации обычно используется несколько регистровых пар.
Пример: LDA 0A00- эта команда загружает аккумулятор (регистр А) содержимым ячейки памяти 0А00. Формат этой команды:
3A 0A Код операции LDA Младший байт адреса Старший байт адреса Преимущества этого способа адресации – простота и наглядность, не требуется вычисление исполнительного адреса.
Недостаток – низкая скорость обработки информации, кроме того, во многих микропроцессорных системах для поля адреса в формате команды выделяется небольшое число битов, что ограничивает доступный для данного способа объем адресного пространства памяти.
Непосредственная адресация- данные включены в команду и собственно обращения к памяти при этом способе загрузки регистров не требуется. Команда вместо указания адреса операнда содержит этот операнд непосредственно. Непосредственная адресация используется при операциях с константами, исполнение команд с непосредственной адресацией отличается быстротой.
Косвенная адресация– адресное поле команды указывает не адрес операнда, а лишь адрес ячейки, в которой хранится косвенный адрес, по которому можно получить операнд. В МП косвенная адресация обычно является неявной регистровой. В этом случае команда предписывает выполнить операцию над операндом, адрес которого содержится в регистрах общего назначения (обычно для этого выделяются определенные регистры блока РОН). Так, команда MOV REG,M загружает любой регистр из ячейки памяти, адрес которой содержится в регистровой паре H,L. Команда LDAX загружает аккумулятор с использованием адреса, содержащегося в регистровой паре B или D (используя регистры B или D можно осуществить косвенную загрузку только аккумулятора).
Пример: MOV D,M- эта команда загружает регистр D из ячейки памяти, адрес которой содержится в регистрах H,L. Отметим, что логически для процессора ячейка памяти с адресом, содержащимся в регистрах H,L эквивалентна регистру с индексом М (ячейку памяти с этим адресом называют регистром М. Естественно, адрес этой ячейки памяти меняется с изменением содержимого регистров H,L, а сам "регистр М" физически находится вне процессора).
Преимущество косвенной адресации в том, что косвенный адрес операнда содержит больше битов, чем число битов в адресном поле команды, т.е. доступен больший объем адресного пространства памяти. Недостатком является увеличение времени для извлечения операнда по сравнению со способом прямой адресации.
Относительная индексная адресация (автоинкрементная и автодекрементная) – базовый исполнительный адрес вычисляется так же, как и при регистровой косвенной адресации, а следующие исполнительные адреса получаются увеличением или уменьшением текущего адреса операнда на определенную величину после каждой обработки адреса. Обычно такая адресация используется при обработке массивов данных. В этом случае список данных представляется как совокупность индексных операндов. Операнды с индексами помещаются в соседних ячейках памяти. Для организации доступа к этим ячейкам памяти используются индексные регистры аналогичные в данном случае счетчику команд. Для двумерного массива истинный адрес
ИА = [базовый адрес] + (содержимое индексных регистров)
Для перебора операндов с индексами осуществляется автоиндексация, т.е. добавление к содержимому регистров плюс или минус единицы. Разновидностью автоиндексации является стековая адресация. В этом случае автоиндексный регистр является указателем стека, а область памяти им адресуемая, – стеком. Принцип стековой адресации заключается в следующем: после каждой засылки в стек, содержимое указателя стека увеличивается, а после каждого изъятия из стека - уменьшается на единицу.
Относительная адресация– исполнительный адрес получается сложением адресного поля команды с содержимым базового регистра процессора. Это сложение производится в специальном сумматоре. Относительная адресация применяется в командах перехода.
Страничная адресация– память делится на ряд страниц одинаковой длины. Адресация страниц осуществляется по содержимому программного счетчика или регистра страниц. Адресация памяти внутри страниц производится адресом, который содержится в команде.
Обращение к подпрограммам.Ряд процедурв ЭВМ часто используется различными программами или одной и той же программой многократно. Такие процедуры могут быть стандартизированы и оформлены в виде подпрограмм.
В этом случае вся программа может быть представлена в виде объединения основной программы и подпрограмм. Обращение к подпрограмме происходит из основной программы.
Перед обращением к подпрограмме необходимо запомнить адрес возврата в основную программу. Адрес возврата обычно запоминается в первой ячейке выполняемой подпрограммы. При этом возврат осуществляется по команде безусловного перехода с косвенной адресацией по содержимому первого слова подпрограммы.
Наиболее эффективной адресацией при обращении к подпрограммам является стековая адресация. Адрес возврата записывается в вершину стека, а после выполнения подпрограммы выталкивается из стека и размещается в счетчике команд. Часто в стек вводится содержимое не только счетчика команд, но и всех регистров МП. При использовании стека характерной особенностью выхода из подпрограммы является использование безадресной команды ВОЗВРАТ. По этой команде процессор извлекает из памяти адрес, откуда произошел вызов подпрограммы, и переходит к команде, непосредственно следующей за этим адресом. Затем программа выполняется в обычном режиме.
Применение подпрограмм позволяет придать программе свойство структурированности. Функционально законченную процедуру удобно оформлять в виде подпрограммы даже если в основной программе она используется только один раз. Например, подпрограмма вывода кода управления семисегментным индикатором, подпрограмма генерации звукового сигнала и т.д. Из подпрограмм- библиотек удобно конструировать разнообразные программы.
Тип оперативнойпамяти - динамический (DynamicRandomAccessMemory — DRAM) или статический (StaticRandomAccessMemory — SRAM).
Статическая память построена на триггерах - схем с двумя устойчивыми состояниями.SRAM используется в качестве микропроцессорной и буферной (кэш-память).
В динамической памяти ячейки построены на основе полупроводниковых областях с накоплением зарядов — своеобразных конденсаторов, и практически не потребляющих энергии при хранении. Конденсаторы расположены на пересечении вертикальных и горизонтальных шин матрицы. При обращении к микросхеме на ее входы вначале подается адрес строки матрицы, сигнал RAS (RowAddressStrobe - строб адреса строки), затем — адрес столбца, сигнал CAS (ColumnAddressStrobe - строб адреса столбца). Конденсаторы имеют свойство терять заряд т.еразряжаются, во избежание потери хранимой информации заряд в них необходимо постоянно регенерировать. На подзарядку тратится и энергия, и время, что снижает производительность системы.DRAM используется для построения ОЗУ .
Кэш-память — высокоскоростная память, являющаяся буфером между оперативной памятью и микропроцессором. Кэш-память недоступна для пользователя, отсюда и название «кэш» (cache), что в переводе с английского означает «тайник».
В кэш-памяти хранятся копии блоков данных тех областей оперативной памяти, к которым выполнялись последние обращения и весьма вероятны обращения в ближайшие такты работы, — быстрый доступ к этим данным и позволяет сократить время выполнения очередных команд программы. При выполнении программы данные, считанные из оперативной памяти с опережением, записываются в кэш-память. В кэш-память записываются и результаты операций, выполненных в микропроцессоре.
По принципу записи результатов в оперативную память различают два типа кэш-памяти:
□ «с обратной записью» результаты операций прежде, чем быть записанными в ОЗУ, фиксируются, а затем контроллер кэш-памяти самостоятельно перезаписывает эти данные в ОЗУ;
□ «со сквозной записью» результаты операций одновременно, записываются и в кэш и в ОЗУ.
кэш-память работает либо на полной тактовой частоте МП, либо на его половинной тактовой частоте.
L1-первого уровня, L2- второго размещаются в ядре процессора и L3 -3-го уровняможет располагаться
Создается кэш-память на основе микросхем статической памяти.
Оперативное запоминающее устройство(ОЗУ) предназначено для хранения информации (программ и данных), непосредственно участвующей в вычислительном процессе в текущий интервал времени. ОЗУ — энергозависимая память: при отключении напряжения питания информация, хранящаяся в ней, теряется.
Основу ОЗУ составляют микросхемы динамической памяти DRAM. Конструктивно элементы оперативной памяти выполняются в виде отдельных модулей памяти. Эти модули вставляются в слоты на системной плате.
Модули памяти характеризуются конструктивом, емкостью.
SIMM(SingleIn-lineMemoryModule) представляют собой печатную плату с односторонним краевым разъемом типа слот.SIMM бывают двух разных типов: короткие 30 контактов (длина 75 мм), и длинные 72 контакта (длина 100 мм).
RIMM(Rambus In-line Memory Module) — новейшийтипоперативнойпамяти. Необходимо отметить, что модули RIMM требуют интенсивного охлаждения. Это связано со значительным энергопотреблением и, соответственно, тепловыделением. Хотя внешне модули RIMM напоминают модули DIMM, они имеют меньшее число контактов и с обеих сторон закрыты специальными металлическими экранами, которые защищают модули RIMM, работающие на больших частотах, экранируя их чувствительные электронные схемы от внешних электромагнитных наводок.
Различают следующие типы оперативной памяти: FPMDRAM; RAMEDO; BEDODRAM; SDRAM; DDRSDRAM; DRDRAM и т. д.
Адресное пространство- максимально возможное количество адресуемых ячеек основной памяти. Адресное пространство зависит от разрядности адресных шин.
Постоянное запоминающее устройство (ПЗУ,или ROM— ReadOnlyMemory, память только для чтения и используется для хранения неизменяемой информации: загрузочных программ операционной системы, программ тестирования устройств компьютера и некоторых драйверов базовой системы ввода-вывода (BIOS) и т. д.ПЗУможет располагаться в чипсетете, содержитя программы BIOS, необходимые для управления многими компонентами компьютера.BIOS доступна постоянно, независимо от работоспособности внешних компонентов, таких, например, как системные загрузочные диски. В BIOS есть программа, которая называется SystemSetup, — с ее помощью пользователь управляет настройками системы.
К ПЗУ принято относить энергонезависимые постоянные и «полупостоянные» запоминающие устройства, из которых оперативно можно только считывать информацию. По технологии записи информации можно выделить ПЗУ следующих типов:
□ микросхемы, программируемые только при изготовлении, — классические ПЗУ или ROM;
□ микросхемы, программируемые однократно в лабораторных условиях, — программируемые ПЗУ (ППЗУ), или programmableROM (PROM);
□ микросхемы, программируемые многократно, перепрограммируемые ПЗУ в том числе флеш-память.
Для повышения производительности содержимое ПЗУ копируется в ОЗУ, и во время работы непосредственно используется только эта копия, называемая также теневой памятью ПЗУ (ShadowROM).
В настоящее время в ПК используются «полупостоянные», перепрограммируемые запоминающие устройства — флеш-память. Модули или карты флеш-памяти могут устанавливаться прямо в разъемы материнской платы Флеш-память — энергонезависимое запоминающее устройство. У FlashBIOS есть один недостаток: существует много вирусов, которые, попав в систему, просто стирают все содержимое FlashBIOS, после чего системная плата выходит из строя. Самый известный из подобных вирусов — «Чернобыль», испортивший очень большое количество компьютеров. От вирусов можно защититься только одним способом — в SystemSetup запретить перезапись содержимого BIOS. Если эта установка активизирована, то ни один вирус ничего сделать не сумеет.
CMOS-память питается от аккумулятора (батарейки) и является энергонезависимой, хранит информацию о параметрах устройств, входящих в ПК. Информация в ней изменяется по мере необходимости, то есть память отслеживает текущую конфигурацию компьютера, на что не способна микросхема BIOS. Поэтому при загрузке компьютера BIOS берет необходимую для своей работы информацию об изменяемых параметрах компонентов ПК именно из этой памяти. Так, из CMOS-памяти считывается информация об установленном МП, о типах и емкости оперативной и всех видах дисковой памяти, о работоспособности устройств компьютера и т. д. Четкое отслеживание времени (в том числе и календаря), даже в отключенном от энергосети состоянии, также связано с тем, что информация о времени хранится в CMOS-памяти.
Виды адресации. Линейная, страничная, сегментная память. Стек.
Вся физическая память делится на страницы фиксированного размера (4 КББ, 2 МБ, 4 МБ). Каждая страница, независимо от размера выравнена по границе 4 КБ.
При использовании линейной адресации 32-битный адрес делится на три части:
- Номер записи в каталоге страниц (номер таблицы страниц, см. ниже) –биты31-22 (10). Одна запись из каталога страниц определяет 4 МБ адресного пространства.
- Номер записи в таблице страниц (номер страницы в таблице страниц, см. ниже) –биты 21-12 (10). Одна запись из таблицы страниц определяет 4 КБ адресного пространства.
- Смещение в странице – биты 11-0 (12).
При использовании страниц по 4 МБ вторая часть отсутствует. Смещение же в странице определяют биты21-0 (22).
Линейная адресация доступна только в защищённом режиме. Для её включения необходимо установить бит PG в регистре CR0. Предварительно необходимо создать в памяти каталог страниц (Page Directory, PD) и таблицы страниц (Page Table, PT), после чего в
Стек (stack — стопка) —структура данных с методом доступа к элементам LIFO (Last In — First Out, «последним пришел — первым вышел»). Чаще всего принцип работы стека сравнивают со стопкой тарелок: чтобы взять вторую сверху, нужно снять верхнюю.
Добавление элемента, называемое также проталкиванием (push), возможно только в вершину стека (добавленный элемент становится первым сверху), выталкивание (pop) — также только из вершины стека, при этом второй сверху элемент становится верхним.
Стеки широко применяются в вычислительной технике — в частности, для отслеживания точек возврата из подпрограмм используется стек вызов, который является неотъемлемой частью архитектуры большинства современных процессоров. Языки программирования высокого уровня также используют стек вызов для передачи параметров при вызове процедур.
Арифметические сопроцессоры, программируемые микрокалькуляторы используют стековую модель вычислений.
Иногда стек называется магазином - по аналогии с магазином в огнестрельном оружии (стрельба начнётся с патрона, заряженного последним)
Плоская модель памяти — метод организации адресного пространства оперативной памяти вычислительных устройств. В плоской модели код и данные используют одно и то же адресное пространство. Для 16-битных процессоров плоская модель памяти позволяет адресовать 64 киБ оперативной памяти; для 32-битных процессоров 4 ГиБ, для 64-битных - 16 эксабайтов.
Текущая версия (не проверялась)
Ассоциативная память (АП) является особым видом машинной памяти, используемой в приложениях очень быстрого поиска. Ассоциативная память представляет собой хранилище данных, в котором обращение к элементам (словам) происходит по полю ключа, хранящегося вместе с данными. АП разработана таким образом, чтобы пользователь задавал слово данных, и АП ищет его во всей памяти, чтобы выяснить, хранится ли оно где-нибудь в нем. Если слово данных найдено, АП возвращает список одного или более адресов хранения, где слово было найдено (и в некоторых архитектурах, также возвращает само слово данных, или другие связанные части данных). Таким образом, АП - аппаратная реализация того, что в терминах программирования назвали бы ассоциативным массивом.
Сегментная адресация памяти — схема адресации памяти компьютера.
Архитектура x86 позволяет использовать сегментную (логическую) адресацию памяти. При этом адрес конкретной ячейки памяти делится на две части: сегмент и смещение. (Сегментную адресацию можно уподобить делению текста на абзацы. По этой аналогии сегмент соответствует абзацу, а смещение — номеру слова в этом абзаце.)
Сегментом называется условно выделенная область адресного пространства определённого размера.
Базой сегмента называется линейный адрес, который указывает на начало сегмента в адресном пространстве (на первую его ячейку (нулевое смещение)).
Сегментный адрес (или логический) соответствует линейному адресу (База сегмента)+(Смещение).
1. Подготовка к лабораторной работе
3. Конспект на тему «Разновидности памяти DDR»
4.Подготовка презентации «Новые виды BIOS»
Форма контроля самостоятельной работы:
- проверка рабочей тетради
-проверка эссе в электронном виде
Вопросы для самоконтроля по теме:
1. Приведите классификацию запоминающих устройств ПК и дайте краткую
характеристику отдельных классов.2. Что такое и где используется статическая оперативная память, динамическая
оперативная память?3. Поясните назначение и классификацию кэш-памяти компьютера.
4. Назовите виды адресации памяти.
5. Назовите основные типы оперативной памяти и поясните их.
6. Что такое ПЗУ, каково его назначение и в чем особенности ПЗУ типа Flash?
7.ВIOS и CMOS: назначение, функции, модификация
Это своеобразное состояние кожи, не имеющее патологического значения. Заключается в том, что у некоторых детей через 2-3 дня после рождения наблюдается усиленное выделение быстро засыхающего секрета сальных желез. Кожа вместо нежной и бархатистой становится сухой, грубой, как бы утолщенной, видны мелкие трещины.
Клиническая картина может напоминать врожденный ихтиоз. Состояние ребенка не нарушено, через 6-7 дней появляется обильное пластинчатое шелушение и все явления быстро проходят. Для более быстрой нормализации кожи рекомендуются теплые мыльные ванны с последующим смазыванием кожи детским или ланолиновым кремом.
Читайте также: