Зачем заполнять «0x50C06» для записи таблицы страниц уровня 1?

Зачем заполнять запись таблицы значением 0x50C06 в следующем коде?

    TTB_ENTRY_SUPERSEC_DEV  DEFINE   0x50C06 
                                           ; Setup page table.
    LDR     r0,=SFE(MMU_TT)                     ; Load page table base address


                                                ; Init the whole page table as dev memory by default
    MOV     r4, #0x00000000
    MOV     r3, r0
    ADD     r3, r3, #0x0

TTbl_Dev_Loop1
    MOV32   r1, #TTB_ENTRY_SUPERSEC_DEV
    ADD     r1, r1, r4
    MOV     r5, #16
TTbl_Dev_Loop2
    STR     r1, [r3], #4
    SUBS    r5, r5, #1
    BNE     TTbl_Dev_Loop2
    ADD     r4, r4, #0x1000000
    CMP     r4, #0x0
    BNE     TTbl_Dev_Loop1

person freebigfish    schedule 09.09.2019    source источник
comment
SFE — это псевдо-операция ассемблера IAR, которая дает основу секции компоновщика; поэтому MMU_TT должен быть адресом компоновщика, и этот код предназначен для ассемблера IAR ARM.   -  person artless noise    schedule 10.09.2019


Ответы (1)


таблица страниц ARM первого уровня содержит разделы и надразделы.

Bits    |31   24|  20|19|18|17|16| 15|14 12|11 10|9|8    5| 4|3|2|1|0
--------+------------+--+--+--+--+---+-----+-----+-+------+--+-+-+-+-
Section |Base address|NS| 0|nG| s|APX|  TEX|   AP|P|Domain|XN|C|B|1|0
Super   |Base   | SBZ|NS| 1|nG| s|APX|  TEX|   AP|P|Ignore|XN|C|B|1|0
0x50C06 |            | 0| 1| 0| 1|0  |  000|   11|0|  0000| 0|0|1|1|0
is super|            |  | *|...

Они позволяют отображать большую часть памяти 16 МБ за раз. Каждая запись таблицы первого уровня представляет 1 МБ адресного пространства. Суперразделы повторяют это 16 раз, что в сумме составляет 16 МБ. Это код,

    MOV     r5, #16         ; 16 entries.
TTbl_Dev_Loop2
    STR     r1, [r3], #4    ; write entry
    SUBS    r5, r5, #1      ; decrement and test for zero.
    BNE     TTbl_Dev_Loop2  ; branch if more needed.

Остальная часть кода просто меняет базу с помощью регистра r4. ADD r4, r4, #0x1000000 шаг за шагом 16MB через адресное пространство. Таким образом, это сопоставляет все виртуальные адреса с физическими адресами. Это часто используется во время загрузки системы, когда MMU впервые включается и можно включить кеш. Типичные устройства не имеют 4 ГБ фактической физической памяти (и периферийных устройств), поэтому неиспользуемые физические адреса можно повторно использовать, обновив таблицу. Также можно изменить суперразделы , чтобы иметь записи таблицы страниц (таблицы страниц l2 с размером 4–64 КБ) во время работы системы.

Также кажется, что вся память настроена на память устройства (по крайней мере, для запуска), поэтому не будет использоваться какой-либо тип кэширования. Некоторые из этих других битов (AP, TEX и т. д.) зависят от значений регистра CP15, которые не показаны.

См. также: memo">Сопоставление ARMv7 "один к одному"
Изменить TTB_BASE
Пейджинг ARM

person artless noise    schedule 09.09.2019
comment
Ваш загрузочный код (или что бы это ни было) может работать значительно быстрее, если вы включите кеш. Обычно от 2 до 10 раз быстрее в зависимости от обстоятельств. Конечно, кеш может вызвать проблемы, но обычно это связано с каким-то плохим программированием, когда ошибка может возникать в любом случае, но реже. - person artless noise; 10.09.2019
comment
Спасибо!Эта проблема беспокоила меня давно, так как я не знаю где найти соответствующую информацию из мануала.。 - person freebigfish; 12.09.2019
comment
Да, это справочные руководства, а не учебники для обучения, поэтому информация находится повсюду. - person artless noise; 12.09.2019