Как инструкции отличаются от данных?

При чтении основного документа ARM у меня возникло это сомнение. Как ЦП отличает считываемые данные от шины данных, выполнять ли это как инструкцию или как данные, с которыми он может работать?

Обратитесь к выдержке из документа -

"Данные поступают в процессорное ядро через шину данных. Данные могут быть инструкция для выполнения или данные пункт".

Спасибо, что просветил меня! /МС

Ответ 1

Каждый код операции будет состоять из инструкции из N байтов, которая затем ожидает, что последующие M байты будут данными (указатели памяти и т.д.). Поэтому CPU использует каждый код операции, чтобы определить, сколько из следующих байтов данных.

Конечно, для старых процессоров (например, старых 8-битных типов, таких как 6502 и т.п.) не было никакого дифференцирования. Обычно вы указываете счетчик программ на начало программы в памяти, и это будет ссылаться на данные из другого места в памяти, но программа/данные сохраняются как простые 8-битные значения. Сам процессор не мог различать два.

Было вполне возможно указать счетчик программ на то, что считалось данными, и на самом деле я помню старый учебный курс, в котором мой профессор сделал именно это, и мы должны были указать на ошибку. Его ответ был "но эти данные! Он не может выполнить это! Может ли это?", И в этот момент я заполнил наши данные действительными кодами операций, чтобы доказать, что действительно может это сделать.

Ответ 2

Простой ответ - нет. Инструкции машинного кода - это просто двоичные числа, а также данные. Более сложный ответ - ваш процессор может (или не может) обеспечить сегментацию памяти, а это означает, что попытка выполнить то, что было указано как данные, вызывает некоторую ловушку. Это одно из значений "ошибки сегментации" - процессор попытался выполнить что-то, что не было помечено как исполняемый код.

Ответ 3

Каждый, прочитанный процессором, известен как выборка данных или выборка команд. Все процессоры, старые и новые, знают, что их команды извлекаются из данных. Извне вы можете или не можете сказать, как правило, не за исключением процессоров архитектуры Гарварда, которые, конечно же, не являются ARM. В последнее время я работаю с mpcore (ARM11), и на внешнем интерфейсе есть биты, которые рассказывают вам немного о том, что это за чтение, в основном для подключения внешнего кеша, объединить это со знанием, если у вас есть mmu и L1, и вы можете передавать данные из инструкции, но это исключение из правила. С точки зрения шины памяти это всего лишь биты данных, которые вы не знаете данных из инструкции, но логика, которая инициировала этот цикл памяти и ждет результата, знала, прежде чем она начала цикл, какой из них он получал и что он собирается делать с этими данными, когда он ее получит.

Ответ 4

Оригинальная конструкция ARM имела трехступенчатый конвейер для выполнения команд:

  • НАЧАТЬ инструкцию в CPU
  • DECODE инструкция по настройке ЦП для выполнения
  • ВЫПОЛНИТЕ инструкцию.

Внутренняя логика ЦП гарантирует, что она знает, будет ли она получать данные на этапе 1 (то есть выбор команды) или на этапе 3 (то есть выборка данных из-за команды "load" ).

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

Ответ 5

Я думаю, что он находится там, где данные хранятся в программе и поддержка ОС для информирования CPU о том, является ли это кодом или данными.

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

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

По-прежнему можно указать ваш счетчик программ на данные, но ОС может сказать CPU, чтобы это предотвратить - см. NX бит и Windows "Настройки защиты данных" (системная панель управления)

Ответ 6

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