Я пишу два чистых приложения для Zynq ZC702, по одному для каждого процессора.Я буду называть их app0 и app1, работающими на CPU0 и CPU1 соответственно.Каждое приложение должно иметь выделенные области памяти DDR, которые другое не может прочитать.Так, например, если выделенный регион app1 имеет значение от 0x18000000 до 0x20000000, то во время инициализации app0 я установлю 128 соответствующих записей (1 на МБ) в TLB CPU0, чтобы пометить область как недоступную (атрибуты всех нулей, вызывая прерывание данных при попытке любого доступа).
Это работает, однако TLB в памяти все еще можно изменить, чтобы удалить эту защиту.Я пытаюсь найти способ защиты TLB, такой как установка его атрибутов только для чтения, возможно, с таблицей L2 для степени детализации 4 КБ, хотя таблица L2 должна была бы сделать себя также только для чтения,Таблица L1 имеет размер 16 КБ, а таблица L2 - 1 КБ, поэтому их можно охватить всего 5 записями L2. Но я не уверен, как назначить таблицы местам вне памяти приложения, чтобы дополнительные 3 КБ, сделанные только для чтения 5-й записью L2, не содержали ничего важного.
Я получил некоторую информацию из своей ветки на форумах Xilinx , но я не уверен, что я на правильном пути.Я чувствую, что есть более подходящий способ сделать это.Я использую Xilinx SDK 2017.2 с BSP по умолчанию для каждого ядра.
Я добавил таблицу L2 в раздел .mmu_tbl, определенный в translation_table.S в BSP.Вот некоторый код, который я добавил к загрузке по умолчанию. Незадолго до включения MMU.Я прошел, чтобы убедиться, что записи L2 обновлены, как и ожидалось.
protect_tables:
/* Map L2 table to L1 entry */
ldr r0, =TblBase
ldr r1, =L2Base
lsr r3, r0, #20 /* get section number where the MMU Table is held */
lsl r3, r3, #2 /* multiply by 4 to get offset into MMU Table */
add r3, r0, r3 /* address of entry in MMU table that covers itself */
ldr r6, =0x1e1 /* Domain=b1111 */
add r2, r1, r6 /* combine L2Base address with domain info to create the entry */
str r2, [r3] /* Write entry in MMU table */
/* Set up L2 Table to protect MMU table and itself */
and r3, r0, #0x000ff000 /* 4KB subsection where MMU table starts */
lsr r3, r3, #10 /* offset into L2 Table */
add r3, r1, r3 /* address of entry in L2 table that covers first 4KB of MMU table */
ldr r6, =0x366 /* S=b0 TEX=b101 AP=b110, C=b0, B=b1 */
add r2, r0, r6 /* combine address and attributes to create an entry */
ldr r4, =5 /* loop control. Store 5 consecutive entries */
mmu_protection_loop:
str r2, [r3] /* write the entry to L2 table */
add r3, r3, #4 /* next entry in the table */
add r2, r2, #0x1000 /* next 4KB subsection */
subs r4, r4, #1
bgt mmu_protection_loop
Атрибуты, которые я установил в этих 5 подразделах, должны сделать их доступными только для чтения.Однако, если я попытаюсь записать запись в любую из таблиц позже, она все равно разрешит запись.