解释ARM(特别是移动)外设寻址和总线架构?

Bus*_*ush 3 embedded arm embedded-linux amba

我首先要说的是,我不是该领域的专家,我的问题可能包含误解,在这种情况下,如果你纠正我并附上资源,我会很高兴,所以我可以了解更多细节.

我试图弄清楚系统总线的方式以及移动设备中出现的各种设备(如传感器芯片,wifi/BT SoC,触摸屏等)是如何被CPU(以及其他设备)处理的微控制器).

在PC世界中,我们有总线仲裁器将命令/数据路由到设备,并且,afaik,地址在板上硬连线(如果我错了,请纠正我).但是,在移动世界中,我没有找到任何类型寻址的证据; 我确实发现ARM已经标准化了高级微控制器总线架构,但我不知道,该标准是否适用于位于同一SoC(即Exynos,OMAP,Snapdragon等)内的组件(cpu-cores).或者也影响外围接口.具体来说,我问的是哪个组件负责为外围设备和MMIO地址分配地址?

一个更基本的问题是,在移动设备架构中是否存在总线管理,或者是否存在某种"星形"拓扑(以CPU为中心).

这个问题我得到的印象是这些设备被视为平台设备,即直接连接到CPU而不是通过总线连接的设备.不过,我的问题是操作系统如何知道如何解决它们?然后其他线程,这个这个有关平台的设备/驱动程序让我糊涂..

art*_*ise 10

ARM和x86之间的区别是PIO.ARM上没有关于访问I/O设备的特殊指令.一切都是通过内存映射I/O完成的.

第二个区别是ARM(和RISC一般)有一个独立的加载/存储单元,它们与普通逻辑分开.

第三个区别是ARM同时授权架构和逻辑核心.第一种是苹果,三星等公司使用它们制作核心的洁净室版本.对于实际购买逻辑的第二组,ARM CPU将包含来自AMBA系列的东西.

ARM的其他外设,如GIC(Cortex-A中断控制器),NVIC(Cortex-M中断控制器),L2控制器,UART等都将配备AMBA型接口.第三方公司(ChipIdea USB等)也可以制作为特定ARM总线设置的逻辑.

注意维基百科的AMBA记录了几种总线类型.

  1. APB - 低速外设总线; 有点像南桥.
  2. AHB - 几个版本(较旧的北桥).
  3. AXI - 更新的多CPU(主)高速总线.示例NIC301.
  4. ACE - AXI扩展.

单个CPU /内核可以与AXI总线建立一个,两个或更多主连接.可能有多个内核连接到AXI总线.核心的加载/存储指令获取单元可以使用多个端口将请求分派给单独的从属.SOC供应商将平衡端口数量与预期的内存带宽需求.GPU通常还与DDR从设备一起连接到AXI总线.

确实没有100%标准拓扑; 特别是如果您考虑所有可能的未来ARM设计.但是,典型的拓扑结构将包括顶级AXI和一些AHB外设.一个或多个第二级APB(总线)将提供对低速外设的访问.并非每个SOC供应商都希望花时间重新设计外围设备,并且较旧的AHB接口速度可能对设备来说非常好.

您的问题标记为embedded-linux.在大多数情况下,Linux只需要知道物理地址.有时,外围BUS控制器可能需要配置.例如,APB可以被配置为允许或不允许用户模式.此配置可以在引导时锁定.通常,Linux并不直接关注总线结构.程序员可能已经编写了一个具有结构知识的驱动程序(如IRAM是紧张的等).

不过,我的问题是操作系统如何知道如何解决它们?

较旧的Linux内核将这些定义放在机器文件中并传递平台资源结构,包括中断号和寄存器库的物理地址.在较新的Linux版本中,此信息包含在Open Firmware设备树文件中.

具体来说,我问的是哪个组件负责为外围设备和MMIO地址分配地址?

物理地址由SOC制造商设置.Linux 平台支持将使用MMU将它们映射为不可缓存的某些未使用的范围.通常,物理地址可能非常稀疏,因此虚拟重映射包更密集.每个都会导致TLB命中(MMU缓存).


以下是使用AXI并连接Cortex-M和Cortex-A的SOC总线结构示例.

来自AN4947的Vybrid BUS  - 了解Vybrid Architecure

PBRIDGE组件是APB桥,它以星形拓扑连接.正如其他人所说,您需要查看特定的SOC文档以获取具体信息.但是,如果您没有SOC并且正在尝试理解ARM,那么无论您拥有什么SOC,上面的一些信息都会对您有所帮助.