Устройство обмена данными с ОЗУ центрального процессора

Обновлено: 21.11.2024

Вы можете внедрить технологию RDMA, чтобы позволить компьютерам в сети обмениваться данными в основной памяти, не задействуя процессор, кэш или операционную систему любого из компьютеров. Но вы также можете использовать функцию DMA для прямой отправки данных с подключенного устройства в память на материнской плате компьютера. Этот пост от MiniTool в основном посвящен DMA.

Определение прямого доступа к памяти

Прежде всего, что такое прямой доступ к памяти? Прямой доступ к памяти может быть сокращенно до DMA, что является особенностью компьютерных систем. Он позволяет устройствам ввода-вывода (I/O) получать доступ к основной системной памяти (оперативной памяти) независимо от центрального процессора (ЦП), что ускоряет операции с памятью.

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

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

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

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

Как работает прямой доступ к памяти?

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

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

Для выполнения операций ввода-вывода или операций памяти-памяти хост-процессор инициализирует контроллер DMA с количеством слов для передачи и используемым адресом памяти. Затем ЦП дает команду периферийному устройству начать передачу данных.

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

Режимы работы

Прямой доступ к памяти работает по-разному в разных режимах работы.

Пакетная съемка

В пакетном режиме полный блок данных передается в непрерывной последовательности. Как только ЦП разрешает контроллеру DMA доступ к системной шине, контроллер DMA передаст все байты данных в блоке данных, прежде чем передать управление системными шинами обратно ЦП, но это приведет к тому, что ЦП будет неактивен в течение некоторого времени. значительное долгое время. Этот режим также называется «Режим блочной передачи».

Выключить режим кражи

Режим кражи циклов используется в системе, в которой невозможно отключить ЦП на время, необходимое для режима пакетной передачи. В режиме захвата цикла контроллер DMA получает доступ к системной шине с помощью сигналов BR (запрос шины) и BG (предоставление шины), которые аналогичны пакетному режиму. Эти два сигнала управляют интерфейсом между ЦП и контроллером прямого доступа к памяти.

С одной стороны, в режиме кражи циклов скорость передачи блоков данных не такая высокая, как в пакетном режиме, но с другой стороны, время простоя процессора не такое продолжительное, как в пакетном режиме.< /p>

Прозрачный режим

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

Основное преимущество прозрачного режима заключается в том, что ЦП никогда не останавливает выполнение своих программ, а передачи с прямым доступом к памяти бесплатны с точки зрения времени, а недостатком является то, что аппаратному обеспечению необходимо определять, когда ЦП не использует системные шины. , что может быть сложно. Это также называется «скрытый режим передачи данных DMA».

Присоединяйтесь к эксклюзивам

Свяжитесь с нами, чтобы получать подарки, эксклюзивные акции и последние новости!

Тематические статьи: Дезагрегированные вычисления изменят мир

Теруаки Исидзаки и Ёсиро Ямабе

1. Ориентированная на память архитектура

Производительность центрального процессора (ЦП) быстро развивалась, поскольку согласно закону Мура интеграция полупроводников удваивается каждые 18 месяцев. По сравнению с этой эволюцией ЦП память и сети хранения развивались медленно. Таким образом, большая часть современного программного обеспечения разработана на основе высокопроизводительных ЦП и других низкоскоростных устройств и политики сокращения времени обработки других устройств за счет выполнения как можно большего количества вычислений на ЦП.
Например, при выполнении операций ввода-вывода (I/O) памяти ЦП эффективно регулирует размер единицы ввода-вывода и количество запросов для целевых данных ввода-вывода, хранящихся в памяти. Для обработки, требующей нескольких ускорителей, программное обеспечение ЦП управляет ускорителями. Такая модель обработки, в которой ЦП вмешивается в обработку, называется вычислительной моделью, ориентированной на ЦП (рис. 1 (а)).
В соответствии с общей конструкцией программного обеспечения ЦП предназначен для посредничества в обработке. Однако рост производительности ядра ЦП замедлился, что, как говорят, является пределом закона Мура. Энергонезависимая память, которая представляет собой высокоскоростное хранилище, и ускорители, такие как программируемые вентильные матрицы (FPGA) и графические процессоры (GPU), быстро развиваются. Новая модель обработки программного обеспечения для повышения производительности различных ускорителей также становится все более важной.
Поэтому мы исследуем архитектуру, ориентированную на память, которая обеспечивает эффективное взаимодействие между различными ускорителями через основную память. Эта архитектура фокусируется на основной памяти, где ускоритель начинает обработку, обеспечивая эффективный обмен данными через основную память, когда ускорители связаны.
Архитектура, ориентированная на память, представляет собой модель обмена данными, в которой ускоритель-отправитель вводит данные в основную память (общую память), а ускоритель-получатель автономно получает и вычисляет данные. Взяв пример получения данных от другого узла с помощью сетевой карты (NIC) и их обработки с помощью FPGA, в модели вычислений, ориентированной на ЦП, ЦП управляет приемом сетевой карты и выполнением обработки для FPGA. Однако архитектура, ориентированная на память, требует только двух минимальных процессов: обработки сетевого приема NIC и арифметической обработки FPGA, поэтому можно ожидать сокращения потребления ресурсов ЦП и времени обработки для опосредования обработки (рис. 1 (b)).

Рис. 1. Сравнение потока обработки.

Когда несколько ускорителей выполняют параллельную обработку, используя данные, вводимые в память, ускоритель-отправитель нужно поместить в общую область памяти только один раз, что является более эффективной моделью обработки (рис. 1(b)).
Концепция, близкая к архитектуре, ориентированной на память, — это Hewlett Packard Enterprise (HPE), управляемые памятью вычисления (MDC) [1] . MDC — это концептуальная модель, основанная на аппаратной архитектуре, такой как конфигурация, в которой большой пул памяти размещается в центре всех процессоров. Архитектура, ориентированная на память, с другой стороны, фокусируется на управлении данными программным обеспечением для обмена данными между ускорителями через память.

2. Оценка эффективности ориентированной на память архитектуры

Мы оценили эффективность архитектуры, ориентированной на память, с помощью Sparkle [ 2 , 3 ], который является расширением Apache Spark (программное обеспечение с открытым исходным кодом для распределенной обработки данных), в качестве текущего программного обеспечения, близкого к концепции эффективных данных. обмен через общую память.
Apache Spark состоит из фазы отображения, на которой выполняется обработка данных в каждом рабочем процессе, фазы перемешивания, которая распределяет результаты обработки, выполненные в рабочем процессе, среди требуемых процессов, и фазы сокращения, которая выполняет операции на основе собранных результатов. от каждого рабочего процесса. Фаза перемешивания — это процесс обмена большими объемами данных по сети с использованием TCP/IP (протокол управления передачей/Интернет-протокол) между рабочими процессами, распределенными по нескольким узлам. Следовательно, стоимость этапа перемешивания очень высока с точки зрения задержки обработки ЦП, связанной с сетевым взаимодействием и потреблением ресурсов ЦП.Sparkle — это расширение, которое позволяет выполнять обработку в случайном порядке через общую память для решения этой проблемы.
Sparkle — это программное обеспечение, разработанное HPE для MDC с открытым исходным кодом. Однако его дальнейшая разработка была приостановлена ​​в 2016 году, когда началось наше оценочное исследование, поэтому нам пришлось исправить некоторые ошибки, чтобы оценить его [4] .
Рисунок 2 представляет собой сравнение моделей обмена данными Apache Spark (рис. 2(a)) и Sparkle (рис. 2(b)) при условии, что на одном сервере запущено несколько рабочих процессов. Так как соединения создаются между процессами, которые обмениваются данными, будет создаваться большое количество соединений из-за увеличения рабочих процессов по мере увеличения масштаба обработки. Процесс на принимающей стороне может обращаться к данным, получая данные через сеть. Однако для выполнения сетевой обработки необходимо выполнять операции передачи данных (обработка стека протоколов, копирование памяти в пространство ядра и т. д.) на ЦП как на передающей, так и на принимающей стороне. Следовательно, этот процесс увеличивает задержку. Поскольку на Sparkle могут ссылаться другие процессы, упорядочив данные в общей памяти процессом-отправителем, процесс-получатель может получить данные, обратившись к требуемой области памяти. Другими словами, каждый процесс просто помещает результат вычисления в общую память, и все процессы могут обращаться к данным без выполнения ЦП операций с данными только для передачи данных, что обеспечивает эффективную передачу и прием.

Рис. 2. Различие моделей обмена данными.

Графики результатов тестов производительности Apache Spark и Sparkle показаны на рис. 3 и 4. На рис. 3 показаны результаты сравнения производительности пяти основных процессов, включая обработку в случайном порядке. Диапазон улучшения производительности различался, поскольку отношение обработки в случайном порядке ко всей обработке различалось в зависимости от обработки. В частности, Sparkle был примерно в 6 раз быстрее, чем Apache Spark в случае ReduceBy, что привело к значительному повышению производительности. На рис. 4 показаны результаты сравнения производительности потоковой обработки с использованием Spark Streaming. В этом измерении производительность Sparkle примерно в два раза выше, чем у Apache Spark, и ожидается, что она будет эффективна для обработки со строгими требованиями к задержке.

Рис. 3. Сравнение результатов микробенчмарка. Рис. 4. Сравнение макротеста с использованием Spark Streaming.

Было подтверждено, что построение модели обмена данными с использованием общей памяти обеспечивает эффективный обмен данными и сокращение задержек, но при ее построении возникают проблемы. Одной из самых больших проблем является управление общей памятью. Обычно один и тот же файл отображается несколькими процессами при использовании общей памяти, и для доступа к области общей памяти необходимо использовать общий доступ к указателю языка C. Хотя это можно описать в общей нотации языка C, управление памятью, такое как управление доступом к общей области памяти между несколькими процессами, управление свободной областью и выделение, не поддерживается. Поэтому каждому разработчику приложений необходимо реализовать собственную функцию управления памятью, чтобы предотвратить перезапись данных и двойное выделение области памяти. Общая память также может использоваться в пределах одного сервера. Для выполнения распределенной обработки на нескольких серверах необходимо расширить функцию, чтобы включить такую ​​обработку.
Исследования программного обеспечения, которое не влияет на низкую задержку общей памяти и которое может быть легко полезно программистам, стало важным предметом исследования для достижения ориентированности на память.

3. Заключение

Результаты оценки Sparkle подтвердили эффективность использования модели обмена данными через общую память для ЦП. В качестве исследования архитектуры, ориентированной на память, мы рассмотрим возможность расширения этой модели обмена данными через общую память на другие ускорители, такие как ПЛИС, и изучим ее в качестве базовой технологии, соединяющей различные аппаратные процессы. Ориентированная на память архитектура позиционируется как элементарная технология, необходимая для разукрупненных компьютеров, поддерживающих IOWN (Innovative Optical and Wireless Network), и позиционируется как программная технология для самостоятельного использования ресурсов компьютера, а не на базе сервер-шасси. Подключая и используя ускорители без использования ЦП с помощью программного управления, мы стремимся уменьшить задержку и потребление ЦП.

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

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

Центральный процессор (ЦП)

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

Ранние компьютеры имели только один ЦП и могли выполнять только одну задачу за раз.

Сегодня мы сохраняем термин ЦП, но теперь он относится к процессорному пакету на типичной материнской плате. На рис. 1 показан стандартный пакет процессоров Intel.

Рис. 1. Процессор Intel Core i5 (Джуд МакКрени, Wikimedia Commons, CC BY-SA 4.0).

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

Как работает процессор

Давайте рассмотрим ЦП более подробно. На рис. 2 представлена ​​концептуальная схема гипотетического ЦП, позволяющая упростить визуализацию компонентов. ОЗУ и системные часы заштрихованы, поскольку они не являются частью ЦП и показаны только для ясности. Кроме того, никакие связи между часами ЦП и блоком управления с компонентами ЦП не используются. Достаточно сказать, что сигналы часов и блока управления являются неотъемлемой частью любого другого компонента.

Рисунок 2. Упрощенная концептуальная схема типичного процессора.

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

Арифметико-логическое устройство

Арифметико-логическое устройство (АЛУ) выполняет арифметические и логические функции, за которые отвечает компьютер. A и B регистры содержат входные данные, а накопитель получает результат операции. Регистр инструкций содержит инструкцию, которую должен выполнить АЛУ.

Например, при добавлении двух чисел одно число помещается в регистр A, а другое — в регистр B. АЛУ выполняет сложение и помещает результат в аккумулятор. Если операция логическая, сравниваемые данные помещаются в регистры ввода. Результат сравнения, 1 или 0, помещается в аккумулятор. Независимо от того, является ли это логической или арифметической операцией, содержимое накопителя затем помещается в ячейку кэша, зарезервированную программой для результата.

Существует еще один тип операций, выполняемых ALU. Результатом является адрес в памяти, который используется для вычисления нового местоположения в памяти, чтобы начать загрузку инструкций. Результат помещается в регистр указателя команд.

Регистр инструкций и указатель

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

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

Кэш

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

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

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

Наш простой ЦП имеет три уровня кэша. Уровни 2 и 3 предназначены для прогнозирования того, какие данные и программные инструкции потребуются в следующий раз, для перемещения этих данных из ОЗУ и перемещения их как можно ближе к ЦП, чтобы они были готовы, когда это необходимо. Эти размеры кэша обычно варьируются от 1 МБ до 32 МБ в зависимости от скорости и предполагаемого использования процессора.

Кэш уровня 1 расположен ближе всего к центральному процессору. В нашем процессоре есть два типа кеша L1. L1i — это кэш инструкций, а L1d — кэш данных. Размер кэша уровня 1 обычно составляет от 64 КБ до 512 КБ.

Блок управления памятью

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

Часы процессора и блок управления

Все компоненты ЦП должны быть синхронизированы для бесперебойной совместной работы. блок управления выполняет эту функцию со скоростью, определяемой тактовой частотой, и отвечает за управление операциями других блоков с помощью сигналов синхронизации, которые распространяются на ЦП.< /p>

Оперативная память (ОЗУ)

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

Как это работает

ЦП работают по циклу, который управляется блоком управления и синхронизируется с часами ЦП. Этот цикл называется циклом инструкций ЦП и состоит из ряда компонентов выборки/декодирования/выполнения. Инструкция, которая может содержать статические данные или указатели на переменные данные, извлекается и помещается в регистр инструкций. Команда декодируется, и любые данные помещаются в регистры данных A и B. Инструкция выполняется с использованием регистров A и B, а результат помещается в аккумулятор. Затем ЦП увеличивает значение указателя инструкции на длину предыдущего и начинает заново.

Базовый цикл инструкций ЦП выглядит следующим образом.

Рисунок 3. Базовый цикл инструкций ЦП.

Потребность в скорости

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

Ускорение цикла инструкций

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

Например, когда текущая инструкция декодирована, следующая извлекается и помещается в регистр инструкций. Как только это произошло, указатель инструкции обновляется адресом памяти следующей инструкции. Использование перекрывающихся циклов команд показано на рисунке 4.

Рисунок 4. Цикл инструкций ЦП с перекрытием.

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

Тем не менее, это мощная стратегия повышения производительности ЦП.

Гиперпоточность

Еще одна стратегия повышения производительности ЦП — гиперпоточность. Гиперпоточность заставляет одно ядро ​​процессора работать как два процессора, предоставляя два потока данных и инструкций. Добавление второго указателя инструкций и регистра инструкций к нашему гипотетическому ЦП, как показано на рис. 5, заставляет его функционировать как два ЦП, выполняя два отдельных потока инструкций в течение каждого командного цикла. Кроме того, когда один поток выполнения останавливается в ожидании данных (опять же, инструкции также являются данными), второй поток выполнения продолжает обработку. Каждое ядро, реализующее гиперпоточность, эквивалентно двум ЦП по способности обрабатывать инструкции.

Рис. 5. Концептуальная схема ЦП с технологией Hyper-Threading.

Помните, что это очень упрощенная схема и объяснение нашего гипотетического процессора. Реальность гораздо сложнее.

Дополнительная терминология

Я столкнулся с множеством различных терминов ЦП. Чтобы более точно определить терминологию, давайте рассмотрим сам ЦП с помощью команды lscpu.

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

  • Ядро. Ядро — это наименьшая единица физического оборудования, способная выполнять задачу обработки. Он содержит одно АЛУ и один или два набора вспомогательных регистров. Второй набор регистров и поддерживающих схем обеспечивает гиперпоточность. Одно или несколько ядер можно объединить в один физический пакет.
  • ЦП. Логический аппаратный блок, способный обрабатывать один поток выполнения. Современное использование термина центральный процессор относится к общему количеству потоков, которые процессорный пакет может выполнять одновременно. Одноядерный процессор, не поддерживающий гиперпоточность, эквивалентен одному процессору. В этом случае ЦП и ядро ​​являются синонимами. Процессор Hyper-Threading с одним ядром является функциональным эквивалентом двух процессоров. Процессор с поддержкой технологии Hyper-Threading с восемью ядрами функционально эквивалентен 16 процессорам.
  • Пакет – физический компонент, содержащий одно или несколько ядер, как показано на рис. 1 выше.
  • Процессор. 1) Устройство, которое обрабатывает инструкции программы для обработки данных. 2) Часто используется как синоним пакета.
  • Сокет. Иногда используется как синоним пакета, но более точно относится к физическому разъему на материнской плате, в который вставляется корпус процессора.

Термины сокет, процессор и пакет часто используются взаимозаменяемо, что может вызвать некоторую путаницу. Как видно из приведенных выше результатов команды lscpu, Intel предоставляет нам собственную терминологию, и я считаю ее авторитетным источником. На самом деле мы все используем эти термины по-разному, но если мы понимаем друг друга в любой момент времени, это действительно важно.

Обратите внимание, что указанный выше процессор имеет два кэша уровня 1 по 512 КиБ каждый: один для инструкций (L1i) и один для данных (L1d). Кэш уровня 1 находится ближе всего к ЦП, и он ускоряет работу, разделяя инструкции и данные на этом этапе. Кэши уровня 2 и уровня 3 больше, но инструкции и данные сосуществуют в каждом из них.

Что все это значит?

Хороший вопрос. На заре мейнфреймов каждый компьютер имел только один ЦП и не мог одновременно запускать более одной программы. Мейнфрейм может выполнять расчет заработной платы, затем учет запасов, затем выставление счетов клиентам и т. д., но одновременно может выполняться только одно приложение. Каждая программа должна была завершиться, прежде чем системный оператор мог запустить следующую.

В некоторых ранних попытках одновременного запуска нескольких программ применялся простой подход, направленный на более эффективное использование одного процессора.Например, программа1 и программа2 были загружены, а программа1 выполнялась до тех пор, пока не была заблокирована в ожидании ввода-вывода. В этот момент программа2 работала до тех пор, пока не была заблокирована. Такой подход назывался многопроцессорной обработкой и позволял полностью использовать ценное компьютерное время.

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

Все современные компьютеры, от смарт-часов и планшетов до суперкомпьютеров, поддерживают настоящую многозадачность с несколькими процессорами. Наличие нескольких процессоров позволяет компьютерам выполнять множество задач одновременно. Каждый ЦП выполняет свои функции одновременно со всеми остальными ЦП. Восьмиъядерный процессор с технологией Hyper-Threading (т. е. 16 ЦП) может одновременно выполнять 16 задач.

Заключительные мысли

Мы рассмотрели концептуальный и упрощенный ЦП, чтобы немного узнать о структурах. В этой статье я лишь поверхностно коснулся функциональности процессора. Вы можете узнать больше, воспользовавшись встроенными ссылками на изученные нами темы.

Помните, что схемы и описания в этой статье носят чисто концептуальный характер и не представляют реальный ЦП.

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

В самой простой архитектуре компьютерной системы все управление осуществляется ЦП (центральным процессором). Это означает не только выполнение команд, влияющих на состояние внутреннего регистра или кэша ЦП, но и передачу любых байтов из памяти на устройства, такие как хранилище и интерфейсы, такие как последовательные порты, порты USB или Ethernet. Этот подход называется «запрограммированный ввод-вывод» или PIO и широко использовался в начале 1990-х годов, например, для устройств хранения PATA, включая ATA-1, ATA-2 и CompactFlash.

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

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

Аппаратная память

В основе DMA лежит контроллер DMA: его единственная функция – настроить передачу данных между устройствами ввода-вывода и памятью. По сути, она работает как функция memcpy, которую мы все знаем и любим из C. Эта функция принимает три параметра: место назначения, источник и количество байтов, которое необходимо скопировать из источника в место назначения.

Возьмем, к примеру, Intel 8237: это контроллер прямого доступа к памяти из семейства микропроцессоров Intel MCS 85. Он имеет четыре канала прямого доступа к памяти (от DREQ0 до DREQ3) и широко использовался в IBM PC и PC XT. Объединив несколько микросхем 8237 в цепочку, можно увеличить количество каналов прямого доступа к памяти, как это было в архитектуре системы IBM PC AT. В техническом описании 8237 показано, как выглядит базовая (одна) интеграция микросхемы 8237 в систему уровня 8080:

В простом запросе контроллер прямого доступа к памяти просит ЦП отказаться от управления системными шинами (адрес, данные и управление), установив высокий уровень HRQ. После предоставления ЦП ответит на вывод HLDA, после чего будут обработаны невыполненные запросы DMA (через входы DREQx). Контроллер прямого доступа к памяти гарантирует, что после удержания шины в течение одного цикла ЦП будет использовать шину каждый второй цикл, чтобы не перегружать шину потенциально длительными запросами.

Контроллер прямого доступа к памяти 8237 поддерживает передачу отдельных байтов, а также передачу блоков. Режим запроса также позволяет осуществлять непрерывную передачу. Это позволяло передавать DMA по шине PC/PC AT («ISA»).

Перенесемся на несколько десятилетий вперед. Контроллер DMA в семействе микроконтроллеров STM32 F7 на базе Cortex-M очень похож, но в то же время сильно отличается. Этот MCU имеет не один контроллер DMA, а два (DMA1, DMA2), каждый из которых подключен к внутренним системным шинам, как описано в справочном руководстве STM32F7 (RM0385).

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

Как и в контроллере DMA Intel 8237, каждый канал подключен к определенному устройству ввода-вывода, что дает ему возможность настроить запрос DMA. Обычно это делается путем отправки инструкций соответствующему устройству, таких как установка битов в регистре, или с использованием интерфейса более высокого уровня, или как часть протокола устройства или периферийного устройства. Однако в потоке в любой момент времени может быть активен только один канал.

Однако, в отличие от более простого контроллера 8237, этот тип контроллера DMA также может использовать буфер FIFO для таких функций, как изменение ширины передачи (байт, слово и т. д.), если она различается между источником и получателем.

Когда дело доходит до наличия в системе нескольких контроллеров прямого доступа к памяти, какая-либо система приоритетов всегда обеспечивает наличие логического порядка. Для каналов либо номер канала определяет приоритет (как у 8237), либо он может быть установлен в регистрах контроллера DMA (как у STM32F7). Несколько контроллеров прямого доступа к памяти могут быть размещены в иерархии, обеспечивающей порядок. Для 8237 это достигается за счет того, что каждый каскадный 8237 использует вывод DREQx и DACKx на главном контроллере.

Слежение за автобусом

Важно синхронизировать данные кэша.

Пока все это кажется довольно простым и прямолинейным: просто передайте запрос DMA контроллеру DMA, и пусть он творит чудеса, в то время как ЦП занят чем-то более продуктивным, чем копирование байтов. К сожалению, здесь есть большая проблема в виде когерентности кеша.

По мере того, как процессоры получают все больше и больше кэшей для инструкций и данных, начиная от базового кэша уровня 1 (L1) и заканчивая более поздними кэшами L2, L3 и даже L4, данные в этих кэшах синхронизируются с данными. в основной памяти стала важной функцией.

В одноядерной однопроцессорной системе это кажется простым: вы извлекаете данные из системной ОЗУ, храните их в кеше и записываете обратно в системную ОЗУ после очередного медленного цикла доступа к этому месту в системной ОЗУ. снова открывается. Добавьте к центральному процессору второе ядро ​​с собственным кешем L1 и, возможно, L2, и внезапно вам придется синхронизировать эти два кеша, иначе любое многопоточное программное обеспечение начнет возвращать действительно интересные результаты.

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

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

Только начало

На этом этапе должно быть ясно, что каждая реализация прямого доступа к памяти отличается в зависимости от системы, для которой она была разработана, и потребностей, которые она стремится удовлетворить. В то время как контроллер DMA IBM PC и контроллер MCU на базе ARM довольно похожи по своей базовой конструкции и не сильно отличаются друг от друга с точки зрения общего набора функций, контроллеры DMA, которые можно найти и в современных настольных компьютерах. поскольку серверные системы — это совсем другое дело.

Вместо того, чтобы иметь дело со 100-мегабитным Ethernet-соединением или 12-мегабитным USB 2.0 Fast Speed, контроллеры DMA в серверных системах вынуждены конкурировать с 40-гигабитными и более быстрыми Ethernet-соединениями, бесчисленными линиями NVMe на базе PCIe 4.0 с высокой тактовой частотой. хранение и многое другое. Ни один из них не должен слишком сильно беспокоить ЦП, если это возможно.

В сфере настольных компьютеров постоянное стремление к повышению производительности, особенно в играх, привело к новой интересной главе в DMA, в форме запросов от хранилища к устройству, например. в виде технологии RTX IO от NVidia.Сам RTX IO основан на Microsoft DirectStorage API. Что делает RTX IO, так это позволяет графическому процессору обрабатывать как можно больше коммуникационных запросов на хранение и распаковку ресурсов без участия ЦП. Это избавляет от необходимости копировать данные из хранилища в ОЗУ системы, распаковывать их с помощью ЦП и затем снова записывать данные в ОЗУ графического процессора.

Атака прямого доступа к памяти

Любая хорошая и полезная функция, конечно, должна иметь несколько компромиссов, и для прямого доступа к памяти это в основном можно найти в таких вещах, как атаки прямого доступа к памяти. Они используют тот факт, что DMA обходит большую часть безопасности благодаря своей способности напрямую записывать в системную память. Обычно ОС защищает от доступа к важным частям области памяти, но DMA обходит ОС, делая такую ​​защиту бесполезной.

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

Хотя USB (в отличие от FireWire) изначально не использует DMA, добавление линий PCIe к разъемам USB-C (с Thunderbolt 3/USB 4) означает, что атака DMA через порт USB-C вполне возможна.

Подведение итогов

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

Несмотря на это, использование прямого доступа к памяти сопряжено с определенными рисками безопасности. Насколько они вызывают озабоченность, зависит от применения, обстоятельств и мер по смягчению последствий. Подобно скромной функции memcpy(), DMA — очень мощный инструмент, который можно использовать во благо или во вред, в зависимости от того, как он используется. Несмотря на то, что мы должны отмечать его существование, стоит учитывать его влияние на безопасность в любой новой системе.

16 мыслей о «Прямой доступ к памяти: передача данных без микроуправления»

Хорошая запись, кое-что узнал, так как я был знаком только с 8237 (из эпохи PC-XT, где dma также использовался для обновления DRAM (вместо выделенного контроллера DRAM).

«Они используют тот факт, что DMA обходит многие системы безопасности благодаря возможности прямой записи в системную память. Обычно ОС защищает от доступа к важным частям пространства памяти, но DMA обходит ОС, делая такую ​​защиту бесполезной».

Производительность и безопасность. Просто спросите Spectre.

Да, с FireWire это было плохо, но Thunderbolt / USB-C менее опасны, поскольку эти интерфейсы работают через IOMMU, который ограничивает области памяти, к которым может получить доступ вызов DMA. Таким образом, исключая небрежный код, неисправное оборудование или другие подобные проблемы, злоумышленник не имеет большого доступа к цели. Это позволяет получить доступ к некоторой памяти, поэтому, если у вас есть более одного периферийного устройства, подключенного к одному и тому же порту (например, один из тех концентраторов, который будет включать сетевой интерфейс, некоторые порты USB, интерфейсы дисплея и т. д.), их не так много. мог бы сделать.

Небрежный код? Когда? Ведь такое невозможно! (за исключением того, что я вижу это каждый чертов день)

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