我一直关注剑桥大学" BakePI"当然,但在确定设备的正确内存地址时,我一直在发现一些问题。
例如:在他们的课程中,他们声称系统计时器位于 0x20003000 ,但在BCM2835 ARM Peripherals datasheet上,计时器可用于位置 0x7e003000
所有其他外设(GPIO控制器等)也是如此。
现在,为什么差异以及我怎样才能翻译"从数据表到可用地址的地址?
非常感谢!
答案 0 :(得分:6)
这是因为CPU悬空在GPU侧面而不是负责东西 - ARM内存映射与GPU的总线布局不同。< / p>
从数据表的第1.2.3-1.2.4节:
物理地址范围从0x20000000到0x20FFFFFF 外设。外围设备的总线地址设置为映射到 外围总线地址范围从0x7E000000开始。这样一个 在总线地址0x7Ennnnnn处公布的外设可在 物理地址0x20nnnnnn。
[...]
本文档中指定的外围设备地址是总线地址。
答案 1 :(得分:3)
您指向的数据表显示了gpu和arm的地址映射。是的,它有点神秘,完全令人困惑......
文档是从gpu的角度编写的,其中处理器的基址在外围设备的地址空间从0x7E000000开始。 arm和gpu共享相当多的内存和外设访问,但外设被映射到ARM的地址空间,从0x20000000开始。
基本上,无论在该文档中的哪个位置,您都会看到0x7Exxxxxx,您希望从ARM编程的某些东西替换为0x20xxxxxx。就这么简单。
答案 2 :(得分:0)
根据我的理解,BCM2835 ARM外设有一个大图,第1.2节地址图解释得很好。 ARM拥有ARM虚拟内存来管理他们的软件,无论我不知道什么,我们都不需要关心它。最重要的是我们必须使用内核级设备驱动程序访问内核空间中的内存映射寄存器的总线地址。
它表示通过ARM映射MMU映射到总线地址&#34;和&#34;本文档中指定的外围设备地址是总线地址。直接访问外围设备的软件必须将这些地址转换为物理或虚拟地址,如上所述。&#34;
这意味着您看到的地址是内存映射地址(总线地址),ARM内核会自动将其转换为物理地址。
该文档有点令人困惑,您可以参考此源.dtd文件( 使用BCM2835芯片的覆盆子pi 3上的linux/arch/arm/boot/dts/bcm283x.dtsi&#34;)