Как инструкции отличаются от данных? - PullRequest
14 голосов
/ 07 января 2010

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

См. Выдержку из документа -

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

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

Ответы [ 6 ]

10 голосов
/ 07 января 2010

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

6 голосов
/ 07 января 2010

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

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

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

3 голосов
/ 21 января 2010

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

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

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

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

2 голосов
/ 10 января 2010

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

0 голосов
/ 02 декабря 2016

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

0 голосов
/ 07 января 2010

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

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

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

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

...