Как предотвратить изменение атрибутов TLB после их установки? - PullRequest
0 голосов
/ 10 апреля 2019

Я пишу два чистых приложения для 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 подразделах, должны сделать их доступными только для чтения.Однако, если я попытаюсь записать запись в любую из таблиц позже, она все равно разрешит запись.

...