Переназначение и выравнивание периферийных портов на armv6

#assembly #armv6

#сборка #armv6

Вопрос:

В загрузчике старого планшета Android я обнаружил блок кода, который отключает mmu, а затем переназначает периферийный порт (происходит переход в режим супервизора, но не отображается).

 ROM:00000064  MOV R0, #0               ; r0 = 0
ROM:00000068  MCR p15, 0, R0,c7,c7, 0  ; invalidate instruction and data cache
ROM:0000006C  MCR p15, 0, R0,c8,c7, 0  ; invalidate tlb
ROM:00000070  MRC p15, 0, R0,c1,c0, 0  ; load the control register
ROM:00000074  BIC R0, R0, #0x2300      ; clear s, r, and v bits (mmu protection disabled, rom protection disabled, select normal exception vector location)
ROM:00000078  BIC R0, R0, #0x87        ; clear m, a, c, and b bits (disable mmu, disable strict alignment fault checking, disable data cache, little endian operation)
ROM:0000007C  ORR R0, R0, #2           ; set bit a (enable strict alignment fault checking)
ROM:00000080  ORR R0, R0, #0x1000      ; set bit I (enable level one instruction cache)
ROM:00000084  MCR p15, 0, R0,c1,c0, 0  ; update control register
ROM:00000088  MOV R0, #0x70000013      ; physical address = 0x70000, region size = 256M
ROM:00000090  MCR p15, 0, R0,c15,c2, 4 ; peripheral port remapped
  

Я не совсем понимаю, как работает переназначение периферийного порта.

Страница 3-131 технического справочного руководства ARM1176JZF-S объясняет, как работает регистр.

Биты [31:12] задают физический адрес периферийного порта (если mmu отключен), а биты [4: 0] определяют размер области.

Выбранный физический адрес должен быть выровнен по размеру региона. Я не совсем понимаю, что это значит.

Учитывая только 20 бит адресного пространства ([31: 12]), как выполнить выравнивание до размера области 256M?

В случае приведенного выше кода, каков фактический физический адрес периферийного порта после выполнения команды?

Ответ №1:

Учитывая только 20 бит адресного пространства ([31: 12]), как выполнить выравнивание до размера области 256M?

Хотя в руководстве это явно не указано, я предполагаю, что 20 бит являются старшими 20 битами 32-разрядного адреса, а не младшими.

Другими словами:

Адрес — это не само 20-битное значение, а адрес — это 20-битное значение, умноженное на 4096.

В этом случае область будет выровнена до 256M, если 20-битное значение кратно 256M / 4K = 65536.

В случае приведенного выше кода, каков фактический физический адрес периферийного порта после выполнения команды?

Если мои подозрения верны, адрес в приведенном выше коде будет 0x70000000, а не 0x00070000. Однако 0x70000000 кратно 256M.

Комментарии:

1. Да, это довольно очевидный вывод, особенно учитывая, где они решили поместить это поле (в верхней части регистра)! Таким образом, это больше похоже на то, что регистр содержит адрес, выровненный по 4k, с младшими 12 битами, используемыми для других целей.