首页 > 解决方案 > 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

我真的不明白重新映射外围端口是如何工作的。

ARM1176JZF-S 技术参考手册的第 3-131 页解释了寄存器的工作原理。

位 [31:12] 设置外设端口的物理地址(如果 mmu 被禁用),位 [4:0] 确定区域大小。

所选物理地址必须与区域大小对齐。我真的不明白这是什么意思。

给定只有 20 位的地址空间 ([31:12]),如何对齐 256M 的区域大小?

在上述代码的情况下,命令执行后外设端口的实际物理地址是多少?

标签: assemblyarmv6

解决方案


给定只有 20 位的地址空间 ([31:12]),如何对齐 256M 的区域大小?

虽然手册没有明确说明这一点,但我假设 20 位是 32 位地址的高 20 位,而不是低位。

换句话说:

地址不是 20 位值本身,而是地址是 20 位值乘以 4096。

在这种情况下,如果 20 位值是 256M/4K = 65536 的倍数,则该区域将与 256M 对齐。

在上述代码的情况下,命令执行后外设端口的实际物理地址是多少?

如果我的怀疑是正确的,上面代码中的地址将是 0x70000000 而不是 0x00070000。但是,0x70000000 是 256M 的倍数。


推荐阅读