Если регистр имеет емкость 4 байта, то емкость процессора равна

Обновлено: 02.07.2024

Память (RAM) состоит из битов, групп по 8, которые образуют байты, каждый из которых может быть адресован, и, следовательно, память с байтовой адресацией.

Адресная шина хранит расположение байта памяти.

Если адресная шина имеет размер 32 бита, это означает, что она может содержать до 2 32 чисел и, следовательно, может ссылаться на до 2 32 байтов памяти = 4 ГБ памяти, и любая память, превышающая эту, бесполезна.

Шина данных используется для отправки значения для записи/считывания из памяти. Если у меня есть шина данных размером 32 бита, это означает, что за один раз в память может быть записано/считано максимум 4 байта. Я не нахожу связи между этим размером и максимально возможным объемом памяти.

Но я прочитал здесь, что:

Это говорит о том, что размер шины данных дает ОС имя, 8-битное, 16-битное и так далее. Что не так с моим пониманием?

"Что не так с моим пониманием?" - Вы пытаетесь сделать так, чтобы одно определение соответствовало разным вещам. Дескриптор битового размера использовался в разное время для разных целей.

Означает то, что говорит производитель. Как правило, это будет что-то похожее на размер регистра, но есть много способов подделать его.

4 ответа 4

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

Однако именно размер целочисленных регистров процессора определяет тип ОС (64 против 32), а не шина данных. Шина данных может отличаться от целочисленных регистров, но автор вашей цитаты связывает их вместе, потому что исторически они часто были одинаковыми.

Некоторые примеры из реальной жизни, где ширина шины данных и целочисленного регистра различаются:

Исходный процессор Pentium 1992 года имеет 64-разрядную шину данных, но имеет 32-разрядную конструкцию. Большая шина данных позволяет ЦП передавать больше данных в и из кэшей, но по-прежнему имеет доступ только к 32-разрядным внутренним данным с помощью своих регистров ЦП.

Как правило, размер указателя также соответствует размеру регистра, но ширина шины физического адреса может быть больше или меньше размера регистра. Некоторые примеры:

Самое лучшее понять, что разрядность ЦП полностью определяется архитектурой и в основном только с точки зрения программного обеспечения. Это больше не имеет ничего общего с физическим дизайном.

Проблема 2

  1. Сколько страниц находится в виртуальном адресном пространстве?
  2. Каков максимальный размер адресуемой физической памяти в этой системе?
  3. Если средний размер процесса составляет 8 ГБ, вы бы использовали одноуровневую, двухуровневую или трехуровневую таблицу страниц? Почему?
  4. Вычислите средний размер таблицы страниц в ответе на вопрос 3 выше.

    36-битный адрес может адресовать 2 ^ 36 байтов в машине с байтовой адресацией. Поскольку размер страницы составляет 8 КБ (2^13), количество адресуемых страниц равно 2^36 / >2^13 = 2^23

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

Пейджинг 1 уровня
Поскольку у нас есть 2^23 страницы в каждом виртуальном адресном пространстве, и мы используем 4 байта на запись в таблице страниц, размер таблицы страниц будет 2^23 * 2^2 = 2 ^ 25. Это 1/256 собственного пространства памяти процесса, так что это довольно дорого. (32 МБ)

Пейджинг 2 уровня
Адрес будет разделен на 12 | 11 | 13, так как мы хотим, чтобы страницы таблицы страниц умещались на одной странице, и мы также хотим разделить биты примерно поровну.

Поскольку размер процесса составляет 8 ГБ = 2^33 Б, я предполагаю, что это означает, что общий размер всех отдельных страниц, к которым обращается процесс, составляет 2^33 Б. Следовательно, этот процесс обращается к 2^33 / 2^13 = 2^20 страниц. Нижний уровень таблицы страниц содержит 2^20 ссылок. Мы знаем, что размер каждого фрагмента нижнего уровня таблицы страниц составляет 2 ^ 11 записей. Таким образом, нам нужно 2^20 / 2^11 = 2^9 фрагментов нижнего уровня.

Тогда общий размер таблицы страниц равен:

//размер внешней таблицы страниц //общий размер внутренних страниц< /td>
1 * 2^12 * 4 + 2^9 * 2^11 * 4 = 2^20 * ( 2^-6 + 4) ~4 МБ

3 уровня пейджинга
Для 3 уровня пейджинга мы можем разделить адрес следующим образом:
8 | 8 | 7 | 13

Опять же, используя те же рассуждения, что и выше, нам нужно 2 ^ 20/2 ^ 7 = 2 ^ 13 фрагментов таблицы страниц уровня 3. Каждый фрагмент таблицы страниц уровня 2 ссылается на 2^8 фрагментов таблицы страниц уровня 3. Итак, нам нужно 2^13/2^8 = 2^5 таблиц уровня 2. И, конечно же, одна таблица уровня 1.

Общий размер таблицы страниц равен:

//размер внешней таблицы страниц //общий размер таблиц уровня 2 //общий размер самых внутренних таблиц
1 * 2^8 * 4 2^5 * 2^8 *4 2^13 * 2^7 * 4 ~4MB
Как легко заметить, двухуровневая и трехуровневая подкачка требуют гораздо меньше места, чем подкачка уровня 1. схема. И поскольку наше адресное пространство недостаточно велико, 3-уровневая подкачка работает не лучше, чем 2-уровневая подкачка. Из-за стоимости доступа к памяти гораздо логичнее выбрать двухуровневую схему подкачки для этого процесса.

Проблема 3

  1. Каков размер страницы в такой системе? Объясните свой ответ (число без обоснования не будет засчитано).

    4К. Последние 12 бит виртуального адреса представляют собой смещение на странице, которое варьируется от 0 до 4095. Таким образом, размер страницы равен 4096, то есть 4 КБ.

Поскольку физические адреса имеют длину 44 бита, а размер страницы — 4 КБ, номер кадра страницы занимает 32 бита. Принимая во внимание 4 защитных бита, каждая запись таблицы страниц уровня 3 занимает (32+4) = 36 бит. Округление для выравнивания записей по байтам (словам) приведет к тому, что каждая запись будет потреблять 40 (64) бит или 5 (8) байтов. Для таблицы из 256 записей нам потребуется 1280 (2048) байт.

Таблица страниц верхнего уровня не должна предполагать, что таблицы страниц 2-го уровня выровнены по страницам. Итак, мы храним там полные физические адреса. К счастью, нам не нужны управляющие биты. Таким образом, каждая запись занимает не менее 44 бит (6 байтов для выравнивания по байтам, 8 байтов для выравнивания по словам). Таким образом, каждая таблица страниц верхнего уровня имеет размер 256*6 = 1536 байт (256 * 8 = 2048 байт).

Попытка воспользоваться выравниванием по 256 элементам для уменьшения размера элемента, вероятно, не стоит усилий. Сделать это было бы сложно; вам нужно будет написать новый распределитель памяти, который гарантирует такое выравнивание. Кроме того, мы не можем полностью уместить таблицу в выровненную область размером 1024 байта (44-10 = 34 бита на адрес, что потребовало бы более 4 байтов на запись), и округление размера до следующей степени двойки не спасло бы использовать любой размер, а не просто хранить указатели и использовать обычный распределитель.

Аналогично каждая запись в таблице страниц 2-го уровня представляет собой 44-битный физический указатель, 6 байтов (8 байтов) при выравнивании по байтам (словам). Таким образом, таблица с 16 элементами занимает 96 (128) байт. Таким образом, требуемое пространство составляет 1536 (2048) байт для таблицы страниц верхнего уровня + 96 (128) байт для одной таблицы страниц второго уровня + 1280 (2048) байт для одной таблицы страниц третьего уровня = 2912 (4224) байт. Поскольку процесс может уместиться ровно на 16 страницах, внутренняя фрагментация не тратит память впустую.

Таким образом, требуемое пространство составляет 1536 (2048) байт для таблицы страниц верхнего уровня + 3 * 96 (3 * 128) байт для 3 таблиц страниц второго уровня + 3 * 1280 (3 * 2048) для 3 таблиц страниц третьего уровня. таблица страниц = 5664 (8576) байт.

Проблема 4

В соответствии с философией проектирования процессоров RISC, заключающейся в перемещении аппаратной функциональности в программное обеспечение, вы видите предложение о том, чтобы разработчики процессоров удаляли MMU (блок управления памятью) из аппаратного обеспечения. Чтобы заменить MMU, компиляторы генерируют так называемый позиционно-независимый код (PIC). PIC может быть загружен и запущен по любому адресу без выполнения какого-либо перемещения. Если предположить, что код PIC работает так же быстро, как код без PIC, в чем будет недостаток этой схемы по сравнению со страничным MMU, используемым в современных микропроцессорах?

Решение:
Нужно решение.

Проблема 5

Опишите преимущества использования MMU, включающего сегментацию и пейджинг, по сравнению с теми, которые используют только пейджинг или чистую сегментацию. Представьте свой ответ в виде отдельных списков преимуществ перед каждой из чистых схем.

Решение:
Нужно решение.

Проблема 6

Рассмотрите следующий фрагмент кода, который умножает две матрицы. Предположим, что двоичный файл для выполнения этой функции умещается на одной странице, и стек также умещается на одной странице. Предположим далее, что для хранения целого числа требуется 4 байта. Вычислите количество промахов TLB, если размер страницы равен 4096, а TLB имеет 8 записей с замещающей политикой, состоящей из LRU.

Решение:
1024*(2+1024*1024) = 1073743872
Двоичный файл и стек умещаются на одной странице, поэтому каждый занимает одну запись в TLB. Пока функция работает, она постоянно обращается к двоичной странице и странице стека. Таким образом, две записи TLB для этих двух страниц будут все время находиться в TLB, а данные могут занимать только оставшиеся 6 записей TLB.

Мы предполагаем, что две записи уже находятся в TLB, когда функция начинает выполняться. Затем нам нужно рассмотреть только эти страницы данных.

Поскольку для хранения целого числа требуется 4 байта, а размер страницы составляет 4096 байт, для каждого массива требуется 1024 страницы. Предположим, что каждая строка массива хранится на одной странице. Тогда эти страницы можно представить в виде a[0..1023], b[0..1023], c[0..1023]: Страница a[0] содержит элементы a[0][0..1023], страница a[1] содержит элементы a[1][0..1023] и т. д.

Для фиксированного значения i, скажем, 0, функция выполняет цикл по j и k, у нас есть следующая ссылочная строка:

Для ссылочной строки (всего 1024 строки) a[0], c[0] приведут к двум промахам TLB. Поскольку доступ к a[0] и b[0] будет осуществляться через каждые четыре обращения к памяти, эти две страницы не будут заменены алгоритмом LRU. Для каждой страницы в b[0..1023] каждый раз при доступе к ней будет происходить один промах TLB. Таким образом, количество промахов TLB для второго внутреннего цикла равно
2+1024*1024 = 1048578.

Необходимое условие — основные компьютерные инструкции, форматы инструкций
Формат инструкции определяет другой компонент инструкции. Основными компонентами инструкции являются код операции (какая инструкция должна быть выполнена) и операнды (данные о том, какая инструкция должна быть выполнена). Вот различные термины, относящиеся к формату инструкции:

  • Размер набора инструкций. Указывает общее количество инструкций, определенных в процессоре.
  • Размер кода операции — это количество битов, занимаемых кодом операции, которое рассчитывается путем получения логарифма размера набора инструкций.
  • Размер операнда — количество битов, занимаемых операндом.
  • Размер инструкции — рассчитывается как сумма битов, занятых кодом операции и операндами.

В этой статье мы обсудим различные типы проблем в зависимости от формата инструкций, которые задаются в GATE. Подробнее о различных типах форматов инструкций см.: Форматы инструкций

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

Очередь-1. Рассмотрим процессор с 64 регистрами и набором команд размером двенадцать. Каждая инструкция имеет пять отдельных полей, а именно код операции, два идентификатора исходного регистра, один идентификатор регистра назначения и двенадцатибитное непосредственное значение. Каждая инструкция должна храниться в памяти с выравниванием по байтам. Если в программе 100 инструкций, объем памяти (в байтах), занимаемый текстом программы, равен ____________. (GATE 2016)
(A) 100
(B) 200
(C) 400
(D) 500

  • Инструкция состоит из кода операции и операндов. Учитывая размер набора инструкций 12, для кода операции требуется 4 бита (2 ^ 4 = 16).
  • Поскольку всего имеется 64 регистра, для идентификации регистра требуется 6 бит.
  • Поскольку инструкция содержит 3 регистра (2 источника + 1 обозначение), для идентификаторов регистров требуется 3 * 6 = 18 бит.
  • Для непосредственного значения требуется 12 бит.
  • Всего битов для инструкции = 4 + 18 + 12 = 34 бита
  • Инструкции должны храниться с выравниванием по байтам. Ближайшая граница байта после 34 бит составляет 40 бит (5 байт).
  • Следовательно, для 100 инструкций требуется память 5 * 100 = 500 байт, и правильный вариант — (D).

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

Очередь-2. Процессор имеет 40 различных инструкций и 24 регистра общего назначения. 32-битное командное слово имеет код операции, два операнда-регистра и непосредственный операнд. Количество битов, доступных для поля непосредственного операнда, равно_______. (ВОРОТ CS 2016)

  • Поскольку у процессора 40 инструкций, число бит кода операции = 6 (2^6 = 64)
  • Поскольку процессор имеет 24 регистра, число битов в одном регистре = 5 (2^5 = 32)
  • Всего бит, занятых 2 регистрами и кодом операции = 6 + 5 + 5 = 16.
  • Поскольку указанный размер инструкции составляет 32 бита, оставшиеся биты, оставшиеся для операнда = 32-16 = 16 бит.

Очередь-3. Машина имеет 32-битную архитектуру с инструкциями длиной в 1 слово. Он имеет 64 регистра, каждый из которых имеет длину 32 бита. Он должен поддерживать 45 инструкций, которые имеют непосредственный операнд в дополнение к двум регистровым операндам. Предполагая, что непосредственный операнд является целым числом без знака, максимальное значение непосредственного операнда равно ___________. (ВОРОТ CS 2014)

  • Поскольку машина имеет 32-битную архитектуру, 1 слово = 32 бита = размер инструкции
  • Поскольку процессор имеет 64 регистра, число битов в одном регистре = 6 (2^6 = 64)
  • Поскольку у процессора 45 инструкций, число бит кода операции = 6 (2^6 = 64)
  • Всего бит, занятых 2 регистрами и кодом операции = 6 + 6 + 6 = 18.
  • Поскольку указанный размер инструкции составляет 32 бита, оставшийся бит остается для непосредственного операнда = 32-18 = 14 бит.
  • Максимальное значение без знака с использованием 14 бит = 2^14 – 1 = 16383, что является ответом.

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

Очередь-4. Процессор имеет 16 целочисленных регистров (R0, R1, …, R15) и 64 регистра с плавающей запятой (F0, F1, …, F63). Он использует 2-байтовый формат инструкции. Существует четыре категории инструкций: тип 1, тип 2, тип 3 и тип 4. Категория типа 1 состоит из четырех инструкций, каждая из которых имеет 3 целочисленных регистровых операнда (3R). Категория типа 2 состоит из восьми инструкций, каждая из которых имеет 2 операнда регистра с плавающей запятой (2F). Категория типа 3 состоит из четырнадцати инструкций, каждая из которых имеет один операнд целочисленного регистра и один операнд регистра с плавающей запятой (1R+1F). Категория типа 4 состоит из N инструкций, каждая из которых имеет регистровый операнд с плавающей запятой (1F).

Воспоминания содержат один или несколько битов информации:

Содержимое памяти остается неизменным до тех пор, пока не будет перезаписано новым битовым шаблоном. Для некоторых воспоминаний содержимое «теряется» при отключении питания памяти.

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

Зарегистрировать память

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

Однако содержимое регистра можно «прочитать» или «записать» очень быстро, часто на порядок быстрее, чем в основной памяти, и на несколько порядков быстрее, чем в дисковой памяти.

Различные типы регистров встречаются в ЦП. Регистры общего назначения доступны для общего использования программистом. Если из контекста не следует иное, мы будем использовать термин «Регистр» для обозначения регистра общего назначения внутри ЦП. Большинство современных процессоров имеют от 16 до 64 регистров общего назначения. Регистры специального назначения имеют особое назначение и либо не программируются, либо являются внутренними для ЦП, либо доступ к ним осуществляется программистом с помощью специальных инструкций.

Примеры таких регистров включают:

Хотя размер регистра (размер битовой группы регистров) имеет тенденцию варьироваться в зависимости от типа регистра, размер слова архитектуры часто (но не всегда!) определяется размером регистров общего назначения.

В отличие от основной памяти и дисковой памяти, регистры «адресуются» напрямую с помощью специальных инструкций или путем кодирования номера регистра в компьютерной инструкции. На уровне языка программирования (ассемблера) ЦП регистры обычно обозначаются специальными идентификаторами (например, R0, R1, R7, SP, PC)

И последнее: содержимое регистра теряется при отключении питания ЦП, поэтому регистры не подходят для хранения долговременной информации или информации, необходимой для хранения после отключения питания или сбоя. Однако регистры являются самой быстрой памятью, и их использование может привести к тому, что программы будут выполняться очень быстро.

Основная память (ОЗУ)

Если бы мы суммировали все биты всех регистров ЦП, общий объем памяти, вероятно, не превышал бы 5000 бит. Большинство вычислительных задач, выполняемых компьютером, требуют гораздо больше памяти. Основная память — это следующая по скорости память в компьютере, и она намного больше по размеру.

< tr>

Архитектуры компьютеров также накладывают архитектурные ограничения на максимально допустимый объем оперативной памяти. Это ограничение обычно равно двум ячейкам памяти WordSize

ОЗУ (оперативное запоминающее устройство) – наиболее распространенная форма основной памяти. Оперативная память обычно располагается на материнской плате и обычно находится на расстоянии менее 12 дюймов от процессора. ПЗУ (память только для чтения) похожа на оперативную память, за исключением того, что ее содержимое нельзя перезаписать. Память ПЗУ часто используется для хранения «загрузочной» или программы запуска, которую компьютер выполняет при включении питания.

Хотя это и медленнее, чем регистровая память, содержимое любого места в ОЗУ все же можно «прочитать» или «записать» очень быстро. Время чтения или записи называется временем доступа и одинаково для всех ячеек ОЗУ.

В отличие от регистровой памяти, ОЗУ используется для хранения как программного кода (инструкций), так и данных (чисел, строк и т. д.). Выполняемые программы обычно «загружаются» в ОЗУ с диска перед выполнением ЦП.

Места в ОЗУ идентифицируются схемой адресации, например. нумерация байтов в оперативной памяти от 0 и далее. Содержимое ОЗУ теряется при отключении питания.

Дисковая память 9 ). Диски намного медленнее, чем регистровая и основная память, время доступа к данным на диске обычно составляет от 5 до 15 миллисекунд (5 × 10 -3 с), хотя диски обычно могут передавать сотни или тысячи байтов за один раз.

Диски могут быть размещены внутри «коробки» компьютера или снаружи. Существует также много видов дисковых устройств, например: магнитные жесткие диски, дискеты (V. Slow), магнитооптические компакт-диски/диски, DVD.

Места на диске определяются специальными схемами адресации диска (например, номерами дорожек и секторов).

Сводка характеристик

Организация основной памяти

Мы можем представить, что основная память организована как матрица битов. Каждая строка представляет ячейку памяти, обычно она равна размеру слова архитектуры, хотя может быть кратным слову (например, 2xWordsize) или частью слова (например, половиной размера слова). Для простоты предположим, что данные в основной памяти могут быть прочитаны или записаны только по одной строке (ячейке памяти) за раз.

Для 96-битной памяти мы можем организовать память как 12 × 8 бит, или 8 × 12 бит, или 6 × 16 бит, или даже как 96 × 1 бит или 1 × 96 бит. Каждая строка также имеет адрес натурального числа, который используется для выбора строки:

Байтовая адресация

Основная память обычно хранит и вызывает строки, которые имеют длину в несколько байтов (например, 16-битное слово = 2 байта, 32-битное слово = 4 байта). Однако большинство архитектур делают основную память адресуемой по байтам, а не по словам. В таких архитектурах ЦП и/или оборудование основной памяти способны читать/записывать любой отдельный байт. Вот пример основной памяти с 16-битными ячейками памяти. Обратите внимание, что ячейки памяти (строки) имеют четные адреса.

Порядок байтов

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

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

В системах с прямым порядком байтов младший байт многобайтового элемента данных имеет наименьший адрес, а самый старший байт имеет старший адрес. Примечание: N-символьное строковое значение рассматривается не как одно большое многобайтовое значение, а как N односимвольных значений, т. е. первый символ строки всегда имеет наименьший адрес, последний символ имеет наивысший адрес. Это справедливо как для прямого, так и для прямого порядка байтов.

Пример: Показать содержимое памяти по адресу слова 24, если это слово содержит число, заданное 122E 5F01H как в схемах с обратным порядком байтов, так и в схемах с прямым порядком байтов?

Примечание. По соглашению мы упорядочиваем байты в слове памяти слева направо для прямого порядка байтов и справа налево для прямого порядка байтов.

Пример: Показать содержимое основной памяти из слова с адресом 24, если эти слова содержат текст JIM SMITH.

Байты, помеченные ? неизвестны. Они могут содержать важные данные или могут быть безразличными байтами — интерпретация остается на усмотрение программиста.

К сожалению, компьютерные системы, используемые сегодня, разделены на системы с обратным порядком байтов и прямым порядком байтов. Это приводит к проблемам, когда компьютер с прямым порядком байтов хочет передать данные на компьютер с прямым порядком байтов. Некоторые современные архитектуры (например, PowerPC) позволяют программно переключать порядок следования байтов в архитектуре.

Выравнивание слов

Хотя основная память обычно организована в виде строк слов с байтовой адресацией и обращается к строке за раз, некоторые архитектуры позволяют ЦП обращаться к любой битовой группе размером со слово независимо от ее байтового адреса. Мы говорим, что доступ, который начинается на границе слова памяти, является выровненным доступом, а доступ, который не начинается на границе слова, — невыровненным доступом.

Для чтения невыровненного слова из ОЗУ требуется

Написание невыровненного слова еще сложнее и МЕДЛЕННЕЕ. По этой причине некоторые архитектуры запрещают доступ к невыровненным словам. например В архитектуре 68000 нельзя обращаться к словам, начиная с нечетного адреса (например, 1, 3, 5, 7 и т. д.). Некоторые архитектуры расширяют этот принцип до доступа к нескольким словам. например в архитектуре SPARC 64-битные элементы данных должны иметь байтовый адрес, кратный 8.

Интегральные схемы (чипы) оперативной памяти

До сих пор мы рассматривали логическую организацию основной памяти. Физически микросхемы оперативной памяти также могут быть организованы по-разному. Вот 3 метода формирования основной памяти 256x8 бит.

В первом случае основная память состоит из одной микросхемы ОЗУ.Во втором мы используем две микросхемы ОЗУ, одна дает нам старшие 4 бита, другая — младшие 4 бита. В третьем мы используем 8 чипов RAM, каждый чип дает нам 1 бит — чтобы прочитать 8-битное слово памяти, нам пришлось бы одновременно обращаться ко всем 8 чипам RAM и конкатенировать биты.

Банки памяти

Основная память обычно больше, чем размер одной микросхемы ОЗУ. Поэтому для доступа к слову памяти аппаратное обеспечение памяти должно одновременно прочитать строку из нескольких микросхем ОЗУ, а затем объединить возвращенные результаты из каждой микросхемы ОЗУ.

Микросхемы ОЗУ, из которых состоит система с основной памятью, обычно группируются в банки размером в одно слово памяти:

Пример: заданная основная память = 1M × 16 бит (с адресацией по словам),

Чипы ОЗУ = 256 КБ × 4 бита

Размер банка = число микросхем ОЗУ на слово памяти = ширина слова памяти / ширина микросхемы ОЗУ = 16/4 = 4

Для адресации микросхемы ОЗУ требуется 18 бит (поскольку 256 КБ = 2·18 = длина микросхемы ОЗУ)

Для адресной памяти размером 1M × 16 бит требуется 20 бит адреса (поскольку 1M = 2 20 ).

Поэтому для выбора банка необходимо 2 бита (20−18).

Общее количество чипов RAM = (1M × 16) / (256K × 4) = 16

Общее количество БАНКОВ = общее количество микросхем ОЗУ / размер БАНКА = 16/4 = 4

Перемежающаяся память

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

Если биты выбора банка являются младшими значащими битами адреса памяти, результирующая память называется чередующейся младшим разрядом.

Если биты выбора банка являются старшими битами адреса памяти, результирующая память называется чередующейся по старшинству.

Память с чередованием может дать преимущества в производительности, если одновременно можно читать/записывать более одного банка:-

Это преимущество для однократного доступа к последовательным данным, состоящим из нескольких слов, таких как программные инструкции или элементы в массиве данных.

Это преимущество, если ЦП может получить доступ к строкам в одном банке, в то время как устройство ввода-вывода (жесткий диск и т. д.) может получить доступ к разным строкам в другом банке.

Но я обнаружил, что могу использовать push без указания размера операнда:

В этом случае, сколько байтов помещается в стек командой push? Зависит ли количество передаваемых байтов от размера операнда (поэтому в моем примере будет передан 1 байт)?


Собственный размер регистра для выравнивания стека. В 32-битном режиме он будет помещать 4 байта. В 64-битном режиме будет передано 8 байт.

Кстати, вы могли бы проверить это с помощью отладчика. Просто выполните пошаговую инструкцию и посмотрите, как меняется esp/rsp. Вы также можете посмотреть на результат дизассемблирования и заметить, что они оба ассемблируются в один и тот же машинный код.

2 ответа 2

Зависит ли количество передаваемых байтов от размера операнда

Это не зависит от значения числа. Технический термин x86 для обозначения количества байтов, отправляемых push-уведомлениями, — "размер операнда", но это не зависит от того, помещается ли число в imm8 или нет.

(то есть в моем примере это будет помещать 1 байт)?

Нет, размер непосредственного объекта не равен размеру операнда. Он всегда помещает 4 байта в 32-битный код или 64 байта в 64-битный код, если только вы не сделаете что-то странное.

Рекомендация: всегда просто пишите push 123 или push 0x12345, чтобы использовать размер push по умолчанию для режима, в котором вы находитесь, и позволять ассемблеру выбирать кодировку. Это почти всегда то, что вы хотите. Если это все, что вы хотели знать, можете не читать прямо сейчас.

Во-первых, полезно знать, какие размеры push-уведомлений вообще возможны в машинном коде x86:

  • В 16-битном режиме вы можете передать 16 или (с префиксом размера операнда на 386 и более поздних версиях) 32 бита.
  • В 32-битном режиме вы можете передать 32 или (с префиксом размера операнда) 16 бит.
  • В 64-битном режиме можно передать 64 или (с префиксом размера операнда) 16 бит.
    Префикс REX.W=0 не позволяет закодировать 32-битный push. 1

Других вариантов нет. Указатель стека всегда уменьшается на размер операнда push 2 . (Поэтому можно «сместить» стек, вставив 16 бит). pop имеет тот же размер: 16, 32 или 64, за исключением того, что в 64-битном режиме нет 32-битного pop.

Это применимо независимо от того, помещаете ли вы регистр или непосредственное значение, и независимо от того, подходит ли непосредственное значение к расширенному знаку imm8 или ему требуется imm32 (или imm16 для 16-разрядных сообщений). (Знак 64-битного push imm32 расширяется до 64-битного. Нет push imm64 , только mov reg, imm64 )

В исходном коде NASM push 123 ассемблируется до размера операнда, соответствующего режиму, в котором вы находитесь. В вашем случае, я думаю, вы пишете 32-битный код, поэтому push 123 — это 32-битный push, хотя он может (и использует) использовать кодировку push imm8.

Ваш ассемблер всегда знает, какой код он ассемблирует, поскольку он должен знать, когда использовать или не использовать префиксы размера операнда, когда вы форсируете размер операнда.

MASM такой же; единственное, что может отличаться, — это синтаксис для принудительного выбора другого размера операнда.

Все, что вы пишете на ассемблере, будет ассемблироваться в одну из допустимых опций машинного кода (поскольку люди, которые писали ассемблер, знают, что кодируется, а что нет), так что нет, вы не можете передать один байт с помощью инструкция толчка. Если вы хотите, вы можете эмулировать это с помощью dec esp / mov byte [esp], 123

Примеры NASM:

Вывод из nasm -l /dev/stdout для вывода листинга на терминал вместе с исходной строкой исходного кода.

Слегка отредактировано, чтобы отделить байты кода операции и префикса от операндов. (В отличие от objdump -drwC -Mintel , формат дизассемблирования NASM не оставляет пробелов между байтами в шестнадцатеричном дампе машинного кода).

dword обычно зависит от размера операнда, а strict dword — это то, как вы запрашиваете, чтобы ассемблер не оптимизировал его для кодировки меньшего размера.

Все предыдущие инструкции представляют собой 32-разрядные push-уведомления (или 64-разрядные в 64-разрядном режиме с тем же машинным кодом). Все следующие инструкции являются 16-битными, независимо от того, в каком режиме вы их ассемблируете. (Если они ассемблируются в 16-битном режиме, они не будут иметь префикс размера операнда 0x66)

По-видимому, NASM рассматривает переопределения байтов и двойных слов как применяемые к размеру непосредственного, но слово относится к размеру операнда инструкции. На самом деле использование o32 push 12 в 64-битном режиме также не приводит к предупреждению. Однако push eax делает: «ошибка: инструкция не поддерживается в 64-битном режиме».

Префикс размера адреса влияет только на режим явной адресации, используемый для отправки с использованием источника памяти, например. в 64-битном режиме: push qword [rsi] (без префиксов) vs. push qword [esi] (префикс размера адреса для 32-битного режима адресации). push dword [rsi] не поддается кодированию, потому что ничто не может сделать размер операнда 32-битным в 64-битном коде 1 . push qword [esi] не усекает rsp до 32-бит. По-видимому, «Ширина адреса стека» - это другое, вероятно, заданное в дескрипторе сегмента. (Это всегда 64 в 64-битном коде в обычной ОС, я думаю, даже для Linux x32 ABI: ILP32 в длинном режиме.)

Когда вы когда-нибудь хотели использовать 16 бит? Если вы пишете на ассемблере из соображений производительности, то, вероятно, никогда. В моем код-гольфе adler32 узкое нажатие -> широкое извлечение потребовало меньше байтов кода, чем сдвиг/ИЛИ, чтобы объединить два целых числа 16b в значение 32b.

Или, возможно, в эксплойте для 64-битного кода вы можете захотеть поместить некоторые данные в стек без промежутков. Вы не можете просто использовать push imm32 , потому что этот знак или ноль распространяется на 64-битную версию. Вы можете сделать это 16-битными порциями с несколькими 16-битными инструкциями push. Но все же, вероятно, более эффективно mov rax, imm64 / push rax (10B+1B = 11B для полезной нагрузки imm 8B). Или нажмите 0xDEADBEEF / mov dword [rsp+4], 0xDEADC0DE (5B + 8B = 13B и не требует регистра). четыре 16-битных отправки займут 16 Б.

Сноски:

На самом деле REX.W=0 игнорируется и не изменяет размер операнда по сравнению с 64-битным значением по умолчанию. NASM, YASM и GAS все собирают, нажимают r12 на 41 54 , а не на 49 54 . GNU objdjump считает 49 54 необычным и декодирует его как 49 54 rex.WB push r12 . (Оба выполняются одинаково). Microsoft также соглашается, используя 40-часовой REX в качестве заполнения для push rbx в некоторых библиотеках DLL Windows.

Intel просто говорит, что 32-битные push-уведомления "не поддаются кодированию" (NE в таблице) в длинном режиме. Я не понимаю, почему W=1 не является стандартной кодировкой для push/pop, когда нужен префикс REX, но видимо выбор произвольный.

Забавный факт: только инструкции стека и некоторые другие по умолчанию имеют 64-битный размер операнда в 64-битном режиме. В машинном коде добавьте rax, rdx нужен префикс REX (с установленным битом W). В противном случае он будет декодироваться как add eax, edx. Но вы не можете уменьшить размер операнда с помощью REX.W=0, когда он по умолчанию равен 64 битам, только увеличить его, когда он по умолчанию равен 32 битам.

За исключением того, что регистры сегментов являются 16-разрядными, но обычная команда push fs по-прежнему будет уменьшать указатель стека на ширину стека (размер операнда). Intel документирует, что последние процессоры Intel в этом случае сохраняют только 16 бит, оставляя остальные 32 или 64 бит без изменений.

Читайте также:

Персональный компьютер256 МБ
Файловый сервер4 ГБ
Мейнфрейм базы данных32 ГБ