Как извлекаются данные из ОЗУ? - PullRequest
5 голосов
/ 17 марта 2012

В C каждый байт адресуется индивидуально.Предположим, что целое число (скажем, использует 4 байта) имеет адрес 0xaddr (что составляет 32 бита, при условии, что у нас 32-битный процессор с 32-битной адресной шиной и 32-битной шиной данных), и предположим, что значение целого числа равно 0x12345678.Теперь, если я получаю это значение из памяти, как процессор делает это?Размещает ли процессор 0xaddr (то есть 32-битный адрес) в адресных строках, а затем извлекает 8-битные данные, скажем, 0x12.И тогда процессор будет набирать 0xaddr+1 в адресных строках, а затем извлекать еще 8-битные данные 0x34 и так далее для 4 байтов целого числа?Или процессор просто помещает 0xaddr и считывает 4 байта одновременно, используя свою полную 32-битную шину данных?

Ответы [ 2 ]

6 голосов
/ 17 марта 2012

Это хорошо известная статья от руководства библиотеки GNU C, в которой описывается доступ к памяти (особенно в x86-современных ПК-системах). В нем гораздо больше подробностей, чем когда-либо вам может понадобиться.

Вся статья разбита на несколько частей:

  1. Введение
  2. Кэши ЦП
  3. Виртуальная память
  4. Поддержка NUMA
  5. Программисты
  6. Больше программистов
  7. Performance Tools
  8. Future
  9. Приложения

Единственное, что я хотел бы добавить к ответу gbulmer, это то, что во многих системах получение потока данных происходит быстрее, чем можно было бы ожидать от получения одного слова. другими словами, выбор места, из которого вы хотите читать, занимает некоторое время, но тот, который вы выбрали, читает с этой точки, а затем следующие 32 или 64 или любые другие биты, а затем следующий ... быстрее, чем переключение на какое-то несвязанное место и чтение другого значения.

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

4 голосов
/ 17 марта 2012

Если вы ищете в Интернете «Компьютерную архитектуру», вы, скорее всего, получите ответы на свои вопросы.

Для вашего конкретного вопроса - 32-битный компьютер с 32-битной шиной данных и адресов для простогочехол, без запутанного оборудования.Он будет считывать 32 бита из 32-битной памяти.

Это аппаратное обеспечение, которое существовало с конца 1970-х годов как миникомпьютеры (например, DEC VAX), и до сих пор существует как микропроцессоры (x86, ARM, Cortex-A8,MIPS32) и внутри некоторых микроконтроллеров (например, ARM, Cortex-M3, PIC32 и т. Д.).

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

Шина данных - это второй набор проводов, которые передают значение в память и из нее.Память может выдавать сигнал о том, что данные действительны, но может быть достаточно быстрым, чтобы все «просто работало».

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

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

Пример такого набора сигналов можно увидеть наhttp://www.cpu -world.com / info / Pinouts / 68000.html Этот чип имеет только 24-битную адресную шину и 16-битную шину данных.У него есть два сигнала (UDS и LDS), которые сигнализируют, используются ли верхние сигналы данных, нижние сигналы данных или оба.

Я нашел достаточно подробное объяснение на сайте research.cs.tamu.edu/prism./lectures/mbsd/mbsd_l15.pdf Я обнаружил, что при поиске «68000 цикл шины памяти».

Вы могли бы с пользой посмотреть MIPS, ARM или x86, чтобы увидеть их цикл шины.

...