Таблица трансляции адресов🔗
Общие сведения🔗
MMU
в ARMv7
поддерживает одноуровневое и двухуровневое преобразование адресов, соответственно для каждого уровня существует своя отдельная таблица. Таблица первого уровня имеет размер 16kB
(и должна быть размещена в памяти по адресу, выровненному на границу 16kB
). Если преобразование одноуровневое, то таблица второго уровня не нужна. Таблица первого уровня нужна всегда, когда MMU
включено.
Таблица трансляции первого уровня🔗
Таблица трансляции адресов инициализирована значениями, соответствующими кодированию 1М секций. Назначение таблицы в данном случае - задание атрибутов различных регионов адресного пространства.
Ниже приведено распределение значений атрибутов по адресам секции. В столбце Address
указаны смещения, т.е реальный физический адрес элемента таблицы получается получается путём прибавления смещения к базовому адресу таблицы. SA
- Section Address, адрес секции, у каждого последующего элемента таблицы SA
равен адресу из предыдущего элемента + 0x100000
(1MB - т.е. на размер секции).
Entry Address Offset | Sections | Value | Destination Address | Device | Description |
---|---|---|---|---|---|
0x00000000-0x00000fff |
1024 | SA + 0x15de6 |
0x00000000-0x3fffffff |
OCRAM/DDR | S=b1 TEX=b101 AP=b11, Domain=b1111, C=b0, B=b1 |
0x00001000-0x00001fff |
1024 | SA + 0x00с02 |
0x40000000-0x7fffffff |
FPGA Slave0 | S=b0 TEX=b000 AP=b11, Domain=b0, C=b0, B=b0 |
0x00002000-0x00002fff |
1024 | SA + 0x00с02 |
0x80000000-0xbfffffff |
FPGA Slave1 | S=b0 TEX=b000 AP=b11, Domain=b0, C=b0, B=b0 |
0x00003000-0x000037ff |
512 | SA + 0x00000 |
0xc0000000-0xdfffffff |
Reserved | S=b0 TEX=b000 AP=b00, Domain=b0, C=b0, B=b0 |
0x00003800-0x0000380b |
3 | SA + 0x00c06 |
0xe0000000-0xe02fffff |
MMRs | S=b0 TEX=b000 AP=b11, Domain=b0, C=b0, B=b1 |
0x0000380c-0x0000383f |
13 | SA + 0x00000 |
0xe0300000-0xe0ffffff |
Reserved | S=b0 TEX=b000 AP=b00, Domain=b0, C=b0, B=b0 |
0x00003840-0x0000387f |
16 | SA + 0x00c06 |
0xe1000000-0xe1ffffff |
NAND | S=b0 TEX=b000 AP=b11, Domain=b0, C=b0, B=b1 |
0x00003880-0x000038ff |
32 | SA + 0x00c06 |
0xe2000000-0xe3ffffff |
NOR | S=b0 TEX=b000 AP=b11, Domain=b0, C=b0, B=b1 |
0x00003900-0x0000397f |
32 | SA + 0x00c06 |
0xe4000000-0xe5ffffff |
SRAM | S=b0 TEX=b000 AP=b11, Domain=b0, C=b0, B=b1 |
0x00003980-0x00003dff |
288 | SA + 0x00000 |
0xe6000000-0xf7ffffff |
Reserved | S=b0 TEX=b000 AP=b00, Domain=b0, C=b0, B=b0 |
0x00003e00-0x00003e3f |
16 | SA + 0x00c06 |
0xf8000000-0xf8ffffff |
APB Peripherals | S=b0 TEX=b000 AP=b11, Domain=b0, C=b0, B=b1 |
0x00003e40-0x00003eff |
48 | SA + 0x00000 |
0xf9000000-0xfbffffff |
Reserved | S=b0 TEX=b000 AP=b00, Domain=b0, C=b0, B=b0 |
0x00003f00-0x00003f7f |
32 | SA + 0x00c0a |
0xfc000000 - 0xfdffffff |
Linear QSPI | S=b0 TEX=b000 AP=b11, Domain=b0, C=b1, B=b0 |
0x00003f80-0x00003ffb |
31 | SA + 0x00000 |
0xfe000000-0xffefffff |
Reserved | S=b0 TEX=b000 AP=b00, Domain=b0, C=b0, B=b0 |
0x00003ffc-0x00003fff |
1 | SA + 0x04c0e |
0xfff00000-0xffffffff |
256K OCM | S=b0 TEX=b100 AP=b11, Domain=b0, C=b1, B=b1 |
Расшифровка атрибутов🔗
ID | Name | Description |
---|---|---|
S |
Shareable | Регион доступен не только ядру, но и другим агентам (например, другому ядру).
|
C |
Cacheable | Регион кэшируем. В сочетании со значением атрибута TEX относится к внутреннему или внешнему кэшу (Inner-Cacheable, Outer-Cacheable).
|
B |
Bufferable | Регион буферируем. Имеет смысл при запросах ядра на запись.
|
TEX |
Type extension | Атрибут (вместе с атрибутами C , B и частично S ) задаёт модель памяти (Memory Ordering). Полный перечень вариантов описан в документации, тут приведено описание только используемых случаев.
|
AP |
Access permissions | Опции доступа к региону памяти. Если APX == 0 , а это именно рассматриваемый случай, то кодировка атрибута AP для привилегированного режима (PL1 ) следующая:
|
Domain |
Domain field | Дескриптор домена памяти. Всего существует 16 доменов, каждый домен характеризуется правами доступа, определяемыми в DACR – Domain Access Control Register. Этот регистр является 32-разрядным, и поделён на 2-битные поля, полей 16 штук - по числу доменов. Младшие 2 бита относятся к домену 0, следующие 2 - к домену 1 и т.д. Это двухбитное поле кодирует права доступа к домену следующим образом:
|
nG | Non-Global | Имеет смысл в многопроцессной ОС. Если если значение равно 0 , то регион доступен всем процессам, если значение равно 1 , то регион доступен только одному процессу - в этом случае дополнительно используется Address Space ID (ASID ) |
xN | Execute Never | Будучи установленным, предотвращает спекулятивное чтение инструкций из региона памяти. Типовое применение – обозначить device memory regions для защиты от случайной попытки выполнения программы из этих регионов. |
Резюме🔗
Все домены в данной программе установлены в режим Manager
, поэтому доступ к ним разрешён безотносительно к значениям атрибутов AP
, указанных в дескрипторах секций.
В вышеописанной таблице все регионы (секции) памяти описаны с использованием следующего набора значений (приведена только часть, описывающая свойства секции, без адреса:
Value | Attributes | Description | Device |
---|---|---|---|
0x15de6 |
S=b1 TEX=b101 AP=b11 Domain=b1111 C=b1 B=b1 |
Память является:
|
OCR/DDR |
0x00000 |
S=b0 TEX=b000 AP=b00 Domain=b0 C=b0 B=b0 |
Память является Strongly-ordered |
Reserved |
0x00c02 |
S=b0 TEX=b000 AP=b11 Domain=b0 C=b0 B=b0 |
Память является Strongly-ordered |
FPGA:
|
0x00c06 |
S=b0 TEX=b000 AP=b11 Domain=b0 C=b0 B=b1 |
Память является Device |
Memory mapped devices:
|
0x00c0a |
S=b0 TEX=b000 AP=b11 Domain=b0 C=b1 B=b0 |
Память является:
|
Linear QSPI - XIP |
0x04c0e |
S=b0 TEX=b100 AP=b11 Domain=b0 C=b1 B=b1 |
Память является:
|
OCM когда отображена на старшие адреса |