Таблица трансляции адресов🔗

Общие сведения🔗

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 Регион доступен не только ядру, но и другим агентам (например, другому ядру).
  • 1: Shareable
  • 0: Non-shareable
C Cacheable Регион кэшируем. В сочетании со значением атрибута TEX относится к внутреннему или
внешнему кэшу (Inner-Cacheable, Outer-Cacheable).
  • 1: Cacheable
  • 0: Non-сacheable
B Bufferable Регион буферируем. Имеет смысл при запросах ядра на запись.
  • 1: Bufferable
  • 0: Non-bufferable
TEX Type extension Атрибут (вместе с атрибутами C, B и частично S) задаёт модель памяти (Memory Ordering).
Полный перечень вариантов описан в документации, тут приведено описание только
используемых случаев.
  • 0b000:
    • C= 0; B = 0: Strong-ordered.
    • C= 0; B = 1: Shareable Device.
    • C= 1; B = 0: Normal, Outer and Inner Write-Through, no Write-Allocate.
    • C= 1; B = 1: Normal, Outer and Inner Write-Back, no Write-Allocate.
  • 0b1xx: 0bxx определяет Outer cacheable attribute, C и B определяют Inner cacheable
    attribute. Кодировка 0bxx:
    • 0b00: Non-cacheable.
    • 0b01: Write-Back, Write-Allocate.
    • 0b10: Write-Through, no Write-Allocate.
    • 0b11: Write-Back, no Write-Allocate.
AP Access permissions Опции доступа к региону памяти. Если APX == 0, а это именно рассматриваемый случай,
то кодировка атрибута AP для привилегированного режима (PL1) следующая:
  • 0b00: No access.
  • 0b01, 0b10, 0b11: Read/Write.
Domain Domain field Дескриптор домена памяти. Всего существует 16 доменов, каждый домен характеризуется
правами доступа, определяемыми в DACR – Domain Access Control Register. Этот регистр
является 32-разрядным, и поделён на 2-битные поля, полей 16 штук - по числу доменов.
Младшие 2 бита относятся к домену 0, следующие 2 - к домену 1 и т.д. Это двухбитное
поле кодирует права доступа к домену следующим образом:
  • 0b00: No access. Any access to the domain generates a Domain fault.
  • 0b01: Client. Accesses are checked against the permission bits in the translation tables.
  • 0b10: Reserved, effect is UNPREDICTABLE.
  • 0b11: Manager. Accesses are not checked against the permission bits in the translation tables.
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
Память является:
  • Normal
  • Inner: Write-Back, no Write-Allocate
  • Outer: Write-Back, Write-Allocate
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:
  • Slave 0
  • Slave 1
0x00c06 S=b0
TEX=b000
AP=b11
Domain=b0
C=b0
B=b1
Память является Device Memory mapped devices:
  • UART
  • USB
  • IIC
  • SPI
  • CAN
  • GEM
  • GPIO
  • QSPI
  • SD
  • NAND
  • NOR
  • APB Peripherals
0x00c0a S=b0
TEX=b000
AP=b11
Domain=b0
C=b1
B=b0
Память является:
  • Normal
  • Inner: Write-Through, no Write-Allocate
  • Outer: Write-Through, no Write-Allocate
Linear QSPI - XIP
0x04c0e S=b0
TEX=b100
AP=b11
Domain=b0
C=b1
B=b1
Память является:
  • Normal
  • Inner: Write-Back, no Write-Allocate
  • Outer: Non-cacheable
OCM когда отображена на старшие адреса