Перейти к содержанию

Политика записи кэша: write-through и write-back

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

Обновлено Редакция GAW

Политика записи кэша определяет, что происходит, когда ядро записывает данные по адресу, который уже есть в кэше данных:

  • Write-through (сквозная запись). Данные пишутся и в кэш, и сразу в память. По TRM Cortex-M7 запись при этом дополнительно выполняется на шине AXIM, и память остаётся когерентной с кэшем.
  • Write-back (отложенная запись). Данные пишутся только в кэш, строка помечается «грязной» и попадает в память лишь при вытеснении — через буфер записи интерфейса AXIM.

Вторая ось — write-allocate: выделять ли строку кэша при промахе на записи. По Armv7-M ARM Normal-память бывает Write-Through cacheable, Write-Back cacheable с write-allocate или без, и Non-cacheable.

Как ведёт себя Cortex-M7

Атрибут областиПопадание при записиПромах при записи
Write-Throughзапись в кэш и на AXIMзапись на AXIM, кэш не меняется
Write-Back, no Write-Allocateзапись в кэш, строка грязнаязапись на AXIM
Write-Back, Write-Allocateзапись в кэш, строка грязнаязаполнение строки, затем слияние данных
Non-cacheable—запись на AXIM

Все записи на стороне данных, кроме записей в TCM и в периферию AHBP, проходят через буфер записи: он объединяет соседние записи и сливает их в кэш или на шину.

Где задаётся

Атрибуты областей задаёт MPU или, если он выключен, стандартная карта памяти; по AN4839 в ней область Code 0x00000000–0x1FFFFFFF — Normal, Non-shareable, write-through. Бит FORCEWT регистра SCB->CACR принудительно делает сквозной запись во все кэшируемые области. Политика прямо влияет на когерентность кэша: с write-back ядро должно делать clean перед передачей буфера DMA, со write-through — нет. Подробнее о типах памяти — в статье «Типы памяти Arm».

Частые вопросы

Что быстрее — write-through или write-back?

Обычно write-back: повторные записи в одну строку остаются в кэше, и шина занимается только при вытеснении строки. Write-through отправляет каждую запись на шину AXIM, зато память всегда совпадает с кэшем. AN4839 ST не называет победителя: у каждого режима свои плюсы и минусы, и выбор зависит от задачи.

Что такое write-allocate?

Правило для промаха при записи. Если область помечена Write-Allocate, кэш данных Cortex-M7 при записи в отсутствующую строку сначала загружает строку из памяти, а потом объединяет с ней записанные данные. Без Write-Allocate запись при промахе просто уходит на шину, а кэш не меняется. Чтение при промахе выделяет строку всегда.

Как сделать всю кэшируемую память сквозной на Cortex-M7?

Установить бит FORCEWT в регистре SCB->CACR: он принудительно включает сквозную запись для всех кэшируемых областей. ST предлагает этот путь как одно из решений проблемы когерентности с DMA: тогда clean перед передачей не нужен, но invalidate перед чтением данных DMA остаётся.

Источники

  1. Arm. Cortex-M7 Processor Technical Reference Manual r1p2 (DDI 0489F), разд. «L1 caches», «Store buffer», «L1 Cache Control Register» — запись, попавшая в кэш данных, пишется в RAM кэша; при Write-Through она дополнительно выполняется на AXIM, и память остаётся когерентной; при Write-Back строка помечается грязной и уходит в память только при вытеснении через буфер записи AXIM; кэш данных выделяет строку при записи, если память помечена Write-Allocate; Write-Back Write-Allocate промах при записи запускает заполнение строки, а Non-cacheable, Write-Through и Write-Back без Write-Allocate промахи идут на AXIM; CM7_CACR: бит 2 FORCEWT — все кэшируемые области обрабатываются как Write-Through, сброс в 0; бит 0 SIWT — при 0 Normal Cacheable Shared области считаются некэшируемыми, при 1 — сквозными
  2. Arm. Armv7-M Architecture Reference Manual (DDI 0403E.e), разд. A3.5.4 «Normal memory» — Normal-память бывает Write-Through cacheable, Write-Back cacheable с уточнением Write-Allocate или no Write-Allocate, и Non-cacheable
  3. STMicroelectronics. AN4839 Level 1 cache on STM32F7 Series and STM32H7 Series, Rev 2 (March 2018) — разд. 2: запись либо проходит в память (write-through), либо остаётся в кэше для последующей записи (write-back), у каждого режима свои плюсы и минусы; табл. 2: при выключенном MPU область Code 0x00000000–0x1FFFFFFF — Normal, Non-shareable, WT; разд. 3.2: одно из решений проблемы когерентности с DMA — принудительная сквозная запись
  4. Arm. CMSIS 5.9.0, CMSIS/Core/Include/core_cm7.h (V5.1.6, 04 June 2021) — регистр SCB->CACR: бит 2 FORCEWT, бит 0 SIWT

Нашли ошибку?