Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly RaspberryPI/BCM2835内存布局 我一直在跟踪剑桥大学的“BakePI”课程,但在确定设备的正确内存地址时,我发现了一些问题。_Assembly_Arm_Raspberry Pi - Fatal编程技术网

Assembly RaspberryPI/BCM2835内存布局 我一直在跟踪剑桥大学的“BakePI”课程,但在确定设备的正确内存地址时,我发现了一些问题。

Assembly RaspberryPI/BCM2835内存布局 我一直在跟踪剑桥大学的“BakePI”课程,但在确定设备的正确内存地址时,我发现了一些问题。,assembly,arm,raspberry-pi,Assembly,Arm,Raspberry Pi,例如:在他们的课程中,他们声称系统计时器位于位置0x20003000,但在课程中,计时器位于位置0x7e003000 所有其他外围设备(GPIO控制器等)也是如此 现在,为什么会有差异?我如何才能将数据表中的地址“转换”为可用地址 多谢各位 这是CPU悬挂在GPU一侧而不是负责事物的结果-ARM内存映射与GPU的总线布局不同 根据数据表第1.2.3-1.2.4节: 物理地址的范围为0x20000000到0x20FFFFFF 外围设备。外围设备的总线地址设置为映射到 从0x7E000000开始的外

例如:在他们的课程中,他们声称系统计时器位于位置0x20003000,但在课程中,计时器位于位置0x7e003000

所有其他外围设备(GPIO控制器等)也是如此

现在,为什么会有差异?我如何才能将数据表中的地址“转换”为可用地址


多谢各位

这是CPU悬挂在GPU一侧而不是负责事物的结果-ARM内存映射与GPU的总线布局不同

根据数据表第1.2.3-1.2.4节:

物理地址的范围为0x20000000到0x20FFFFFF 外围设备。外围设备的总线地址设置为映射到 从0x7E000000开始的外围总线地址范围。因此 此处公布的总线地址为0x7ENNNNN的外围设备可在 物理地址0x20nnnnnn

[……]

本文档中指定的外围地址是总线地址。


您指向的数据表显示了gpu和arm的地址映射。是的,它有点神秘,完全令人困惑

本文档是从gpu的角度编写的,其中处理器地址空间中的外设基址从0x7E000000开始。arm和gpu共享相当多的内存和外设访问,但外设从0x20000000开始映射到arm的地址空间


基本上,在该文档中的任何位置都可以看到0x7Exxxxxx,用于从ARM编程的某些内容,并将其替换为0x20xxxxxx。就这么简单。

在我的理解中,BCM2835 ARM外围设备有一个大图,第1.2节的地址图解释得很好。ARM有它的ARM虚拟内存来管理他们的软件,无论我不知道什么,我们都不需要关心它。最重要的是总线地址是什么,在这里我们必须使用内核级设备驱动程序访问内核空间中的内存映射寄存器

它表示“通过ARM映射MMU映射到总线地址”和“本文档中指定的外设地址是总线地址。直接访问外设的软件必须将这些地址转换为物理或虚拟地址,如上所述……”

这意味着您看到的地址是内存映射地址(总线地址),ARM内核会自动将其转换为物理地址

文档有点混乱,您可以参考这个source.dtd文件(
")关于使用BCM2835芯片的raspberry pi 3

很好的解释!非常感谢!如果是这样,那么在当前进程虚拟地址空间中映射它们时需要使用什么“物理地址”呢?我想应该是ARM的,而不是GPU的,对吧?我的意思是Linux终究会在ARM上运行,对吗?@HighOnMeat我不确定我是否理解这个问题。地址空间不是通用的,它们与本地内存控制器/地址解码器有关。pi与gpu和arm两个处理器/系统共享其dram。这些处理器/系统有一个连接的地方。文档中的地图显示了如何工作。他们选择了基于gpu或arm的主地图考虑到主系统地址空间,然后你会看到ARM是如何进入的。ARM上的软件/操作系统将使用这个世界的武器视图。这个问题已经很老了,允许更多的RAM空间。后者的芯片从0x20变为另一个地址。因此,至少在pi3之前,映射到外围设备/I/O空间的地址空间更接近该四分之一的顶部,如0x3F,如果我记得很清楚的话,这是出于所有实际目的,你能得到的最接近2b00的顶部位表示较低的四分之一,然后下一位是使其成为该四分之一顶部的位。日志ic只允许arm看到它看到的视图,除非其中一些是可编程的,并在arm启动之前进行设置。因此linux或其他arm软件需要符合其世界视图中的地址空间。