armv6上的外设端口重映射和对齐
Peripheral port remapping and alignment on 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 Technical Reference Manual 的第 3-131 页解释了寄存器的工作原理。
位 [31:12] 设置外设端口的物理地址(如果禁用了 mmu),位 [4:0] 确定区域大小。
所选物理地址必须与区域大小对齐。我真的不明白这是什么意思。
仅给定 20 位地址 space ([31:12]),如何对齐 256M 的区域大小?
以上代码为例,命令执行后外设端口的实际物理地址是多少?
Given only 20 bits of address space ([31:12]), how do you align to a region size of 256M?
虽然手册上没有明确说明,但我假设这20位是32位地址的高20位,而不是低位。
换句话说:
地址不是20位值本身,而是20位值乘以4096后的地址。
在这种情况下,如果 20 位值是 256M/4K = 65536 的倍数,则该区域将对齐到 256M。
In the case of the above code, what is the actual physical address of the peripheral port after the command has been executed?
如果我的猜测是对的,上面代码中的地址应该是 0x70000000 而不是 0x00070000。但是,0x70000000 是 256M 的倍数。
在旧 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 Technical Reference Manual 的第 3-131 页解释了寄存器的工作原理。
位 [31:12] 设置外设端口的物理地址(如果禁用了 mmu),位 [4:0] 确定区域大小。
所选物理地址必须与区域大小对齐。我真的不明白这是什么意思。
仅给定 20 位地址 space ([31:12]),如何对齐 256M 的区域大小?
以上代码为例,命令执行后外设端口的实际物理地址是多少?
Given only 20 bits of address space ([31:12]), how do you align to a region size of 256M?
虽然手册上没有明确说明,但我假设这20位是32位地址的高20位,而不是低位。
换句话说:
地址不是20位值本身,而是20位值乘以4096后的地址。
在这种情况下,如果 20 位值是 256M/4K = 65536 的倍数,则该区域将对齐到 256M。
In the case of the above code, what is the actual physical address of the peripheral port after the command has been executed?
如果我的猜测是对的,上面代码中的地址应该是 0x70000000 而不是 0x00070000。但是,0x70000000 是 256M 的倍数。