Политика записи кэша: 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 остаётся.
Источники
- 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 — сквозными
- 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
- 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 — принудительная сквозная запись
- Arm. CMSIS 5.9.0, CMSIS/Core/Include/core_cm7.h (V5.1.6, 04 June 2021) — регистр SCB->CACR: бит 2 FORCEWT, бит 0 SIWT
Нашли ошибку?
Смотрите также
- Кэш L1 Cortex-M7 (I-cache, D-cache)Раздельные кэши команд и данных ядра Cortex-M7: строка 32 байта
- Когерентность кэша (cache coherency)Согласование кэша ядра с памятью, в которую пишет DMA
- Типы памяти Arm (Normal, Device, Strongly-ordered)Normal, Device и Strongly-ordered: как ядро обращается к памяти и периферии
- Блок защиты памяти (MPU)Права доступа к областям памяти в Cortex-M
- Буфер записи Cortex-M7 (store buffer)Очередь записей между ядром Cortex-M7 и памятью: слияние и опустошение
- STM32H7Cortex-M7 от 280 до 600 МГц, двухъядерные H745/H747 — линейки, память, загрузка и распиновки