我一直在遵循剑桥大学的"BakePI“课程,但在确定设备的正确内存地址时,我发现了一些问题。
例如:在他们的路线上,他们声称系统定时器位于位置0x20003000,但在BCM2835 ARM外设数据表上,定时器据说在位置0x7e003000上可用。
所有其他外设(GPIO控制器等)都是一样的。
现在,为什么不同,我如何“将”地址从数据表“转换”到一个可用地址?
非常感谢!
发布于 2014-03-11 21:51:08
这是CPU脱离GPU而不是负责事务的结果-- ARM内存映射与GPU的总线布局不同。
来自数据表1.2.3-1.2.4节:
外设的物理地址从0x20000000到0x20FFFFF不等。外围设备的总线地址设置为映射到从0x7E000000开始的外围总线地址范围。因此,在总线地址0x7Ennnnnn上广告的外围设备可以在物理地址0x20nnnnn上使用。 ..。 本文档中指定的外围地址是总线地址.
发布于 2014-03-12 01:46:12
指向的数据表显示gpu和arm的地址映射。是的,它有点神秘,完全令人困惑.
文档是从gpu的角度编写的,在gpu中,处理器地址空间中的基地址从0x7E000000开始。arm和gpu共享相当多的内存和外设访问,但外围设备从0x20000000开始映射到ARM的地址空间。
基本上,在文档中的任何地方,您都可以看到0x7Exxxxxx用于从ARM中编程,将其替换为0x20xxxxx。就这么简单。
发布于 2017-09-04 07:58:02
据我理解,有一幅BCM2835 ARM外围设备的大图,第1.2节地址映射解释得很好。ARM有它的ARM虚拟内存来管理他们的软件,不管我不知道什么,我们也不需要去关心它。最重要的是总线地址,我们必须使用内核级设备驱动程序访问内核空间中的内存映射寄存器。
它说“通过ARM映射MMU映射到总线地址”和“本文档中指定的外围地址是总线地址。直接访问外围设备的软件必须将这些地址转换成物理地址或虚拟地址,如上所述。”
这意味着您看到的地址是内存映射地址(总线地址),ARM核心自动将其转换为物理地址。
文档有点混乱,您可以参考raspberry pi 3上的这个源代码.dtd文件(linux/arch/arm/boot/dts/bcm283x.dtsi),它使用BCM2835芯片。
https://stackoverflow.com/questions/22337066
复制相似问题