sysSecondLvlPtStart не влез куда надо, видимо, по той причине, что его пытались запихнуть в OCM, размером 192кб.
А это - специальная микросхема памяти, которая есть в Zynq, и, видимо, занимает адреса от 0 (Platform.OCMStart = 0).
Теперь всё же придётся разобраться, куда можно поместить таблицу страниц в RPi.
Имеем:
Для управления системой(в т.ч. блоком MMU) в архитектуре ARM предназначен специальный сопроцессор CP15. К управлению памятью относятся полтора десятка его регистов. Нас интересуют несколько из них — Control, TTBR0/1, TTBCR, ContextID.
P15 в ЯОС - как-то соотносится с CP15 (ищем в коде EnterCoprocessor(CP15, "P15");
Далее, имеем такой код (RPI.CPU.Mod/EnableMemoryManagementUnit)
Код: Выделить всё
проц EnableMemoryManagementUnit-;
машКод
load:
LDR R0, [PC, #page-$-8]
MCR P15, 0, R0, C2, C0, 0
B grant
page:
d32 pageTable
grant:
MOV R0, #0b11
MCR P15, 0, R0, C3, C0, 0
enable:
MRC P15, 0, R0, C1, C0, 0
ORR R0, R0, #0b1 ; memory protection
ORR R0, R0, #0b100 ; data and unified cache
ORR R0, R0, #0b100000000000 ; branch prediction
ORR R0, R0, #0b1000000000000 ; instruction cache
MCR P15, 0, R0, C1, C0, 0
кон EnableMemoryManagementUnit;
Здесь pageTable - это просто статическая переменная с каким-то (каким попало) адресом:
Код: Выделить всё
перем pageTable {выровнять (4000H)}: запись entry: массив 4096 из размерМЗ кон;
Хаа, такая же нашлась и в ARM.Machine.Mod, но она содержит адреса:
Код: Выделить всё
pageTable: запись virtual, memory: адресВПамяти кон;
при этом ожидаемо (ARM.Machine.Mod):
Код: Выделить всё
pageTable.virtual := sysFirstLvlPtStart;
pageTable.memory := sysFirstLvlPtStart;
Значит, раз в RPI нет какого-то особого (ускоряющего) места для этой таблицы, то нам нужно создать две переменных для таблиц
первого и второго уровня и передать их адреса. А переменные sysFirstLvlPt* упразднить.