3. Cache

Память (по убыванию скорости и цены и возрастанию размера):

Регистры процессора - самая быстрая, самая дорогая и самая маленькая память
Кэш
Оперативная память
Внешняя память


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

Типы кэш-памяти:
- полностью ассоциативная — каждая линия привязана к адресу - прямого отображения — вся память привязана к одному адресу - ассоциативная по множеству (целые куски памяти привязаны к разным адресам) 1) Гарвардская архитектура кэша — раздельные кэши для инструкций и данных. Самомодифицирующийся код сам отвечает за когерентность кэша инструкций и данных (использует инструкции очистки кэша). 2) Фон Нойманновская архитектура — единый кэш ARM: Кэш — ассоциативный по множеству из 4 линий. Линия — 8 4-байтных слов (32 байта). Размер кэш-памяти для инструкций и для данных выбирается независимо из следующих значений: 0, 4, 8, 16, 32, 64, 128, 256, 512 KB, 1MB Операции с кэш-памятью выполняются через сопроцессор 15:

MCR{cond} P15, opcode_1, Rd, CRn, CRm, opcode_2
MRC{cond} P15, opcode_1, Rd, CRn, CRm, opcode_2 Регистры CRn (c: 0-15) - регистры сопроцессора: 0 - read cache type 1 - read/write control 7 - write cache operations 9 - cache lockdown CRm, opcode_2действие:
1) Регистр 0, чтение: тип кэш-памяти

31

30

29

28 ... 25 (4)

24

23 ... 12 (12)

11 ... 0 (12)

0

0

0

ctype

S

Dsize

Isize

Ctype - тип кэш-памяти
S bit - объединенный или раздельный (Separate) для инструкций и данных (1 - Harvard cache)
Dsize - размер, длина линии и ассоциативность кэша данных
Isize - --"--"--" инструкций

Формат полей Dsize и Isize:

11

10

9

8 ... 6 (3)

5 ... 3 (3)

2

1 0 (2)

0

0

0

Size

assoc

M

len

Size - размер кэша в КБ (в конъюнкции с битом M) (например, 100+0=8КБ)
Assoc - ассоциативность (в сочетании с битом M) (например, 110+0 = 64-way)

000 - Direct mapped
001 - 2-way
010 - 4-way
...
111 - 128-way

Len - длина линии кэша:
00 - 2 words
01 - 4 words
10 - 8 words
11 - 16 words

2) Регистр 1, чтение и запись: контрольный регистра

Биты

Название

Функция

Значение

31

iA

Asynchronous clock select


30

nF

noFastBus select


29-15


Reserved


14

RR

Round robin replacement

0 = Random replacement

1 = Round-robin replacement

13

V

Base location of exception register

0 = Low address - 0x00000000

1 = Hight address = 0xFFFF0000

12

I

ICache enabled

0 = ICache enabled

1 = ICache disabled

11:10


Reserved


9

R

ROM protection

Modifies MMU protection system

8

S

System protection

Modifies MMU protection system

7

B

Endianness

0 = Little-endian operation

1 = Big-endian operation

6:3


Reserved


2

C

DCache enabled

0 = DCache enabled

1 = DCache disabled

1

A

Alignment fault enable

Data address alignment fault checking.

0 = Fault checking disabled

1 = Fault checking enabled

0

M

MMU enable

0 = MMU disabled

1 = MMU enabled

ICache м.б. enabled при disabled MMU. В этом случае физический адрес is flat-mapped to the MVA (modified virtual address).
DCache - enabled только при enabled MMU (так как конфигурация DCache и буфера записи конфигурируется таблицей трансляции MMU для каждого региона памяти).

3) Регистр 7, запись: операция с кэш

Функция

Данные

Команда

Invalidate ICache and DCache

SBZ

MCR p15, 0, Rd, c7, c7, 0

Invalidate ICache

SBZ

MCR p15 0, Rd, c7, c5, 0

Invalidate ICache single entry (using MVA)

MVA format

MCR p15 0, Rd, c7, c5, 1

Prefetch ICache line (using MVA)

MVA format

MCR p15 0, Rd, c7, c13, 1

Invalidate DCache

SBZ

MCR p15 0, Rd, c7, c6, 0

Invalidate DCache single entry (using MVA)

MVA format

MCR p15 0, Rd, c7, c6, 1

Clean DCache single entry (using MVA)

MVA format

MCR p15 0, Rd, c7, c10, 1

Clean DCache and invalidate single entry (using MVA)

MVA format

MCR p15 0, Rd, c7, c14, 1

Clean DCache single entry (using index)

Index format

MCR p15 0, Rd, c7, c10, 2

Clean DCache and invalidate single entry (using index)

Index format

MCR p15 0, Rd, c7, c14, 2

Drain write buffer

SBZ

MCR p15 0, Rd, c7, c10, 4

Wait for interrupt

SBZ

MCR p15 0, Rd, c7, c0, 4

SBZ - Should be zero

Формат MVA регистра 7:

31 ... 5

4 ... 0

Modified virtual address

SBZ

Индексный формат регистра 7:

31 ... 26

25 ... 7

6 5

4 ... 0

Index

SBZ

Seg

SBZ


4) Регистр 9: ICache lockdown - для критичных кусков кода, работающих в реальном времени: оптимальное и предсказуемое время выполнения.
Алгоритм замещения - псевдо-случайный (pseudo-random) или круговой (round-robin).
Процедура, выполняющая lockdown, не должна размещаться в кэш-памяти или в той линии, которая будет замещена (переписана).

a) Сбросить весь ICache или только линию:

MCR p15, 0, Rd, c7, c5, 0 ; Invalidate ICache
MCR p15, 0, Rd, c7, c5, 1 ; Invalidate ICache line using MVA b) ICache lockdown routine: ADRL r0, start_address ADRL r1, end_address MOV r2, #lockdown_base<<26 ; victim point loop: MCR p15, 0, r0, c7, c13, 1 ; Prefetch ICache line ADD r0, r0, #32 ; increment address pointer to next ICache loop AND r3, r0, #0x60 ; extract the segment line from the address CMP r3, #0 ; test for segment 0 ;; do we need to increment the victim pointer? ;; test for segment 0, and if so, increment the victim pointer ;; and write ICache victim and lockdown base ADDEQ r2, r2, #0x1<<26 ; if segment 0, increment victim pointer MCREQ p15, 0, r2, c9, c0, 1 ; and write ICache victim and lockdown base ;; have we linefield enough code? ;; test for the address pointer being less than or equal to the ;; end_address and if so, loop and perform another linefill CMP r0, r1 ; test for less than or equal to end_address BLE loop ; if not, loop ;; have we exited with r3 pointing to segment 0? ;; if so, the ICache victim and lockdown base has already been set to one ;; higher than the last entry written ;; if not, increment the victim pointer and write ICache victim and lockdown base CMP r3, #0x0 ; test for segments 1 to 3 ADDNE r2, r2, @0x0<<26 ; of address is segment 1 to 3 MCRNE p15, 0, r2, c9, c0, 1 ; write ICache victim and lockdown base DCache + буфер записи ARM 922T - 8KB: 256 линий по 8 слов (32 байт): 4 сегмента, ассоциативная по множеству из 64 линий Буфер записи: до 16 слов данных + 4 отдельных адресации Каждая линия имеет: - два бита dirty: для первых 4 слов и для последних 4 слов - один виртуальный TAG адрес и бит валидности для всей 8-словной линии Если линия должна быть замещена или очищена - бит dirty используется для определения необходимости записи в память всего слова, половины или ничего ============================================================================= Вопросы: 1. Какие области памяти не должны быть кэшированы? (DMA - Direct Memory Access) 2. Почему в TTB_SDRAM кэшируются только нижние адреса (до 0x0FFFFFFF)? Таблица TTB (файл TtbSdram.arm). ================================================================

; This module defines TtbSdram - TTB for ARM booted from SDRAM. It enables

; caching for 0x00000000 - 0x0FFFFFFF range and disables for all others


.section .ttb



; Level one fetch

; Translation table


.globl TtbSdram

TtbSdram:

DCD 0x00000D9E

DCD 0x00100D9E

DCD 0x00200D9E

DCD 0x00300D9E

DCD 0x0FD00D9E

DCD 0x0FE00D9E

DCD 0x0FF00D9E

DCD 0x10000D92

DCD 0x10100D92

DCD 0x10200D92

DCD 0xFFE00D92

DCD 0xFFF00D92

.type TtbSdram, $object

.size TtbSdram, . - TtbSdram