首先,我要说,我不是这个领域的专家,我的问题可能包含误解,在这种情况下,我会很高兴你纠正我,并增加资源,以便我可以了解更多的细节。
我试图弄清楚系统总线的方式,以及移动设备(如传感器芯片、wifi/BT SoC、触摸屏等)中的各种设备是如何出现的。由CPU (和其他MCU)寻址。
在PC世界中,我们有总线仲裁器将命令/数据路由到设备,并且,afaik,地址是硬连接在板上的(如果我错了,请纠正我)。然而,在移动世界中,我没有发现任何关于这类寻址的证据;我确实发现ARM已经将先进微控制器总线体系结构标准化了,但我不知道该标准是否适用于位于同一SoC (即Exynos、OMAP、Snap巨龙等)内的组件(cpu-核)。也可以影响外围接口。具体来说,我是在问哪些组件负责为外围设备和MMIO地址分配地址?
一个更基本的问题是,移动设备架构中是否存在总线管理,或者是否存在某种“星形”拓扑( CPU是中心)。
从这个问题中我得到的印象是,这些设备被视为平台设备,即直接连接到CPU的设备,而不是通过总线连接的设备。不过,我的问题是,操作系统如何知道如何解决这些问题?然后其他关于平台设备/驱动程序的线程、这和这让我感到困惑。
发布于 2015-01-21 16:41:13
ARM和x86之间的区别是PIO。在ARM上没有访问I/O设备的特殊指令。一切都是通过内存映射I/O完成的。
第二个区别是ARM (和RISC一般)有一个独立的负载/存储单元,这些单元与正常逻辑是分开的。
第三个不同之处是ARM同时授权了建筑和逻辑核心。第一个是苹果,三星等公司使用的,他们生产一个干净的内核版本。对于实际购买逻辑的第二组,ARM CPU将包含来自安巴家族的内容。
来自ARM的其他外围设备,如GIC (Cortex-A中断控制器)、NVIC (Cortex-M中断控制器)、L2控制器、UART等,都将带有AMBA类型的接口。第三方公司(ChipIdea、USB等)也可以为特定的ARM总线建立逻辑。
注:维基百科的AMBA记录了几种总线类型。
单个CPU/核心可能有一个、两个或多个到AXI总线的主连接。可能有多个核心连接到AXI总线上。内核的加载/存储和指令获取单元可以使用多个端口将请求分派给独立的从站。SOC供应商将平衡端口数量和预期内存带宽需求。GPU还经常连接到AXI总线以及DDR从机。
的确,没有100%的标准拓扑,特别是如果您考虑了所有未来的ARM设计。但是,典型的拓扑结构将包括顶级的AXI和一些AHB外设。一个或多个二级APB (总线)将提供对低速外围设备的访问。并不是每个SOC厂商都想花时间重新设计外设,而旧的AHB接口速度对于设备来说可能还算不错。
您的问题是标记嵌入式-linux。在大多数情况下,Linux只需要知道物理地址。有时,外围总线控制器可能需要配置。例如,可以将APB配置为允许或不允许用户模式。此配置可在启动时锁定。通常,Linux并不太关心总线结构。程序员可能已经编写了具有结构知识的驱动程序(比如IRAM是错误的,等等)。
不过,我的问题是,操作系统如何知道如何解决这些问题?
较老的Linux内核将这些定义放入机器文件中,并传递一个平台资源结构,包括中断号和寄存器银行的物理地址。在较新的Linux版本中,这些信息包含在Open或设备树文件中。
具体来说,我是在问哪些组件负责为外围设备和MMIO地址分配地址?
物理地址由SOC制造商设置。Linux平台支持将使用MMU将它们映射为不可缓存到某些未使用的范围。通常物理地址可能非常稀疏,因此虚拟重映射包更加密集。每一个都会引起TLB攻击(MMU缓存)。
下面是一个示例SOC总线结构,它使用连接了Cortex-M和Cortex-A的AXI .

PBRIDGE组件是APB桥,它以星型拓扑结构连接。正如其他人所建议的那样,您需要查看特定的SOC文档以了解具体情况。然而,如果你没有SOC,并且试图理解ARM,上面的一些信息将帮助你,不管你有什么SOC。
发布于 2015-01-21 14:48:07
( 1) ARM不生产芯片,而是制造IP,卖给制造芯片的芯片供应商。2)是的,amba/axi总线是从ARM到世界的接口。但这是在芯片上,所以它是由芯片供应商决定什么连接到它。在芯片供应商中,您可以找到标准或习惯,这些标准或习惯可能是,对于一个系列的部件,相同的外围设备可以在相同的地址(相同的uart外围设备、相同的spi外围设备、时钟树等)中找到。当然,有时在家庭中不同地址的同一边缘,有时也没有一致性。在英特尔x86世界中,英特尔制造了他们历史上制造过的处理器--许多外围设备--无论是单个部件,还是超级I/O部件,北桥和南桥,都在同一个封装中。Intels处理器的成功主要在于反向兼容性,因此您仍然可以在原来的ibm上访问相同地址的克隆uart。当您有不同的芯片供应商您根本不能这样做,arm不合并外设的大部分,所以让供应商就事情达成协议是不会发生的。这让人们疯狂--是的,linux一直处于arm的紧急状态,因为它很少在任何平台上工作。添加往往是特定于一个芯片或供应商或细微差别,不关心检查添加是在错误的地方或解决办法,或任何东西不适用于所有地方,不应适用于所有地方。皮质-ms已经迈出了一小步,在arm7tdmi之前,你可以自由地使用任何你想要的地址空间。大脑皮层-m已经将空间划分成一些主要的块以及一些内部地址(不仅仅是皮层-ms,在许多核心上是这样的)。但是,除了一个系统定时器和一个中断控制器,它仍然取决于芯片供应商。x86的反向兼容性习惯超越了英特尔,因此pcs机在主板厂商之间有很大的一致性(部分驱动因素是他们希望在系统上运行的软件,即windows)。一般来说,不管是arm还是mips,或者谁把东西放在哪里,软件只是简单地适应,所以嵌入式/电话软件的工作是由开发人员来选择合适的驱动程序和调整物理地址等等。
amba/axi只是wishbone或isa或pci、usb等总线标准,它定义了如何从arm与arm核心处理器接口,这基本上是在芯片上,芯片厂商然后从某个IP上添加或购买,将AMBA/AXI总线连接到pci或usb或dram或flash等,芯片上或off是他们的选择--这是他们的产品。除了一些大块之外,芯片供应商可以自由地定义地址空间,当然也可以自由地定义哪些外围设备和位置。他们不必使用与其他任何人相同的usb或dram。
手臂在中间吗?那么,在你的智能手机处理器,你倾向于有一个图形协处理器,那么你必须问谁拥有世界的arm,gpu,或其他人?在raspberry pi的例子中,它在某种程度上是这些口味的处理器之一,尽管现在更老、更慢,gpu似乎是世界的中心,而arm是gpu总线上的一个必须共享时间的边框,谁知道该总线的协议/体系结构是什么,arm当然是axi,但是整个芯片还是从arm到gpu侧的桥也切换到了其他总线协议呢?问题的关键是你的问题没有答案,没有规则,没有标准,有时手臂在中心,有时不是。到芯片和董事会的供应商那里。
对术语不感兴趣也许会有人回答,但我想说,在一个基本的sim之外,你不会只有一个外设(好吧,我会用这个术语来表示处理器访问的通用东西),它与amba/axi总线连接在一起。您需要一个第一级amba/axi接口,然后根据您的设计划分地址空间,然后使用amba/axi或您想要的任何总线协议(通常您适合购买或设计的IP的接口)。你,芯片供应商决定地址空间。你作为程序员,必须阅读芯片供应商的文档,或者是董事会供应商,为你想要交谈的每一件事找到物理地址空间,然后根据软件或构建系统的规则将这些知识编译到操作系统或应用程序中。
这并不是仅适用于基于arm的系统--您与mips和powerpc以及其他您可以以ip形式购买的内核有相同的问题,无论出于什么原因,arm一直占据着世界的主导地位(您拥有的每一个x86中或计算机外部都有许多arm处理器,与基于arm的处理器相比,x86处理器的容量非常低)。就像盖茨家家户户都有一台台式机一样,很久以前,ARM有一种“每天一次碰一次手”的东西来推动他们的产品,而现在大多数带有电源开关的东西,尤其是有电池的东西,在某个地方都有一只手臂。对于开发人员来说,这是一场噩梦,因为现在有那么多arm内核具有细微差别,而且每个芯片供应商和每个家庭成员有时都是不同的,因此作为一个开发人员,您只需要调整、以模块化的形式编写您的产品、混合和匹配模块、更改地址等等。例如,让一个像windows一样的二进制代码在任何地方运行,对基于arm的产品来说绝不是一个明智的目标。使模块可移植,并根据目标构建模块。
发布于 2015-01-21 16:26:57
每个SoC都将被设计成有自己的(可能可配置的)内存映射。您将需要阅读相关的技术参考手册,以获得确切的细节。
例子如下:
Raspeberry pi数据表 (pdf)
OMAP 5 TRM
https://stackoverflow.com/questions/28068525
复制相似问题