Изменение некоторых записей таблицы перевода MMU - правильный путь?

Какие шаги для обновления записей в таблице перевода?

Я использую MMU ARM920T для защиты памяти. Когда я переключаюсь между процессами, мне нужно изменить некоторые записи, чтобы защитить память других процессов. После обновления таблицы (в памяти) я выпускаю полную аннулирование TLB (просто чтобы убедиться, что нет также заблокированных записей), но новый процесс все еще имеет доступ к данным предыдущего.

Когда я пересекаю таблицу, все выглядит так, как должно (что означает, что другие области процесса установлены как "недоступные в режиме USR").

Редактировать Я также делаю полную очистку и аннулирование кеша (на обоих кешах) до аннулирования TLB, но это ничего не меняет.

2 ответа

TLB - не единственная вещь, которую необходимо поддерживать после изменения страницы, особенно те, которые содержат исполняемый код. Во-первых, вам нужно убедиться, что ваши изменения распространяются на физическую память (т. Е. Очистить кэшированную область, указывая на измененные вами таблицы страниц). Вам нужно будет сделать недействительным кеш инструкций, так как он может содержать строки из старой области кода. В зависимости от типа кэша может потребоваться очистить кэш данных перед обновлением таблиц страниц и сделать недействительными кэш-память данных после изменения. Наконец, вам необходимо убедиться в наличии достаточного количества барьеров для принудительного завершения операций в указанном вами порядке.

Вы должны отобразить область, где ваши таблицы страниц расположены по строгим причинам, по ряду веских причин, это немного ухудшит вашу производительность, но все же должно быть лучше, чем очистка полного кэша после записи в таблицу или создания барьера памяти.

Я не совсем понимаю, что вы пытаетесь спросить, или где именно у вас проблемы, но это то, что я использую в одном из моих программ:

.align
arch_mmu_map_section:
#if ARM_WITH_MMU
    ldr     r3, =MMU_TLB          @ r3 = &table
    add     r1, r3, r1, lsr #18   @ r1 = &table + offset(entry)
    ldr     r3, =0xFFFFF          @ r3 = (1<<20) - 1
    bic     r0, r0, r3            @ Align r0 to 1 MB
    orr     r0, r0, r2            @ ORR the flags
    str     r0, [r1]              @ Write entry to r1, pointer to entry
    @ Invalidate UTLB
    mov     r3, #0
    mcr     p15, 0, r3, c8, c7, 0
#endif
    bx      lr

MMU_TLB является указателем на таблицу и отображается в строгом порядке во время mmu_init. Прототип для этой функции будет

void arch_mmu_map_section(addr_t paddr, addr_t vaddr, uint flags);
Другие вопросы по тегам