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