memory - 对内存映射感到困惑

标签 memory arm low-level

我最近开始研究低级的东西并研究引导加载程序和操作系统等......

据我了解,至少对于 ARM 处理器,外围设备由引导加载程序初始化,然后映射到物理内存空间。从这里,代码可以通过简单地将值写入映射到外设寄存器的内存空间来访问外设。稍后如果芯片有一个 MMU,它可以用来进一步重新映射到虚拟内存空间。我说的对吗?

我不明白的是(假设我上面说的是正确的):

  • 如果外围设备尚未映射到地址空间,引导加载程序如何初始化它们?
  • 通过虚拟内存映射,有一些表可以告诉 MMU 在哪里映射什么。但是什么决定了外设在物理内存中的映射位置?

最佳答案

当设备启动时,MMU 会关闭,您通常会在 super 用户模式下运行。这意味着提供的任何地址都是物理地址。

每个 ARM SOC(片上系统)都有一个内存映射。地址与设备的对应关系取决于哪些物理数据和地址线连接到处理器的哪些部分。所有这些信息都可以在技术引用手册中找到。对于 OMAP4 芯片,可以找到 here .

有几种方法可以连接片外设备。一种是使用 GPMC。在这里,您需要在 GPMC 中指定您要在芯片上使用的地址。

然后打开 MMU 时,这些地址可能会根据 MMU 的编程方式而改变。通常直接访问硬件也只能在内核模式下使用。

关于memory - 对内存映射感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6648873/

相关文章:

for-loop - vhdl "for loop",步长不等于 1

c - linux上PPC64下一个进程可以有多少内存

c - 我不明白我是如何遇到段错误的

ios - iOS 8.1 iPad Air 2-图像加载内存错误

c - C 中类似 Haskell 的类型系统

floating-point - 是否存在无效的浮点状态/值?

Java 销毁变量

ios - 如何在 iOS 中使用 ARM 内在函数?

embedded - uboot-uart.bin 和 uboot.bin 之间的区别?

linux - 使用 GDB 生成核心转储文件时如何限制其大小