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